听起来你可能想在除了主分支(master)之外的一个分支上进行那些提交,然后将该分支合并到主分支和第二个分支中:
git checkout working-branch
<do some work>
git commit
git checkout master
git merge working-branch
git checkout second-branch
git merge working-branch
这种方式比挑选特定提交更好得多,因为它不会在历史记录中复制提交,消除了挑选提交两次的任何问题(你目前必须手动避免)......并且正是Git被设计成的工作方式。我不知道你的第二个分支是什么,但我所描述的基本上是定期将维护和主题分支合并回主分支以及任何其他适当修改的发布或维护分支的常见工作流程。
我强烈建议您采用我上述描述的合并方式来完成此操作流程,但是针对您提出的问题,如果您一定要在主分支上进行挑选特定提交,可以编写一个小脚本,例如:
#!/bin/bash
if ! git checkout $1; then
exit
fi
git rev-list --reverse -n $2 master |
while read commit; do
if ! git cherry-pick $commit; then
exit
fi
done
显然,可以通过增加在樱桃挑选操作中恢复那些补丁不适用的能力来使脚本更加健壮,但这是一个开始。
当然,你可以尝试以不同的方式使用git-rev-list来选择提交记录。你甚至可以将除第一个参数以外的所有参数传递给git-rev-list,以便进行cherries-pick <branch> -n 5 master
或cherries-pick <branch> release_tag..master
等操作。查看其手册页面吧!
你也可以像其他地方建议的一样使用git-rebase
,但因为你实际上不想移动主分支,所以最终会执行类似于以下操作:
git branch master-copy master
git rebase --onto <branch> master~5 master
git checkout <branch>
git merge master-copy
git branch -d master-copy