我有两个分支。提交a是一个的头,而另一个有b, c, d, e和f在a的顶部。我想移动c, d, e和f到第一个分支,而不提交b。使用樱桃采摘很容易:签出第一个分支樱桃采摘一个接一个c到f,并重新建立第二个分支到第一个。但是有没有办法在一个命令中选择所有的c-f ?
下面是场景的可视化描述(感谢JJD):
我有两个分支。提交a是一个的头,而另一个有b, c, d, e和f在a的顶部。我想移动c, d, e和f到第一个分支,而不提交b。使用樱桃采摘很容易:签出第一个分支樱桃采摘一个接一个c到f,并重新建立第二个分支到第一个。但是有没有办法在一个命令中选择所有的c-f ?
下面是场景的可视化描述(感谢JJD):
当前回答
实际上,最简单的方法是:
记录两个分支之间的merge-base: MERGE_BASE=$(git merge-base branch-a branch-b) 快进或将旧的分支重置到新的分支上 从步骤1的merge base开始,将生成的分支重新基于自身,并手动删除不需要的提交: ${SAVED_MERGE_BASE} -i 或者,如果只有几个新的提交,则跳过第1步,直接使用 git rebase HEAD^^^^^^^ -i 在第一步中,使用足够的^来移动合并基础。
你会在交互的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(和任何其他你想要的)
其他回答
实际上,最简单的方法是:
记录两个分支之间的merge-base: MERGE_BASE=$(git merge-base branch-a branch-b) 快进或将旧的分支重置到新的分支上 从步骤1的merge base开始,将生成的分支重新基于自身,并手动删除不需要的提交: ${SAVED_MERGE_BASE} -i 或者,如果只有几个新的提交,则跳过第1步,直接使用 git rebase HEAD^^^^^^^ -i 在第一步中,使用足够的^来移动合并基础。
你会在交互的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(和任何其他你想要的)
或者请求的一行代码:
git rebase --onto a b f
或者使用GitHub桌面应用程序,
您可以在源分支的历史选项卡中选择多个提交,然后右键单击以获得“Cherry-Pick Selected commits”选项。
选择多次提交:
签出到您想要选择提交的分支
使用以下命令:(通过部分哈希)
git cherry-pick 1e038f10 1e038f11 1e038f12 ...
Git 1.7.2引入了樱桃选择一系列提交的能力。发布说明如下:
Git学会了选择一个提交范围 (例如cherry-pick A..B和cherry-pick——stdin),所以git恢复;但是,这些不支持rebase [-i]拥有的更好的排序控件。
要从commit A挑选所有提交到commit B(其中A比B老),运行:
git cherry-pick A^..B
如果你想忽略A本身,运行:
git cherry-pick A..B
评论注释:
A应该比B老,或者A应该来自另一个分支。 在Windows上,它应该是A^^..B作为插入符需要转义,或者它应该是“A^..”B”(双引号)。 在zsh shell中,它应该是'A^..B'(单引号)作为插入符号是一个特殊字符。 有关说明,请参阅Gabriel Staples的回答。
(感谢damian、J. B. Rainsberger、sschaef、Neptilo、Pete和TMin在评论中。)