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

时间:2016-12-06 19:14:16

标签: git push git-push

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

  

如果您已经将提交推送到远程分支,那么您需要强制使用git git push <remote> <branch> --force推送提交。

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

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

2 个答案:

答案 0 :(得分:10)

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

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

对于新的(强制推动的)强制推动可能是危险的forces other collaborators to reset their own local history

如评论所述,--force-with-lease is safer(如果您正在更改的远程分支自上次拉动后自行更改,意味着其他人正在积极使用它并将其推回,则强制推送被拒绝)。 将它与sensible pull policy(你总是 rebase 你尚未推送的东西)结合起来,强迫推动变得不那么需要了。

答案 1 :(得分:0)

  

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

通过修改提交,您已经覆盖了您的git历史记录(通过更改提交&#SHA; SHA1)。只要你没有发布你的更改,Amend就可以了,但是一旦你做了,你就不应该在历史上徘徊,因为如果有人已经得到你的改变,那么当他们试着再拉,可能会失败。您应该只使用更改进行新的提交,而不是修改提交。

  

如果我修改提交消息并尝试不使用-f或--force?

,会发生什么?

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

如果情况并非如此,那么两个人几乎同时推到同一个存储库就不会知道同时有新的提交进入,推送最后一个会丢失前一个推送器的工作没有他们意识到这一点。

  

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

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