什么是在分支的子范围内进行git补丁的最佳方法?

25
在Subversion中,使用“svn merge -r a:b mybranch”可以轻松地合并一个分支中的一系列变更集/差异。但是在Git中,我发现只能从分支中精选单个提交并将该补丁应用到我的当前工作分支。所以我想知道是否有一种快速的方法可以一次性将错误修复分支中两个标签之间的所有提交应用到我的当前主分支。
3个回答

56

执行您要查找的操作最简单的方法是使用 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
需要注意的是,你不能通过这种方式保留有关这些提交的来源信息。 - Eduard - Gabriel Munteanu
在过去的三天里,我大约需要五次这个确切的功能。比挑选每个提交要好得多。 - Bryan J Swift
太好了。这正是我需要的那种有用的“以非常奇怪的方式移动整个提交集”的效果。 - Kzqai
7
为了澄清一下,因为我没明白,标签 A 实际上是你想要包含在系列中的第一个提交之前的提交。因此,标签 A 不会被包括在内,只有之后的标签会被包括进来。 - Kzqai
刚刚用了这个技巧;在30分钟内完成了一个非常复杂的合并,在大多数其他版本控制系统中是不可能的!!! - Jacko

7
我发现最简单的方法是:
git cherry-pick starthash..endhash

请注意,两个点与哈希标签之间没有空格。此外,这不会挑选 starthash,而是从 starthash 之后的所有内容一直到包括 endhash。如果要包含 starthash,请使用 git cherry-pick starthash^..endhash。

4
据我所知,你不能以这种方式进行git合并。合并旨在将具有共同历史记录的两个分支合并,而不是选择几个提交或修补程序系列。我觉得,拣选是你所要求的根本问题。
您可以使用git cherry(而不是cherry-pick!)查找应插入分支的哪些提交,然后使用git cherry-pick 对它们进行拣选。您还可以明确要求git cherry-pick 记录这些提交的来源,以防您从公共分支进行拣选。这可能是解决此问题的最佳方法。(另一种方法可能是通过git format-patch导出它们,然后使用git-am/git-apply导入它们,但这可能会更慢,并且不会记录提交的来源。)
编辑:“公共”(分支)应被理解为不受历史编辑影响的东西。当然,在开发闭源软件时,您可以这样做,而不会使代码变成公共的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接