我想在我的主人身上申请一个小主题分支(在贡献者的远程仓库上)。我认为这样做的规范方法是:
git merge contributor/topic-branch
但我希望逐个应用提交,而不是生成合并提交。
天真地运行git rebase contributor/topic-branch
显然无效,因为它将我的主应用到主题分支,就像主题分支是我的上游一样。所以我尝试了这个:
git rebase master contributor/topic-branch
这就是我想要的,除了现在我有一个分离的HEAD,我需要修复master分支指向HEAD(使用branch -f
)。我当然可以编写一个Bash函数来自动执行此操作,但是有一种“正确”的方法可以在不使用merge
的情况下引入主题分支吗?
答案 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>