为什么我必须在更改提交消息后强制推送?

Why must I force push after changing a commit message?

我阅读了 this 关于如何修改提交消息的内容。接受的答案是:

If you've already pushed your commit up to your remote branch, then you'll need to force push the commit with git push <remote> <branch> --force.

我的理解(也是来自已接受的答案)git push --force 将用本地分支覆盖远程分支上的所有数据。

为什么必须在更改提交消息后强制推送?如果我修改提交消息并尝试在没有 -f--force 的情况下推送会发生什么?

通过修改提交,您正在更改它们的 SHA1,这意味着本地和远程历史记录不再相同。

如果您想用(修改后的)本地历史记录替换远程历史记录,则需要 force push
如果你不这样做,Git 将拒绝推送,并要求你拉取(在这种情况下这没有帮助,因为你会合并相同的内容但不同的提交消息)

强制推送可能很危险,因为它 forces other collaborators to reset their own local history 到新的(强制推送的)。

如评论所述,--force-with-lease is safer(如果您正在更改的远程分支自上次拉取后本身已更改,这意味着其他人正在积极使用它并将其推回,那么强制推送将被拒绝)。
将其与 (您总是 rebase 尚未推送的内容结合使用),强制推送变得不再需要。

It's my understanding (also from the accepted answer) that git push --force will overwrite all data on the remote branch with the local one.

通过修改提交,您已经覆盖了您的 git 历史记录(通过更改提交的 SHA1)。 Amend 没问题,只要你还没有发布你的更改,但一旦你发布了,你真的不应该乱搞历史,因为如果有人已经得到你的更改,那么当他们再次尝试拉取时,它可能会失败。您不应该修改提交,而应该使用更改进行新提交。

What happens if I amend a commit message and try to push without -f or --force?

Git 将拒绝用您的分支更新远程分支(已修改 public 提交),因为您的分支的头部提交不是您当前分支的头部提交的直接后代正在推动。

如果不是这种情况,那么两个人几乎同时推送到同一个存储库将不知道有一个新的提交同时进入,最后推送的人将失去工作以前的推手,他们都没有意识到这一点。

Why is force-pushing after changing a commit message necessary?

正如我上面提到的,git 将不允许推送到远程分支。您可以阅读此 question。这个问题有很多可能的解决方法。