Git:使用rebase应用主题分支(不合并)

时间:2011-03-01 20:01:08

标签: git git-branch branching-and-merging git-rebase

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

git merge contributor/topic-branch

但我希望逐个应用提交,而不是生成合并提交。

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

git rebase master contributor/topic-branch

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

3 个答案:

答案 0 :(得分:12)

怎么样:

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

这解决了本地分支的问题。解决跟踪分支是一项练习。

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

答案 1 :(得分:2)

我还发现,cherry-pick支持提交范围,所以你可以做

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

(这相继应用了topic-branch中无法从HEAD访问的所有提交。)

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

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

答案 2 :(得分:0)

如果要将提交范围从commit-start-id移植到topic-branch-head,请执行

git checkout contributor/topic-branch
git rebase --onto master <commit-start-id>