5

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

所以在我的本地仓库中,我做了:

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

这是修改我的信息的错误方法吗?最后,我不得不重置我所有的存储库,然后用一条新消息再次提交。

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

4

2 回答 2

6

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

所做的是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

你可以做你的修改,然后做一个 force push git push -f。但这会给其他基于原始提交工作的开发人员带来问题。这与变基的问题相同(acommit --amend有点像迷你变基)。请参阅Git Pro 书籍的“变基的危险”部分以获得进一步的解释。

local                            remote
B - A                            B - A - C
  \                                \
    A'  <- master                    A'   <- origin/master
于 2013-06-18T19:08:37.957 回答
1

你可以这样做git push --force,但它可能会破坏你的存储库。Git 哲学反对出于某种原因改变历史。

于 2013-06-18T19:09:44.670 回答