如何合并另一个分支的头部提交?

时间:2009-08-31 06:42:09

标签: git

通常我在master分支上工作,我做了一些提交,然后推送它。

然后我还需要将这些提交推送到其他分支。

通常情况下,我会这样做:

$ git checkout another-branch
$ git cherry-pick commit1
$ git cherry-pick commit2
...
$ git cherry-pick commitn
$ git push

某种愚蠢的,无论如何我可以从主分支的头部合并一些提交所以我不需要 懒得一个接一个地挑樱。

3 个答案:

答案 0 :(得分:10)

听起来你可能想在除master之外的分支上进行这些提交,然后将该分支合并到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的设计方式。我不知道你的第二个分支是什么,但我所描述的基本上是定期将维护和主题分支合并回master以及任何其他适当的修改版本或维护分支的常用工作流程。

我强烈建议您采用如上所述通过合并完成此工作的工作流程,但要回答您提出的问题,如果您绝对必须使用主人和樱桃选择,您可能想要自己写一点脚本,如:

#!/bin/bash
# take two arguments:
# 1. other branch to put commits on
# 2. number of commits to cherry-pick from master    

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 mastercherries-pick <branch> release_tag..master或任何您想要的操作。看看它的man page

你也可以按照其他地方的建议使用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

答案 1 :(得分:1)

git cherry-pick commit1..commitn

答案 2 :(得分:0)

如果您只想用master更新分支,请执行:

git checkout branch;  git merge master
git rebase origin

如果你不想从master中提取所有东西,你可以选择性地区分修订版(boo)或使用分支用于单个功能 - 然后你可以将功能分支合并到master和你的其他分支中。