我有两个分支。提交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):
当前回答
要从一个提交id中选取到分支的顶端,你可以使用:
git cherry-pick commit_id^..branch_name
其他回答
除了提交之外,还可以通过管道从stdin输入sha列表。
git rev-list --reverse ..main -- path/ | git cherry-pick --stdin
Rev-list基本上是git-log的管道命令(“丑陋”但快速的表亲) 注意——反向是需要的。
您可以通过这种方式执行更高级的操作,而不仅仅是提交范围。
或者请求的一行代码:
git rebase --onto a b f
最简单的方法是使用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
另一个值得一提的变体是,如果你想要一个分支的最后n次提交,~语法可以很有用:
git cherry-pick some-branch~4..some-branch
在这种情况下,上面的命令将从一个名为some-branch的分支中选择最后4次提交(尽管您也可以使用提交散列来代替分支名称)
这里有一个脚本,允许你在一行中选择多个提交,只需告诉脚本哪个源和目标分支的樱桃选择和提交的数量:
https://gist.github.com/nickboldt/99ac1dc4eb4c9ff003a1effef2eb2d81
从你的分支中选择master(使用当前分支作为源):
./gcpl.sh -m
从6.19中挑选最新的5个提交。X科要掌握:
./gcpl.sh -c 5 -s 6.19.x -t master