我如何挤压两个不连续的提交?
我对git中的整个重新绑定function有点新鲜。 假设我做了以下提交:
A -> B -> C -> D
之后,我意识到D
包含一个依赖于A
添加的新代码的修复,并且这些提交属于一起。 我如何压缩A
& D
,离开B
& C
?
你可以运行git rebase --interactive
并在B之前重新sortingD,并将D压扁成A.
注意: 除非您知道后果,否则您 不应该更改以任何方式推送到其他回购的提交 。
git log --oneline -4
D commit_message_for_D C commit_message_for_C B commit_message_for_B A commit_message_for_A
git rebase --interactive
pick D commit_message_for_D pick C commit_message_for_C pick B commit_message_for_B pick A commit_message_for_A
inputi
(将VIM置于插入模式)
将列表更改为如下所示(您不必删除或包含提交消息)。 不要拼错squash
! :
pick C commit_message_for_C pick B commit_message_for_B pick A commit_message_for_A squash D
键入Esc然后键入ZZ
(保存并退出VIM)
# This is a combination of 2 commits. # The first commit's message is: commit_message_for_D # This is the 2nd commit message: commit_message_for_A
键入i
将文本更改为您希望新提交消息的样子。 我build议这是对提交A
和D
中的更改的描述:
new_commit_message_for_A_and_D
键入Esc然后ZZ
git log --oneline -4
E new_commit_message_for_A_and_D C commit_message_for_C B commit_message_for_B
git show E
(You should see a diff showing a combination of changes from A and D)
你现在已经创build了一个新的提交E
提交A
和D
不再在你的历史中,但没有消失。 你仍然可以在这个时候恢复它们,并且在一段时间内通过git rebase --hard D
( git rebase --hard
会破坏所有的本地变化! )。
对于那些使用SourceTree的人 :
确保你还没有推送提交。
- 存储库>交互式资源库…
- 将D(新提交)拖到A(旧提交)的正上方,
- 确保提交D被突出显示
-
Squash with previous
点击Squash with previous
$ git checkout master
$ git log –oneline
D C B A
$ git rebase –onto HEAD ^^^ HEAD ^
$ git log –oneline
D A