我有两个分支。承诺a
是一个头,而另一个在b
顶部有c
,d
,e
,f
和a
。我想将c
,d
,e
和f
移动到第一个分支而没有提交b
。使用樱桃挑选很容易:结账第一个分支樱桃 - 一个接一个c
到f
和第二个分支到第一个。但有没有办法在一个命令中挑选所有c
-f
?
以下是该场景的直观描述(感谢JJD):
Git 1.7.2引入了挑选一系列提交的能力。来自qazxsw poi:
git cherry-pick“学会了选择一系列提交(例如”cherry-pick A..B“和”cherry-pick --stdin“),”git revert“也是如此;这些不支持更好的排序控制”但是,rebase [-i]“有。
包括重要评论(各自作者的学分)
注1:在“cherry-pick A..B”形式中,A应该早于B。如果它们的顺序错误,命令将无声地失败。 - 达米安
注2:此外,这不会挑选A,而是A之后的所有内容,包括B. - J. B. Rainsberger
注3:要包括一个只是类型git cherry-pick A ^ .. B - sschaef
要从提交ID到分支的尖端进行挑选,您可以使用:
pick 3139276 commit a
pick c1b421d commit b
pick 7204ee5 commit c
pick 6ae9419 commit d
pick 0152077 commit e
pick 2656623 commit f
这是一个脚本,只需告诉脚本樱桃选择的源和目标分支以及提交的数量,就可以连续选择多个提交:
git cherry-pick commit_id^..branch_name
从您的分支到主要的挑选(使用当前分支作为源):
https://gist.github.com/nickboldt/99ac1dc4eb4c9ff003a1effef2eb2d81
要挑选从6.19.x分支到掌握的最新5次提交:
./gcpl.sh -m
最简单的方法是使用release notes的onto
选项。假设当前在rebase
结束的分支称为mybranch,这是你要将a
-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 a b
您可以使用git rebase --onto a b f
和git rebase
的串行组合将一组提交应用到另一个分支。已经是git branch
,第一个命令实际上复制了提交。但是,在将分支名称添加到组的最顶层提交之前,更改不可见。
请在新标签页中打开图片...
以文本形式总结命令:
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
,它描述了另一个场景中的命令,这些命令应该有助于一般使用它。
应用J. B. Rainsberger和sschaef的评论专门回答这个问题......在这个例子中使用樱桃挑选范围:
blog post
要么
git checkout a
git cherry-pick b..f
git checkout a
git cherry-pick c^..f
如果您有合并的选择性修订,比如说A,B,C,D,E,F,G,H,I,J提交的A,C,F,J提交,只需使用以下命令:
git cherry-pick A C F J
git rev-list --reverse b..f | xargs -n 1 git cherry-pick
实际上,最简单的方法可能是:
git format-patch --full-index --binary --stdout range... | git am -3
MERGE_BASE=$(git merge-base branch-a branch-b)
或者,如果只有少数新提交,请跳过步骤1,然后使用
git rebase ${SAVED_MERGE_BASE} -i
在第一步中,使用足够的git rebase HEAD^^^^^^^ -i
移过合并基地。您将在交互式rebase中看到类似的内容:
^
然后删除行b(和你想要的任何其他行)