修改推送的提交消息

时间:2013-06-18 19:04:24

标签: git push commit-message amend

我刚推了一个提交,然后意识到我需要更改提交消息。

所以在我当地的回购中我做了:

git commit --amend -m "New commit message"

但是当我试图推动这个时,我收到了很多错误信息

Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Merge the remote changes (e.g. 'git pull') and try again

这是修改我的信息的错误方法吗?最后,我最终不得不重新设置所有的回购,然后再次使用新的消息进行提交。

所以我的问题是,修改已经被推送的东西的提交消息的正确方法是什么?

2 个答案:

答案 0 :(得分:3)

简短回答:没有正确的方法。

git commit --amend做的是用相似但改变的提交“替换”先前的提交。您还没有真正改变原始提交。它仍然存在,但没有任何东西引用它,它最终将被垃圾收集,除非有东西开始引用它。

在本地完成时这是透明的。但是当你推动提交时,它实际上已经太晚了。您已经与其他可能已将其提取并基于该提交的工作共享提交。您无法使用其他提交替换该提交。

假设您提交了一个提交A(在提交B之后):

B - A    <- master

然后你改变主意并修改A,这实际上会创建一个新的提交A'。当前分支将指向此新提交。原始提交A仍然存在,但没有分支指向它

B - A
  \ 
    A'  <- master

如果你第一次推A

local                            remote
B - A   <-master                 B - A    <- origin/master

然后修改,你将不被允许进行正常推送,因为那次推送不会是快进合并

local                            remote
B - A                            B - A    <- origin/master
  \ 
    A'  <- master

加剧问题:其他人可能已经使用过您的提交

local                            remote
B - A                            B - A - C   <- origin/master
  \ 
    A'  <- master

您可以进行修改,然后强行推动git push -f。但这会给其他基于原始提交工作的开发人员带来问题。这与rebase相同(a commit --amend有点像迷你rebase)。有关详细说明,请参阅"The Perils of Rebasing" section of the Git Pro book

local                            remote
B - A                            B - A - C
  \                                \
    A'  <- master                    A'   <- origin/master

答案 1 :(得分:0)

您可以执行git push --force,但它可能会破坏您的存储库。由于一个或另一个原因,Git哲学反对改变历史。