Git 如何选择多个提交
我有两个分支。提交Git 如何选择多个提交,git,git-rebase,cherry-pick,Git,Git Rebase,Cherry Pick,我有两个分支。提交a是其中一个的头,而另一个在a之上有b、c、d、e和f。我想将c、d、e和f移动到第一个分支而不提交b。使用cherry pick很容易:将第一个分支cherry pick逐个签出c到f,然后将第二个分支重新设置到第一个分支上。但是有没有办法在一个命令中选择所有c-f 以下是场景的视觉描述(谢谢): 最简单的方法是使用on选项来rebase。假设当前在a处结束的分支称为mybranch,这就是您要将c-f移动到的分支 # checkout mybranch git checko
a
是其中一个的头,而另一个在a
之上有b
、c
、d
、e
和f
。我想将c
、d
、e
和f
移动到第一个分支而不提交b
。使用cherry pick很容易:将第一个分支cherry pick逐个签出c
到f
,然后将第二个分支重新设置到第一个分支上。但是有没有办法在一个命令中选择所有c
-f
以下是场景的视觉描述(谢谢):
最简单的方法是使用
on
选项来rebase
。假设当前在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 a b
Git1.7.2引入了樱桃选择一系列提交的功能。从:
git cherry pick
学会了选择一系列提交
(例如,cherry pick A..B
和cherry pick--stdin
),git revert也一样;但是,它们不支持更好的排序控制rebase[-i]
has
要从提交A
中选择所有提交以提交B
(其中A
早于B
),请运行:
如果要忽略A本身,请运行:
git cherry-pick A..B
(在评论中归功于damian、J.B.Rainsberger和sschaef)或要求的一艘班轮:
git rebase --onto a b f
您可以使用
git-rebase
和git-branch
的串行组合,将一组提交应用到另一个分支上。因为第一个命令实际上已经复制了提交。但是,在将分支名称添加到组的最顶端提交之前,更改不可见
请在新选项卡中打开图片
要以文本形式总结命令,请执行以下操作:
gitk--all&
git-rebase--a b f
头部
git分支选择
- 提交
是组的新根目标a
- 提交
是组第一次提交之前的提交(独占)b
- 提交
是组(包括)的最后一次提交f
git checkout功能和&git reset--hard b
从feature
分支中删除提交c
直到f
除了这个答案,我还写了一篇文章,描述了另一个场景中的命令,这应该有助于一般使用它。应用J.B.Rainsberger和sschaef的评论来具体回答这个问题。。。要在此示例中使用樱桃拾取范围,请执行以下操作:
git checkout a
git cherry-pick b..f
或
实际上,最简单的方法是:
merge\u base=$(git merge base branch-a branch-b)
git rebase ${SAVED_MERGE_BASE} -i
或者,如果只有几个新提交,则跳过步骤1,只需使用
git rebase HEAD^^^^^^^ -i
在第一步中,使用足够的^
移动到合并基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(以及您想要的任何其他行)如果您有选择性的修订要合并,例如A、b、C、D、E、F、G、H、I、J提交中的A、C、F、J,只需使用以下命令: git cherry挑选一个C F J
下面是一个脚本,它允许您通过告诉脚本cherry选择的源和目标分支以及提交的数量,在一行中选择多个提交: 要从分支中挑选到主分支(使用当前分支作为源): 要从您的6.19.x分支中挑选最新的5个提交到master:
./gcpl.sh -c 5 -s 6.19.x -t master
要从提交id一直拾取到分支尖端,可以使用:
git cherry pick commit\u id^..branch\u name
另一个值得一提的变体是,如果希望从分支提交最后一次n
提交,则~
语法可能很有用:
git cherry-pick some-branch~4..some-branch
在这种情况下,上面的命令将从名为
some branch
的分支中选取最后4个提交(尽管您也可以使用提交散列代替分支名称)谢谢!您还可以为完整答案添加git checkout secondbranch&&git rebase mybranch
。这个答案帮助我了解了这个场景中的提交是什么。并且:您也可以使用的重设基础的交互模式。谢谢你,查尔斯!这种方法的美妙之处在于,您可以使用--interactive
从序列中删除一些提交,或者在“cherry pick”之前对它们重新排序+1这是一个亲切的命令,有点让人费解,但效果非常好。你必须做出承诺,但你不想将其重新设定为参数之一(b
,在本例中),但这对我来说是有效的。在“cherry pick a..b”表单中,A应该比B早。如果顺序错误,命令将自动失败。如果您有git 1.7.1或更早版本,并且无法更新,您可以通过运行git cherry pick f~3
然后git cherry pick f~2
等快速按顺序选择它们。直到git cherry pick f
(按向上箭头可以获得上一个命令,这样我可以快速更改数字并运行它,在大多数控制台中应该是类似的)。知道这种语法也适用于分支名称可能会很好。git cherry pi
git rebase HEAD^^^^^^^ -i
pick 3139276 commit a
pick c1b421d commit b
pick 7204ee5 commit c
pick 6ae9419 commit d
pick 0152077 commit e
pick 2656623 commit f
./gcpl.sh -m
./gcpl.sh -c 5 -s 6.19.x -t master
git cherry-pick some-branch~4..some-branch