如何樱桃挑选多个提交

时间:2009-11-04 00:07:04

标签: git git-rebase cherry-pick

我有两个分支。提交a是其中之一,而另一方bcdef位于{{1}之上1}}。我想将acde移至第一个分支而不提交f。使用樱桃选择很容易:结账第一个分支樱桃 - 逐个bc并将第二个分支重新放在第一个分支上。但有没有办法在一个命令中挑选所有f - c

以下是该方案的可视化描述(感谢JJD):

enter image description here

12 个答案:

答案 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 rebasegit branch的序列组合将一组提交应用到另一个分支。已经posted by wolfc,第一个命令实际上复制了提交。但是,在将分支名称添加到组的最顶层提交之前,更改是不可见的。

请在新标签页中打开图片...

Workflow

以文本形式总结命令:

  1. 使用以下命令打开 gitk 作为独立进程:gitk --all &
  2. 运行git rebase --onto a b f
  3. gitk 中按 F5 。没有什么变化。但是没有标记HEAD
  4. 运行git branch selection
  5. gitk 中按 F5 。出现提交的新分支。
  6. 这应该澄清一些事情:

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

    之后,您可以使用git checkout feature && git reset --hard bc分支中删除提交ffeature

    除了这个答案之外,我写了一个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)

实际上,最简单的方法是:

  1. 记录两个分支之间的合并基础:MERGE_BASE=$(git merge-base branch-a branch-b)
  2. 快速转发或将较旧的分支重新绑定到较新的分支
  3. 将生成的分支重新绑定到自身,从步骤1的合并基础开始,并手动删除不需要的提交:

    git rebase ${SAVED_MERGE_BASE} -i
    

    或者,如果只有少数新提交,请跳过步骤1,然后使用

    git rebase HEAD^^^^^^^ -i
    

    在第一步中,使用足够的^移出合并库。

  4. 您将在交互式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
相关问题