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

Posted

技术标签:

【中文标题】从 git 存储库创建补丁或差异文件并将其应用到另一个不同的 git 存储库【英文标题】:Create patch or diff file from git repository and apply it to another different git repository 【发布时间】:2015-03-27 08:59:45 【问题描述】:

我从事基于 WordPress 的项目,我想在每个新发布的 WP 版本中修补我的项目。为此,我想在两个提交或标签之间生成一个补丁。

例如,在我的 repo /www/WP 我这样做:

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

# or

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

/www/WPgit natif WordPress

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

git apply 命令行不起作用,我认为是因为我们位于不同的存储库中。

我可以在没有提交的情况下生成一个补丁文件,只是一个差异并将其应用到另一个 git 存储库吗?

谢谢。

【问题讨论】:

【参考方案1】:

您可以只使用git diff 来生成适合git apply 的unified diff:

git diff tag1..tag2 > mypatch.patch

然后您可以通过以下方式应用生成的补丁:

git apply mypatch.patch

【讨论】:

谢谢 Enrico,我使用了 $git diff -u tag1..tag2 > mypatch.patch$git apply --stat > mypatch.patch 答案是 0 files changed 任何其他建议好吗? :) 您需要将补丁文件的路径指定为git apply的参数。我用一个例子更新了我的答案。 我使用了git diff -p tag1 tag2 > my.patch,效果很好。 如何制作统一差异格式的补丁? sourceware.org/glibc/wiki/… 说 Only unified diff (-uNr) format is acceptable. 但是当我尝试 git diff -uNr tag1..tag2 > mypatch.patch 我收到消息 usage: git diff [<options>] [<commit> [<commit>]] [--] [<path>...] 小心git diff ... + git apply ... 不正确处理已删除/移动的文件......当git format-patch ... + git am ... 这样做时。【参考方案2】:

要为多个提交生成补丁,您应该使用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

【讨论】:

可以用patch -p1 应用的补丁怎么样? sourceware.org/glibc/wiki/… 我正在将补丁从 linux 移动到 winodws,因此必须使用这里提到的 --ignore-whitespace ***.com/questions/13190679/… @AaronFranke,你可以试试'-p'选项:git format-patch -p HEAD^1 注意,这样做的好处是可以保留原始提交的提交消息、作者和提交日期。 --stdout 会将输出转储到终端,您需要使用> file.patch 进行管道传输。或者,如果您不包含--stdout,它会生成格式为nnnn-commt-message.patch 的文件(其中nnnn 是从0001 开始的滚动数字)。【参考方案3】:

你可以应用两个命令

    git diff --patch > mypatch.patch // 生成补丁` git apply mypatch.patch // 应用补丁`

【讨论】:

【参考方案4】:

作为补充,要为一个特定的提交生成补丁,请使用:

git format-patch -1 <sha>

生成补丁文件时,请确保您的其他 repo 在您使用 git am $patch-name 时知道它在哪里

在添加补丁之前,使用git apply --check $patch-name确保没有冲突。

【讨论】:

【参考方案5】:

你甚至可以只为你当前所在的子目录打补丁。只需添加.

git format-patch -k b365cce8..80a2c18a .

然后你就可以应用它们了:

git am *.patch

详情请见this answer

【讨论】:

以上是关于从 git 存储库创建补丁或差异文件并将其应用到另一个不同的 git 存储库的主要内容,如果未能解决你的问题,请参考以下文章

您如何获取 git diff 文件,并将其应用到作为同一存储库副本的本地分支?

从邮件列表应用 git 补丁

如何应用使用 git format-patch 生成的补丁?

如何将 Git 补丁应用于具有不同名称和路径的文件?

从 git add -p 编辑大块时修复“补丁不适用”

GIt:使用BFG从存储库中删除了几个文件,并且存在巨大的提交差异