提交的重新sorting

我目前正在一个分支上工作,想要一些提交合并到其他分支:

abcdefg (branchA) / --oxxxxxxxxxx (master) \ xxxxx (branchB) 

(字母表示提交,而“x”是不相关的提交。)

但是我注意到集中一些提交是一个好主意。 我想“连接”提交a,d,e和g到一个补丁,并提交给主。 提交b和f应该作为一个提交给branchB。 有没有一个好的方法来实现它?

你正在寻找的命令是git rebase ,特别是-i/--interactive选项。

我假设你想要在分支A上留下提交c,并且确实意味着你要将其他提交移动到其他分支,而不是合并,因为合并是直接的。 让我们开始操纵分支A.

 git rebase -i <SHA1 of commit a>^ branchA 

^表示前面的提交,所以这个命令表示使用“a”之前的提交重新分支分支A. Git会给你提供这个范围内的提交列表。 对它们重新sorting并告诉git压缩适当的:

 pick c ... pick a ... squash d ... squash e ... squash g ... pick b squash f 

现在的历史应该是这样的:

  c - [a+d+e+g] - [b+f] (branchA) / --oxxxxxxxxxx (master) 

现在,让我们抓住branchB的新压扁的提交b + f。

 git checkout branchB git cherry-pick branchA # cherry-pick one commit, the tip of branchA 

对于主+ d + e + g也是一样的:

 git checkout master git cherry-pick branchA^ 

最后,更新branchA,使其指向c:

 git branch -f branchA branchA^^ 

我们现在应该有:

  c (branch A) - [a+d+e+g] - [b+f] (dangling commits) / --oxxxxxxxxxx-[a+d+e+g] (master) \ xxxxx-[b+f] (branchB) 

请注意,如果您有多个提交您想在分支之间移动,则可以再次使用rebase(非交互式):

 # create a temporary branch git branch fromAtoB branchA # move branchA back two commits git branch -f branchA branchA~2 # rebase those two commits onto branchB git rebase --onto branchB branchA fromAtoB # merge (fast-forward) these into branchB git checkout branchB git merge fromAtoB # clean up git branch -d fromAtoB 

最后,一个免责声明:很可能重新排列提交的方式,使一些不再适用干净。 这可能是因为您select了错误的顺序(在提交补丁之前提交补丁)。 在这种情况下,你会想中止rebase( git rebase --abort )。 否则,你将不得不智能地解决冲突(就像你合并冲突一样),添加修复,然后运行git rebase --continue继续前进。 冲突发生时打印的错误信息也提供了这些说明。

git rebase是你想要的。 查看–interactive选项。

git rebase --interactive

链接:

如果你想重新sorting只有最后两个提交 ,你可以这个git reorder别名: https : //stackoverflow.com/a/33388211/338581