如何为分支中的所有提交生成补丁?

101

如何通过只知道分支名称来为给定分支中的所有提交生成补丁?

这一步骤是一个复杂工作流程的一部分,所有操作都将被自动化处理。因此,需要手动确定分支中第一个提交并不可行。

请注意,任何依赖于reflog的方法也不可行,因为分支中的更改并非在本地进行。


Git 的整个意义不就在于无论更改是在本地还是其他地方都无所谓吗?请详细阐述一下你最后一句话的意思。 - Mad Physicist
请在此处检查--fork-point注释 https://git-scm.com/docs/git-merge-base - akirekadu
1
请注意,您可以在命令中指定git标签,因此如果您的自动化系统可以自动添加标签,您可以在这些点之间创建差异。 - MikeW
2个回答

141

如果您知道“给定分支”是从哪个分支创建的,那么制作补丁就很容易:

git diff master Branch1 > ../patchfile
git checkout Branch2    
git apply ../patchfile

(你也可以生成一个适用于非git的补丁

但是找到分支的正确“创建提交”可能很复杂:请参见“如何使用Git查找分支点?

OP akirekadu使用了:

git format-patch $(git merge-base --fork-point master)..branchB 

您可以在 "工作副本和分支基础之间的git diff" 中看到它的使用。

legends2k 在评论中添加了 以下内容:

可以使用 git apply --stat patchfile 验证生成的补丁文件。
这不会应用补丁,但会给出补丁的详细信息。


警告:AGP评论中指出:

$(git merge-base --fork-point master)..branchB 命令可能无法每次找到正确的分支根版本


ijoseph 指出 在评论中

顺便提一下,Phabricator 可以无缝处理这种情况,通过自动生成每个推送的补丁文件。


1
让我们称所涉及的分支为“B”。已知从哪个“源”分支创建了B。然而,生成与其进行比较的差异将不会产生正确的结果(即,我们需要仅在此分支B中进行的所有更改),因为自B创建以来,源分支可能已经发生了更改。 - akirekadu
@akirekadu 是的,这就是为什么我在回答中提到了 https://dev59.com/LHI_5IYBdhLWcg3wF_F3:找到分支的*当前*起点很难。 - VonC
好的。我最终选择了:git format-patch git merge-base --fork-point master..branchB - akirekadu
1
你需要在添加的命令前面加上 'git format-path'。例如,git format-patch \git merge-base --fork-point master`..branchB`。 - akirekadu
1
@ijoseph 谢谢。我已经将您的评论包含在答案中以增加可见性。 - VonC
显示剩余6条评论

7

如果您已经提交并推送了更改,现在想要创建一个补丁文件。

即使您在该分支中有多个提交,这也将创建1个文件中的补丁。

步骤1: 像任何功能/错误分支一样检出要打补丁的分支
例如:git checkout <branch>

步骤2: 现在,这将为所有提交差异与主分支及您的检出分支(即上述检出的分支)创建一个补丁。

git format-patch master --stdout > mypatch.patch


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