简单情况
如果您的代码库状态为
hack---F1----M1----F2 [feature]
/ /
C1-----C2----C3 [master]
而且你想要到达
hack---F1----M1----F2 [feature]
/ /
C1-----C2----C3----F1'----F2' [HEAD=master]
你应该使用git cherry-pick
,而不是git rebase -i
(这里没有必要使用交互式rebase):
git checkout master
git cherry-pick <commit-ID-of-F1> <commit-ID-of-F2>
一般情况
如果我理解得不对,请指出。我理解你所说的一般情况为:
在master
上,将hack
(不包括)和feature
的最新提交(包括)之间的所有非合并提交进行手动挑选。
接下来,我假设这确实是你的意思。
正如你在评论中指出的那样,上述方法随着需要手动挑选的提交数目增加而变得不太优雅:
hack---F1---F2--- .... --- F68--M1---F67---...---F99 [feature]
/ /
C1-------------C2---------------C3 [master]
不过,您可以使用git rev-list
命令自动生成感兴趣的修订版本列表,方法如下:
git rev-list --reverse --no-merges --first-parent <commit-ID-of-hack>..feature
编辑:你还需要使用--first-parent
标志来避免收集像C1
和C2
这样的提交,并使用--reverse
标志,以使提交按所需顺序被挑选出来。
您可以将该命令的输出传递给git cherry-pick
:
git checkout master
git cherry-pick `git rev-list --reverse --no-merges --first-parent <commit-ID-of-hack>..feature`
这将产生
hack---F1---F2--- .... --- F68--M1---F67---...---F99 [feature]
/ /
C1-------------C2---------------C3---F1'---F2'---...---F99' [HEAD=master]
git checkout master
,然后执行git cherry-pick F1
和git cherry-pick F2
。 - jub0bsmaster
分支上,挑选hack
(不包括)和feature
分支顶端(包括)之间的所有非合并提交? - jub0bs