3

我想在我的主人之上应用一个小的主题分支(在贡献者的远程仓库上)。我认为这样做的规范方法是:

git merge contributor/topic-branch

但我想让提交一个接一个地应用,而不是生成一个合并提交。

天真的运行git rebase contributor/topic-branch显然是行不通的,因为它将我的主应用主题分支上,就好像主题分支是我的上游一样。所以我尝试了这个:

git rebase master contributor/topic-branch

这就是我想要的,除了现在我有一个分离的 HEAD,我需要修复 master 分支以指向 HEAD(使用branch -f)。我当然可以编写一个 Bash 函数来自动执行此操作,但是是否有一种“正确”的方法可以在不使用的情况下拉入主题分支merge

4

3 回答 3

13

怎么样:

git checkout topic-branch
git rebase master
git checkout master
git merge topic-branch

这解决了本地分支的问题。求解跟踪分支留作练习。

编辑:我想我应该解释一下这里发生了什么。首先你切换到主题分支;然后你重新设置主题分支,使其基于 master。(然后,当然,您测试一切是否仍然有效。您确实有自动测试,对吗?)现在主题分支在 master 之前,您可以更改回 master 并将主题合并到 master;不需要合并提交,因为它是快进的。

于 2011-03-01T20:22:27.680 回答
2

我也刚刚发现cherry-pick 支持提交范围,所以你可以这样做

git cherry-pick HEAD..contributor/topic-branch

(这将依次应用topic-branch从 HEAD 无法访问的所有提交。)

我从手册页中了解到,如果主题分支中有合并提交,这将失败,因此这只适用于具有线性历史的简单案例。

此外,如果您使用本地主题分支执行此操作,branch -d则不会检测到topic-branch已合并,因此您必须使用-D. (相比之下,菲利普的rebase+merge方法没有这个问题。)

于 2011-03-02T00:10:55.217 回答
0

如果您想将提交范围从 移植commit-start-idtopic-branch-head,然后执行

git checkout contributor/topic-branch
git rebase --onto master <commit-start-id>
于 2011-03-01T20:40:30.300 回答