我有两个分支。提交a
是其中之一,而另一方b
,c
,d
,e
和f
位于{{1}之上1}}。我想将a
,c
,d
和e
移至第一个分支而不提交f
。使用樱桃选择很容易:结账第一个分支樱桃 - 逐个b
到c
并将第二个分支重新放在第一个分支上。但有没有办法在一个命令中挑选所有f
- c
?
以下是该方案的可视化描述(感谢JJD):
答案 0 :(得分:996)
Git 1.7.2引入了一系列提交的能力。来自release notes:
git cherry-pick“学会了选择一系列提交 (例如“cherry-pick A..B”和“cherry-pick --stdin”),“git 恢复“;这些不支持更好的测序控制”rebase [-i]“虽然有。”
包括重要评论(各自作者的学分)
注1:在“cherry-pick A..B”表单中,A应该早于B。如果它们的顺序错误,命令将无声地失败。 - 达米安
注2:此外,这不会挑选A,而是A之后的所有内容,包括B.- J. B. Rainsberger
注3:要包含A只是类型git cherry-pick A ^ .. B - sschaef
答案 1 :(得分:88)
最简单的方法是使用onto
的{{1}}选项。假设当前在rebase
结束的分支称为mybranch,这是您要将a
- c
移动到的分支。
f
答案 2 :(得分:74)
或要求的单行:
git rebase --onto a b f
答案 3 :(得分:58)
您可以使用git rebase
和git branch
的序列组合将一组提交应用到另一个分支。已经posted by wolfc,第一个命令实际上复制了提交。但是,在将分支名称添加到组的最顶层提交之前,更改是不可见的。
请在新标签页中打开图片...
以文本形式总结命令:
gitk --all &
。git rebase --onto a b f
。HEAD
。git branch selection
这应该澄清一些事情:
a
是该组的新根目标。b
是第一次提交组(独占)之前的提交。f
是该组的最后一次提交(包括)。之后,您可以使用git checkout feature && git reset --hard b
从c
分支中删除提交f
到feature
。
除了这个答案之外,我写了一个blog post来描述另一个场景中的命令,这些命令应该有助于普遍使用它。
答案 4 :(得分:35)
申请J. B. Rainsberger和sschaef的评论专门回答这个问题......在这个例子中使用樱桃挑选范围:
git checkout a
git cherry-pick b..f
或
git checkout a
git cherry-pick c^..f
答案 5 :(得分:18)
git rev-list --reverse b..f | xargs -n 1 git cherry-pick
答案 6 :(得分:13)
如果您有合并的选择性修订,例如A,B,C,D,E,F,G,H,I,J提交的A,C,F,J提交,只需使用以下命令:
git cherry-pick A C F J
答案 7 :(得分:3)
git format-patch --full-index --binary --stdout range... | git am -3
答案 8 :(得分:3)
实际上,最简单的方法是:
MERGE_BASE=$(git merge-base branch-a branch-b)
将生成的分支重新绑定到自身,从步骤1的合并基础开始,并手动删除不需要的提交:
git rebase ${SAVED_MERGE_BASE} -i
或者,如果只有少数新提交,请跳过步骤1,然后使用
git rebase HEAD^^^^^^^ -i
在第一步中,使用足够的^
移出合并库。
您将在交互式rebase中看到类似的内容:
pick 3139276 commit a
pick c1b421d commit b
pick 7204ee5 commit c
pick 6ae9419 commit d
pick 0152077 commit e
pick 2656623 commit f
然后删除第b行(以及您想要的任何其他行)
答案 9 :(得分:2)
另一个值得一提的变体是,如果您希望分支中的最后n
次提交,则~
语法会很有用:
git cherry-pick some-branch~4..some-branch
在这种情况下,上面的命令将从名为some-branch
的分支中选择最后4个提交(尽管您也可以使用提交哈希代替分支名称)
答案 10 :(得分:1)
要从提交ID到分支的尖端进行樱桃选择,可以使用:
git cherry-pick commit_id^..branch_name
答案 11 :(得分:0)
这是一个脚本,通过告诉脚本樱桃选择的源分支和目标分支以及提交次数,您就可以连续选择多个提交。
https://gist.github.com/nickboldt/99ac1dc4eb4c9ff003a1effef2eb2d81
要从分支中挑选到主节点(使用当前分支作为源):
./gcpl.sh -m
要从6.19.x分支中挑选最新的5个提交提交给master:
./gcpl.sh -c 5 -s 6.19.x -t master