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

Git 为什么对远程存储库进行强制推送是危险的?,git,Git,假设我做了一些更改,提交了它们,然后将提交推送到远程存储库。然后我决定我忘记对它进行适当的注释,或者拼写错误,我想做一个软重置来编辑和重新提交我的更改 是什么让强制将其推送到远程存储库变得“危险”呢?Git非常努力地不覆盖您的任何更改,因此在您的日常工作中,如果您试图推送到一个头部引用与本地头部引用不同的远程存储库,Git会对此大发雷霆 当您使用--force时,Git会将训练轮取下,并假设您知道自己在做什么,即使您不完全理解或理解您的行为的后果 为了说明您的示例,以下是您的远程存储库上的内容:

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

是什么让强制将其推送到远程存储库变得“危险”呢?

Git非常努力地不覆盖您的任何更改,因此在您的日常工作中,如果您试图推送到一个头部引用与本地头部引用不同的远程存储库,Git会对此大发雷霆

当您使用
--force
时,Git会将训练轮取下,并假设您知道自己在做什么,即使您不完全理解或理解您的行为的后果

为了说明您的示例,以下是您的远程存储库上的内容:

<-- [] <-- [] <-- [HEAD]
您的新HEAD引用的SHA与远程存储库中的不匹配,因此Git将拒绝推送,因为它认为您将丢失数据

但是,当您强制它时,Git信任您并将新的头作为规范引用通过此操作,对旧头提交的引用将丢失。

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

使用
--force
推送的主要风险之一是看不到其他人推送的提交会丢失


为了防止这种情况发生,最好的做法是永远不要使用
--force
,而是更喜欢
--force with lease
,这可以保证您在有意识地忽略提交之前已在存储库中获取提交

如果其他人只是拉取了存储库而没有对其进行任何更改,是否存在问题?
<-- [] <-- [] <-- [HEAD]
            \
             \<-- [(old HEAD)] 
<-- [] <-- [] <-- [HEAD]