为什么向远程代码库进行强制推送是危险的?

6
假设我已经做了一些更改,提交了它们,然后将我的提交推送到远程代码库。然后我意识到我忘记了充分注释它,或者拼错了什么,我想软重置以编辑并重新提交我的更改。
强制推送这个修改到远程代码库为什么会“危险”?
2个回答

6
Git非常努力地尝试不覆盖您所做的任何更改,因此在您的日常工作中,如果您尝试将代码推送到一个与本地HEAD引用不同的远程存储库,Git会抛出异常。
当您使用--force参数时,Git会取消所有保护措施,并假定您知道自己在做什么,即使您并未完全理解或意识到自己行为的后果。
举个例子,这是您的远程存储库上有的内容:
<-- [] <-- [] <-- [HEAD]

这是你推送之后,但在发现错误之前的本地代码:

<-- [] <-- [] <-- [HEAD]

当你使用--amend来更正错误时,Git实际上有两个提交与先前的提交相关,但只有一个提交与规范的HEAD引用相关。
<-- [] <-- [] <-- [HEAD]
            \
             \<-- [(old HEAD)] 

你的新HEAD引用的SHA与远程仓库上的不匹配,因此Git会拒绝推送,因为它认为你将会丢失数据。

但是,当你使用force选项时,Git会信任你并将新的HEAD作为规范引用。通过这种方式,旧HEAD提交的引用将被丢失。

<-- [] <-- [] <-- [HEAD]

这是危险的,因为:

  • 如果使用--amend指令,你可能会丢失数据;但实际上很可能不会出现问题。

  • 任何以旧的HEAD引用为基础的人现在必须重新定义他们的工作,这会让他们感到很烦恼。

沟通可以减轻第二个问题,但在强制推送时需要更加谨慎,只有在确定你要推送的内容不会导致数据或信息丢失时才进行强制推送。


如果其他人只是拉取了代码库但没有对其进行任何更改,这会有问题吗? - jarno

3

使用--force推送的主要风险是可能看不到其他人推送的提交,从而导致提交丢失!

为了防止这种情况发生,良好的做法是永远不要使用--force,而是更喜欢--force-with-lease,它保证在有意忽略它们之前,在您的存储库中获取了分支的所有提交...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接