Answers:
Git 1.7.2引入了选择一系列提交的功能。从发行说明中:
git cherry-pick
学会了选择一系列提交(例如cherry-pick A..B
和cherry-pick --stdin
),也是如此git revert
;但是,这些不支持更好的顺序控制rebase [-i]
。
要选择从提交A
到提交B
(A
早于B
)的所有提交,请运行:
git cherry-pick A^..B
如果要忽略 A本身,请运行:
git cherry-pick A..B
(评论中的信由达米安,JB Rainsberger和sschaef提供)
git cherry-pick A^..B
git cherry-pick f~3
then git cherry-pick f~2
等快速按顺序挑选它们,直到git cherry-pick f
(按向上箭头获取上一个命令,以便我可以快速更改数字并运行它,在大多数控制台中应该相似)。
git cherry-pick master..somebranch
将在master分支上选择某个分支上的所有提交(假设已经基于master提交),并将它们应用于当前分支。
最简单的方法是onto
选择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
git checkout secondbranch && git rebase mybranch
答案吗
rebase
的交互模式。谢谢@查尔斯!
--interactive
从序列中删除某些提交,或者在“樱桃挑选”之前对其重新排序。+1
b
在本例中),但是这是很适合我。
或要求的单线:
git rebase --onto a b f
您可以使用的串联组合git rebase
,并git branch
申请一集团承诺的到另一个分支。正如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
除了这个答案之外,我还写了一篇博客文章,描述了另一种情况下的命令,这些情况应该有助于普遍使用它。
git rebase --onto a b mybranch
和btw- 这些漂亮的git图片是哪个程序?
要应用JB Rainsberger和sschaef的评论来专门回答这个问题,请执行以下操作:在此示例中使用cherry-pick范围:
git checkout a
git cherry-pick b..f
要么
git checkout a
git cherry-pick c^..f
git 2.7.0.windows.1
并注意到,当我尝试挑选承诺范围时,一切都很好,但是git并没有告诉您必须git cherry-pick --continue | --abort | --quit
尝试做的任何事情,然后再尝试再次进行承诺/选择。因此,如果您选择承诺范围,则git cherry-pick --continue
每次准备就绪(解决冲突等问题)时,都需要使用给定范围内的承诺来运行。
^
的C之后实际上意味着即b在这种情况下“C之前提交”。这就是为什么c^..f
是的同义词b..f
。尝试做一下git log c^..f
,您应该会看到c到f的提交,与您所做的完全相同git log b..f
git rev-list --reverse b..f | xargs -n 1 git cherry-pick
git cherry-pick {hash of c}; git cherry-pick {hash of d}; ...
要将提交ID从分支的顶端挑出来,可以使用:
git cherry-pick commit_id^..branch_name
另一个值得一提的变体是,如果您希望n
分支中的最后一次提交,则~
语法可能会很有用:
git cherry-pick some-branch~4..some-branch
在这种情况下,上述命令将从分支中选择最后4次提交some-branch
(尽管您也可以使用提交哈希代替分支名称)
实际上,最简单的方法是:
MERGE_BASE=$(git merge-base branch-a branch-b)
从第1步的合并基础开始,将结果分支重新定位到自身上,并手动删除不需要的提交:
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行(以及您需要的任何其他行)
git format-patch --full-index --binary --stdout range... | git am -3
这是一个脚本,您可以通过简单地告诉脚本樱桃选择的源分支和目标分支以及提交数量,来连续挑选多个提交:
https://gist.github.com/nickboldt/99ac1dc4eb4c9ff003a1effef2eb2d81
要将分支从分支挑选到主分支(使用当前分支作为源):
./gcpl.sh -m
要从6.19.x分支中挑选最新的5个提交提交给master:
./gcpl.sh -c 5 -s 6.19.x -t master
b
以此为基础f
,但这与挑选樱桃无关。)