为什么对远程存储库进行强制推送是危险的?

时间:2015-10-20 21:42:03

标签: git

假设我做了一些更改,提交了它们,然后将我的提交推送到远程存储库。然后我决定忘记对其进行充分评论,或者拼写错误,我想进行软重置以编辑和重新提交我的更改。

将此强制推送到远程存储库是什么让它“危险”?

2 个答案:

答案 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,以保证您在有意识地忽略它之前已经在存储库中提取了提交...