我有两个分支。提交a是一个的头,而另一个有b, c, d, e和f在a的顶部。我想移动c, d, e和f到第一个分支,而不提交b。使用樱桃采摘很容易:签出第一个分支樱桃采摘一个接一个c到f,并重新建立第二个分支到第一个。但是有没有办法在一个命令中选择所有的c-f ?

下面是场景的可视化描述(感谢JJD):


当前回答

另一个值得一提的变体是,如果你想要一个分支的最后n次提交,~语法可以很有用:

git cherry-pick some-branch~4..some-branch

在这种情况下,上面的命令将从一个名为some-branch的分支中选择最后4次提交(尽管您也可以使用提交散列来代替分支名称)

其他回答

最简单的方法是使用on选项来调整基数。假设电流在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

如果你有选择性的修订要合并,比如从A,B,C,D,E,F,G,H,I,J提交A, C, F, J,简单地使用下面的命令:

git cherry-pick A C F J

另一个值得一提的变体是,如果你想要一个分支的最后n次提交,~语法可以很有用:

git cherry-pick some-branch~4..some-branch

在这种情况下,上面的命令将从一个名为some-branch的分支中选择最后4次提交(尽管您也可以使用提交散列来代替分支名称)

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

记录两个分支之间的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(和任何其他你想要的)

这里有一个脚本,允许你在一行中选择多个提交,只需告诉脚本哪个源和目标分支的樱桃选择和提交的数量:

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

从你的分支中选择master(使用当前分支作为源):

./gcpl.sh -m

从6.19中挑选最新的5个提交。X科要掌握:

./gcpl.sh -c 5 -s 6.19.x -t master