如何挑选多个提交
我有两个分支。 提交a
是一个头,而另一个有b
, c
, d
, e
和f
在上面。 我想将c
, d
, e
和f
到第一个分支而没有提交b
。 使用樱桃捡起很容易:首先结账第一个分支樱桃逐一挑选c
到第二分支到第一个分支。 但是有什么办法可以在一个命令中挑选所有的c
– f
?
以下是该场景的视觉描述(感谢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,这就是你想把c
– f
移动到的分支。
# 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 rebase
和git branch
的串行组合将一组提交应用到另一个分支上。 正如wolfc发布的那样 ,第一条命令实际上复制了提交。 但是,只有将分支名称添加到组的最顶层提交时,才能看到更改。
请在新标签中打开图片
以文本forms总结这些命令:
- 打开gitk作为一个独立的进程使用命令:
gitk --all &
。 - 运行
git rebase --onto abf
。 - 在gitk中按F5 。 没有什么变化。 但是没有标记。
- 运行
git branch selection
- 在gitk中按F5 。 其提交的新分支出现。
这应该澄清的事情:
- 提交
a
是该组的新根目的地。 - 提交
b
是组的第一次提交之前的提交(独占)。 - 提交
f
是组的最后一次提交(包含)。
之后,你可以使用git checkout feature && git reset --hard b
从feature
分支中删除提交c
到f
。
除了这个答案之外,我还写了一篇博客文章 ,在另一个场景中描述这些命令,这将有助于普遍使用它。
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