在Subversion中,使用“svn merge -r a:b mybranch”很容易从分支合并一系列变更集/差异。但是在git中,我发现只能从分支机构中选择一个提交来将该补丁应用到我当前的工作分支。所以我想知道是否有一种快速方法将错误修复分支中两个标签之间的所有提交应用到我当前的主分支中?
答案 0 :(得分:48)
执行您要查找的操作的最简单方法是使用git rebase
。这是一个食谱。假设标记A是提交,其中您要选择的修补程序系列基于该提交,标记B是系列中最终修补程序的提交。另外,假设br是当前分支的名称以及应该应用新补丁系列的分支。
# Checkout a new temporary branch at the current location
git checkout -b tmp
# Move the br branch to the head of the new patchset
git branch -f br B
# Rebase the patchset onto tmp, the old location of br
git rebase --onto tmp A br
答案 1 :(得分:5)
我发现这样做的最简单方法是:
git cherry-pick starthash..endhash
请注意,这两个点没有空格将它们与散列标签分开。
答案 2 :(得分:4)
据我所知,你不能用这种方式 git merge 。 Merge旨在加入两个具有共同历史记录的分支,而不是用于获取多个提交或补丁系列。我觉得挑选樱桃基本上就是你所要求的。
你可以使用 git cherry (不是 cherry-pick !)找出应该在你的分支中插入哪些提交,然后 git cherry-pick < / em>他们。您还可以明确要求 git cherry-pick 记录这些提交的来源,以防您从公共分支机构挑选。这可能是解决此问题的最佳方法。 (另一种可能是通过 git format-patch 导出它们,然后使用git-am / git-apply导入它们,但这可能会更慢,而且它不会记录原点提交。)
编辑:“公共”(分支)应理解为不受历史编辑的影响。当然,您可以在开发闭源软件时执行此操作,而无需公开代码。