简短的回答:没有正确的方法。
所做的是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