提交的重新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