从Git存储库创建补丁或差异文件,并将其应用于另一个不同的Git存储库

279

我正在处理基于WordPress的项目,想要在每个新版本的WP发布时对我的项目进行修补。为此,我希望能够在两个提交或标签之间生成一个修补程序。

例如,在我的存储库/www/WP中执行以下操作:

$ git patch-format com1..com2 --stdout > '~/patchs/mypatch.patch'

# or

$ git patch-format tag1..tag2 --stdout > '~/patchs/mypatch.patch'

/www/WP 是本机上的 WordPress,使用原生的 git。

/www/myproject 是我的基于 WordPress 的 git 项目。

我认为 git apply 命令行不起作用,可能是因为我们在不同的代码库中。

我能否生成一个差异文件而无需提交(commit),然后将其应用到另一个 git 代码库中?

6个回答

411

您可以使用git diff命令生成适合git apply命令的统一格式差异文件:

git diff tag1..tag2 > mypatch.patch

你可以使用以下命令应用补丁:

git apply mypatch.patch

1
谢谢Enrico,我使用了 $git diff -u tag1..tag2 > mypatch.patch$git apply --stat > mypatch.patch,答案是 0 files changed。如果有其他建议,请告诉我 :) - zatamine
5
我使用了 git diff -p tag1 tag2 > my.patch 命令,这个命令运行得很好。 - barclay
在我的情况下,我有一个新的存储库,并希望创建一个补丁,其中包含从一开始的所有更改,将第一个提交标记为0.0.1,最后一个提交标记为0.0.2,然后使用git diff 0.0.1 0.0.2 > changes.patch创建一个补丁。 - Mahtab Alam
6
注意,git diff ... + git apply ... 不能正确处理已删除/移动的文件,而 git format-patch ... + git am ... 可以。 - Thomas Vincent
也可能有用:git apply --ignore-space-change --ignore-whitespace mypatch.patch - Yeheshuah
显示剩余4条评论

74

如果要为几个提交生成补丁,则应使用 format-patch git 命令,例如:

git format-patch -k --stdout R1..R2

这将以邮箱格式将您的提交导出为补丁文件。

要为最后一次提交生成补丁,请运行:

git format-patch -k --stdout HEAD~1

然后在另一个存储库中使用am git命令应用补丁,例如:

git am -3 -k file.patch

请参考:man git-format-patchgit-am


1
一个可以使用 patch -p1 应用的补丁怎么样?https://sourceware.org/glibc/wiki/Contribution%20checklist#Proper_Formatted_Unified_diff_of_the_Changes - Aaron Franke
我正在将补丁从Linux移植到Windows,因此必须使用--ignore-whitespace,如此处所述:https://dev59.com/OWYs5IYBdhLWcg3wDPit - Mahesh
2
@AaronFranke,你可以尝试使用“-p”选项:git format-patch -p HEAD^1 - Piroxiljin
“--stdout”会将输出内容散布到终端,您需要使用“>file.patch”管道命令来进行文件输出。或者,如果您不包含“--stdout”,则生成的文件格式为“nnnn-comm-message.patch”(其中“nnnn”是从“0001”开始滚动计数的数字)。 - ADTC
1
另外,请在您的回答中解释选项“-3”和“-k”。个人认为这里不需要“-k”,但对于“-3”我不太确定。 - ADTC
显示剩余2条评论

52

你可以应用两个命令

  1. git diff --patch > mypatch.patch // 生成补丁文件
  2. git apply mypatch.patch // 应用补丁文件

3
作为补充,要仅针对一个特定的提交生成补丁,请使用以下命令:
git format-patch -1 <sha>

生成补丁文件后,在使用 git am ${patch-name} 命令时确保另外的仓库知道该文件的位置。

在添加补丁前,请使用 git apply --check ${patch-name} 命令来检查是否存在冲突。


2
你甚至可以仅为当前所在的子目录做补丁。只需添加 . 即可。
git format-patch -k b365cce8..80a2c18a .

然后你可以应用它们:
git am *.patch

详细信息请参见此答案


1

使用这个命令。

git diff master..localbranch > file.patch

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