Git rebase,跳过merge-commits

时间:2014-09-17 08:52:36

标签: git rebase

开始
    hack---F1----M1----F2  (feature)
   /            /
  C1-----C2----C3  (master)

我想以

结束
    hack---F1----M1----F2  (feature)
   /            /
  C1-----C2----C3---F1'---F2'  (master)

到目前为止,我所拥有的最好的是

git checkout feature  
git checkout -b temp  
git rebase -i --onto master hack temp
   * Big drawback: manually remove the merged-in C2 and C3 from list of commits *
git checkout master  
git merge temp  
git branch -d temp  

我希望有人能回答,即使这是一个可疑的工作流程。

2 个答案:

答案 0 :(得分:12)

简单案例

如果你的回购状态是

  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>

一般情况

如果我错了,请纠正我,但我明白你的意思是general case

  

master之上,在hack(不包括)和feature(包括)的提示之间进行所有非合并提交。

在下文中,我假设这确实是你的意思。

正如您在评论中正确指出的那样,上面概述的方法不能非常优雅地扩展,因为手动挑选的提交数量会增加:

  hack---F1---F2--- .... --- F68--M1---F67---...---F99 [feature]
 /                               /
C1-------------C2---------------C3 [master]

但是,您可以使用

git rev-list自动生成感兴趣的修订列表
git rev-list --no-merges --first-parent <commit-ID-of-hack>..feature

编辑:您还需要--first-parent标志,以避免收集C1C2以及--reverse标记等提交内容,以便在提交中获取提交内容。期望的顺序。

您可以将该命令的输出传递给git cherry-pick

git checkout master
git cherry-pick `git rev-list --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]

答案 1 :(得分:0)

看看您的原始工作流程,您似乎想忽略合并,唯一的问题是使用-i进行交互式基础,以保留合并。

git checkout -b temp  
git rebase --onto master hack temp
   * Big drawback is gone!
git checkout master  
git merge temp  
git branch -d temp

应该完全按照您想要的方式工作。不过,这可能无法完全解决您的“一般情况”。