如何樱桃挑选多个提交

问题描述 投票:700回答:11

我有两个分支。承诺a是一个头,而另一个在b顶部有cdefa。我想将cdef移动到第一个分支而没有提交b。使用樱桃挑选很容易:结账第一个分支樱桃 - 一个接一个cf和第二个分支到第一个。但有没有办法在一个命令中挑选所有c-f

以下是该场景的直观描述(感谢JJD):

git git-rebase cherry-pick
11个回答
1052
投票

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


2
投票

要从提交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


0
投票

这是一个脚本,只需告诉脚本樱桃选择的源和目标分支以及提交的数量,就可以连续选择多个提交:

git cherry-pick commit_id^..branch_name

从您的分支到主要的挑选(使用当前分支作为源):

https://gist.github.com/nickboldt/99ac1dc4eb4c9ff003a1effef2eb2d81

要挑选从6.19.x分支到掌握的最新5次提交:

./gcpl.sh -m

89
投票

最简单的方法是使用release notesonto选项。假设当前在rebase结束的分支称为mybranch,这是你要将a-c移动到的分支。

f

76
投票

或者要求的单行:

# 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

59
投票

您可以使用git rebase --onto a b f git rebase的串行组合将一组提交应用到另一个分支。已经是git branch,第一个命令实际上复制了提交。但是,在将分支名称添加到组的最顶层提交之前,更改不可见。

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

以文本形式总结命令:

  1. 使用以下命令打开gitk作为独立进程:posted by wolfc
  2. 运行gitk --all &
  3. 在gitk中按F5。没有什么变化。但没有标记git rebase --onto a b f
  4. 运行HEAD
  5. 在gitk中按F5。出现提交的新分支。

这应该澄清一些事情:

  • 提交git branch selection是该组的新根目的地。
  • 提交a是在第一次提交组(独占)之前的提交。
  • 提交b是该组的最后一次提交(包括在内)。

之后,您可以使用fgit checkout feature && git reset --hard b分支删除提交c直到f

除了这个答案,我写了一个feature,它描述了另一个场景中的命令,这些命令应该有助于一般使用它。


36
投票

应用J. B. Rainsberger和sschaef的评论专门回答这个问题......在这个例子中使用樱桃挑选范围:

blog post

要么

git checkout a
git cherry-pick b..f

18
投票
git checkout a
git cherry-pick c^..f

17
投票

如果您有合并的选择性修订,比如说A,B,C,D,E,F,G,H,I,J提交的A,C,F,J提交,只需使用以下命令:

git cherry-pick A C F J


3
投票
git rev-list --reverse b..f | xargs -n 1 git cherry-pick

3
投票

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

  1. 记录两个分支之间的合并基础:git format-patch --full-index --binary --stdout range... | git am -3
  2. 快进或将旧分支重新绑定到较新的分支上
  3. 将生成的分支重新绑定到自身,从步骤1的合并基础开始,并手动删除不需要的提交: MERGE_BASE=$(git merge-base branch-a branch-b) 或者,如果只有少数新提交,请跳过步骤1,然后使用 git rebase ${SAVED_MERGE_BASE} -i 在第一步中,使用足够的git rebase HEAD^^^^^^^ -i 移过合并基地。

您将在交互式rebase中看到类似的内容:

^

然后删除行b(和你想要的任何其他行)

© www.soinside.com 2019 - 2024. All rights reserved.