【发布时间】:2010-10-05 07:44:49
【问题描述】:
在 Subversion 中,使用“svn merge -r a:b mybranch”很容易从一个分支合并一系列变更集/差异。但是在 git 中,我发现只能从一个分支中挑选一个提交来将该补丁应用到我当前的工作分支。所以我想知道是否有一种快速的方法可以将错误修复分支中的两个标签之间的所有提交一次性应用到我当前的主分支?
【问题讨论】:
标签: git
在 Subversion 中,使用“svn merge -r a:b mybranch”很容易从一个分支合并一系列变更集/差异。但是在 git 中,我发现只能从一个分支中挑选一个提交来将该补丁应用到我当前的工作分支。所以我想知道是否有一种快速的方法可以将错误修复分支中的两个标签之间的所有提交一次性应用到我当前的主分支?
【问题讨论】:
标签: git
执行您要查找的操作的最简单方法是使用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
【讨论】:
我发现的最简单的方法是:
git cherry-pick starthash..endhash
请注意,这两个点与哈希标签之间没有空格。此外,这不会挑选starthash,而是挑选starthash 之后的所有内容,包括endhash。要包含starthash,请执行git cherry-pick starthash^..endhash。
【讨论】:
据我所知,你不能 git merge 这种方式。合并旨在加入两个具有共同历史的分支,而不是用于获取多个提交或补丁系列。我觉得从根本上来说,挑选樱桃就是你所要求的。
您可以使用 git cherry(不是 cherry-pick!)找出应将哪些提交插入到您的分支中,然后 git cherry-pick 他们。您还可以明确要求 git cherry-pick 记录这些提交的来源,以防您从公共分支中挑选。这可能是处理这个问题的最好方法。 (另一种可能是通过 git format-patch 导出它们,然后使用 git-am/git-apply 导入它们,但这可能会更慢,而且它不会记录提交。)
编辑:“公共”(分支)应理解为不受历史编辑影响的事物。当然,在代码不公开的情况下开发闭源软件时也可以这样做。
【讨论】: