git修补分支子范围的最佳方法是什么?

git修补分支子范围的最佳方法是什么?,git,Git,在Subversion中,使用“svn merge-ra:b mybranch”可以很容易地从分支合并一系列变更集/差异。但在git中,我发现只有从一个分支中挑选一个提交才能将该补丁应用到我当前的工作分支。因此,我想知道是否有一种快速的方法可以将bugfix分支中的两个标记之间的所有提交一次性应用到我当前的主分支?据我所知,您不能以这种方式进行git合并。Merge旨在连接两个具有共同历史记录的分支,而不是用于获取多个提交或修补程序系列。我觉得摘樱桃基本上就是你想要的 您可以使用git cher

在Subversion中,使用“svn merge-ra:b mybranch”可以很容易地从分支合并一系列变更集/差异。但在git中,我发现只有从一个分支中挑选一个提交才能将该补丁应用到我当前的工作分支。因此,我想知道是否有一种快速的方法可以将bugfix分支中的两个标记之间的所有提交一次性应用到我当前的主分支?

据我所知,您不能以这种方式进行git合并。Merge旨在连接两个具有共同历史记录的分支,而不是用于获取多个提交或修补程序系列。我觉得摘樱桃基本上就是你想要的

您可以使用git cherry(不是cherry-pick!)来确定哪些提交应该插入到您的分支中,然后使用git cherry来选择它们。您还可以明确要求git cherry pick记录这些提交的来源,以防您从公共分支进行cherry pick。这可能是解决这个问题的最好办法。(另一种可能是通过git格式补丁导出它们,然后使用git am/git apply导入它们,但这可能会更慢,而且不会记录提交的来源。)


编辑:“公共”(分支)应理解为不受历史编辑的内容。当然,在开发封闭源代码软件时,您可以在代码不公开的情况下执行此操作。

执行所需操作的最简单方法是使用
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

请注意,这两个点没有空格将它们与散列标签分开。

应该注意的是,您无法以这种方式保留有关这些提交的来源的信息。在过去三天中,我大约五次需要这个确切的功能。这比每一次采摘樱桃要好得多。太好了。这是我需要的一种有用的“以一种非常奇怪的方式移动一整套提交”效果。哦,我只是想澄清一下,因为我没有得到它,标记a实际上是提交-就在之前-你想要包括的系列中的第一个。所以标签A不会被包括在内,只有后面的标签;在30分钟内完成了一个非常复杂的合并,这在大多数其他风投中是不可能的。!!!请注意,这并不是cherry pick starthash,而是starthash之后的所有内容,包括endhash。包括starthash do“git cherry pick starthash^..endhash”