如何挑选多个提交

我有两个分支。 提交a是一个头,而另一个有bcdef在上面。 我想将cdef到第一个分支而没有提交b 。 使用樱桃捡起很容易:首先结账第一个分支樱桃逐一挑选c到第二分支到第一个分支。 但是有什么办法可以在一个命令中挑选所有的cf

以下是该场景的视觉描述(感谢JJD ):

在这里输入图像描述

Git 1.7.2引入了挑选一系列提交的能力。 从发行说明 :

git cherry-pick“学会select一系列的提交(例如”cherry-pick A..B“和”cherry pick -stdin“),”git revert“也是如此,这些都不支持更好的顺序控制” rebase [-i]“,虽然。


包括重要的评论(学分给各自的作者)

注意1:在“樱桃selectA..B”forms,A应该比B更老。如果他们是错误的命令命令将默默地失败。 – 达米安

注2:此外,这不会挑选A,而是A之后的所有东西,包括B。 – JB Rainsberger

注3:包括一个只是typesgit樱桃采摘A ^ .. B – sschaef

最简单的方法就是使用转换选项。 假设当前在a处结束的分支叫做mybranch,这就是你想把cf移动到的分支。

 # checkout mybranch git checkout mybranch # reset it to f (currently includes a) git reset --hard f # rebase every commit after b and transplant it onto a git rebase --onto ab 

或者请求一行:

 git rebase --onto abf 

您可以使用git rebasegit branch的串行组合将一组提交应用到另一个分支上。 正如wolfc发布的那样 ,第一条命令实际上复制了提交。 但是,只有将分支名称添加到组的最顶层提交时,才能看到更改。

请在新标签中打开图片

工作流程

以文本forms总结这些命令:

  1. 打开gitk作为一个独立的进程使用命令: gitk --all &
  2. 运行git rebase --onto abf
  3. gitk中F5 。 没有什么变化。 但是没有标记。
  4. 运行git branch selection
  5. gitk中F5 。 其提交的新分支出现。

这应该澄清的事情:

  • 提交a是该组的新根目的地。
  • 提交b是组的第一次提交之前的提交(独占)。
  • 提交f是组的最后一次提交(包含)。

之后,你可以使用git checkout feature && git reset --hard bfeature分支中删除提交cf

除了这个答案之外,我还写了一篇博客文章 ,在另一个场景中描述这些命令,这将有助于普遍使用它。

 git rev-list --reverse b..f | xargs -n 1 git cherry-pick 

要应用JB Rainsberger和sschaef的评论来专门回答这个问题……在这个例子中使用樱桃挑选范围:

 git checkout a git cherry-pick b..f 

要么

 git checkout a git cherry-pick c^..f 
 git format-patch --full-index --binary --stdout range... | git am -3