我如何挤压两个不连续的提交?

我对git中的整个重新绑定function有点新鲜。 假设我做了以下提交:

A -> B -> C -> D 

之后,我意识到D包含一个依赖于A添加的新代码的修复,并且这些提交属于一起。 我如何压缩AD ,离开BC

你可以运行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议这是对提交AD中的更改的描述:

 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 提交AD不再在你的历史中,但没有消失。 你仍然可以在这个时候恢复它们,并且在一段时间内通过git rebase --hard Dgit rebase --hard会破坏所有的本地变化! )。

对于那些使用SourceTree的人 :

确保你还没有推送提交。

  1. 存储库>交互式资源库…
  2. 将D(新提交)拖到A(旧提交)的正上方,
  3. 确保提交D被突出显示
  4. 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