有一个小主题分支(在贡献者的远程存储库上),我想将其应用到我的 master 之上。我认为执行此操作的规范方法是:
git merge contributor/topic-branch
但我希望逐一应用提交,而不是生成合并提交。
天真地运行
git rebase contributor/topic-branch
显然是行不通的,因为它将我的 master onto 应用于主题分支,就好像主题分支是我的上游一样。所以我尝试了这个:
git rebase master contributor/topic-branch
这就是我想要的,除了现在我有一个分离的 HEAD,并且我需要修复 master 分支以指向 HEAD(使用
branch -f
)。我当然可以编写一个 Bash 函数来自动执行此操作,但是有没有一种“正确”的方法可以在不使用 merge
的情况下拉入主题分支?
怎么样:
git checkout topic-branch
git rebase master
git checkout master
git merge topic-branch
这解决了当地分支机构的问题。解决跟踪分支留作练习。
编辑:我想我应该解释一下这里发生了什么。首先你切换到主题分支;然后你对主题分支进行变基,使其基于 master。 (然后,当然,你测试一切是否仍然有效。你do有自动测试,对吧?)现在主题分支领先于master,你可以更改回master并将主题合并到master;不需要合并提交,因为它是快进。
我也刚刚发现cherry-pick支持提交范围,所以你可以这样做
git cherry-pick HEAD..contributor/topic-branch
(这将连续应用
topic-branch
中无法从 HEAD 访问的所有提交。)
我从手册页中感觉到,如果主题分支中有合并提交,这将会失败,因此这只适用于具有线性历史的简单情况。
此外,如果您使用本地主题分支执行此操作,
branch -d
将不会检测到topic-branch
已合并,因此您必须使用-D
。 (相比之下,Philip 的 rebase
+merge
方法没有这个问题。)
如果您想将提交范围从
commit-start-id
移植到 topic-branch-head
,那么请执行
git checkout contributor/topic-branch
git rebase --onto master <commit-start-id>