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


155

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

例如,在我的仓库中,/www/WP我这样做:

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

要么

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

/www/WP git natif WordPress的

/www/myproject 我的git project基于WordPress

git apply命令行是不行的,我想是因为我们是在不同的存储库。

我可以生成不带提交的补丁文件,只是一个差异文件,并将其应用于另一个git存储库吗?

谢谢前进。

Answers:


243

您可以使用git diff产生适用于的统一差异git apply

git diff tag1..tag2 > mypatch.patch

然后,您可以使用以下方法应用生成的补丁:

git apply mypatch.patch

1
谢谢恩里科,我用过$git diff -u tag1..tag2 > mypatch.patch$git apply --stat > mypatch.patch答案是0 files changed还有其他建议吗?:)
zatamine

您需要将补丁文件的路径指定为的参数git apply。我用一个例子更新了我的答案。
恩里科·坎皮多里奥

1
我用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>...]
Aaron

2
小心git diff ...+ git apply ...不处理删除/移动的文件正确...当git format-patch ...+ git am ...做。
vrince

50

要为多个提交生成补丁,应使用format-patchgit命令,例如

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

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

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

git format-patch -k --stdout HEAD^

然后在另一个存储库中通过amgit命令应用补丁,例如

git am -3 -k file.patch

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


1
可以应用的补丁patch -p1呢?sourceware.org/glibc/wiki/…–
亚伦弗兰克

我是从Linux的移动补丁的Winodws,所以不得不使用-忽略空格这里提到stackoverflow.com/questions/13190679/...
马赫什

2
@AaronFranke,您可以尝试使用“ -p”选项:git format-patch -p HEAD ^ 1
Piroxiljin

值得注意的是,这样做的好处是可以保留原始提交的提交消息,作者和提交日期。
M. Justin

0

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

git format-patch -1 <sha>

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.