假设我做了一些更改,提交了它们,然后将我的提交推送到远程存储库。然后我决定忘记对其进行充分评论,或者拼写错误,我想进行软重置以编辑和重新提交我的更改。
将此强制推送到远程存储库是什么让它“危险”?
答案 0 :(得分:4)
Git尝试非常难以不覆盖您的任何更改,因此在您的日常例程中,如果您尝试推送到其HEAD引用与您的本地HEAD引用不同的远程存储库,Git会对它有所了解。
当您使用--force
时,即使您不完全理解或欣赏行动的后果,Git也会关闭训练轮,并假设您知道自己在做什么。 / p>
为了说明您的示例,这是您的远程存储库上的内容:
<-- [] <-- [] <-- [HEAD]
...这是你在推动之后的当地人,但在你发现错误之前:
<-- [] <-- [] <-- [HEAD]
当你使用--amend
纠正错误时,Git实际上有两个提交引用前一个提交,但只有一个引用了规范的HEAD引用。
<-- [] <-- [] <-- [HEAD]
\
\<-- [(old HEAD)]
新HEAD引用的SHA与远程存储库中的内容不匹配,因此Git会拒绝推送,因为它认为您将丢失数据。
当你强制它时,Git会信任你并将新的HEAD作为规范参考。 通过此操作,对旧HEAD提交的引用将丢失。
<-- [] <-- [] <-- [HEAD]
这很危险,因为:
您可能丢失了数据;如果它不是一个简单的--amend
,那么你可能没有,但它仍然可能
其他任何以老HEAD参考为基础的工作现在都要改变他们的工作,这会导致很多不适当的胃灼热。
通信可以缓解第二部分,但第一部分在强制推动时需要更加谨慎。如果您绝对确定您所推动的内容不会导致数据或信息丢失,那么只能强行推进。
答案 1 :(得分:1)
使用--force
推送的主要风险之一是看不到其他人丢失的提交!
为了防止出现这种情况,好的做法是永远不要使用--force
,而是要优先--force-with-lease
,以保证您在有意识地忽略它之前已经在存储库中提取了提交...