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

7
通常我会在主分支上工作,做一些提交并将其推送。
然后我还需要将这些提交推送到其他分支。
所以通常,我会执行以下操作:
$ git checkout another-branch
$ git cherry-pick commit1
$ git cherry-pick commit2
...
$ git cherry-pick commitn
$ git push

有一些愚蠢的事情,我能否从主分支的头部合并一些提交,这样我就不需要一个一个地挑选了。

3个回答

12

听起来你可能想在除了主分支(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
# 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等操作。查看其手册页面吧!

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

git cherry-pick commit1..commitn

git 摘取 commit1..commitn


0
如果您只想使用主分支更新您的分支,请执行以下操作:

git checkout branch;  git merge master
git rebase origin

如果您不想从主分支拉取所有内容,可以选择性地对修订版本进行差异比较(boo),或者使用单独的功能分支--然后您只需将功能分支合并到主分支和其他分支即可。


我只想合并主分支中距离头部的n个提交,而不是分支和主分支之间存在差异的其他提交。 - Sam Liao
1
git rebase -i origin; 这会为您打开一个文本编辑器,每个提交都在一行中,您需要删除不想要的提交所在的行。 - Adrian Panasiuk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接