git rebase,跳过合并提交

Grastveit

从...开始

    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  

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

jub0bs

简单的情况

如果您的回购状态为

  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(无需在此处处理交互式变基):

git checkout master
git cherry-pick <commit-ID-of-F1> <commit-ID-of-F2>

一般情况

纠正我,如果我错了,但我明白你的意思一般情况下,

masterhack(独占)和(独占)尖端之间的所有非合并提交,执行Cherry-pick 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标志以避免收集诸如C1C2--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]

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章