补丁文件和差异文件之间的区别

49

有人能向我解释一下.diff文件和.patch文件之间的区别吗?


4
实际上,补丁是一种应用差异的实用程序。扩展名并不重要。 - racetrack
4个回答

26

重要的是文件内容,而不是扩展名。这两个扩展名都意味着某种差异工具(diffgit diffgit format-patchsvn diff)生成了输出。

许多差异工具生成的输出可以被patch命令应用。你经常需要使用-d-p选项来给patch指定正确的路径(去掉前缀,指定目标目录)。如果你在一个在线分发的文件中看到这些扩展名,几乎可以确定它与patch兼容。

Git的差异输出与patch兼容,但我认为svn的输出不兼容。当然,使用git apply可能最好应用由git diff生成的普通补丁,而使用git format-patch生成的补丁则设计用于与git-am一起使用。


10

补丁是一个统一的差异(-u),如果你执行以下命令: diff -u oldfile newfile, 使用补丁命令行,你可以将差异应用于oldfile,使其成为其他地方的newfile。


1
我喜欢这个想法。补丁是一组差异集合。我不是在寻找“正确的扩展名”,而是可能是命名的标准做法。无论是否普遍使用,对我来说都是有意义的。我将继续使用 .diff 用于单文件差异和 .patch 用于多个合并差异。 - Chad M

6

没有什么区别。diff实用程序会生成补丁文件,使用patch应用该补丁文件。


3
也就是说,当你使用 diff 创建补丁时,你可以将其命名为 foo.diff 或 foo.patch(或其他任何名称)。patch 程序并不在意。 - eaj
如果给定一个差异文件,并且说你应该使用它来修补源代码,那么这意味着什么?我可以使用“patch -d <包含要打补丁的目录名称> -p[n] <差异文件名称>”命令来打补丁吗? - Navaneeth Sen
2
@Sen: “我能使用 patch 吗……?” 最好的答案是“试一试”。如果补丁无法应用,或者 patch 无法读取它,你会收到错误提示。如果可以工作,那就可以了。 - Cascabel
-d ... -p 是为了避免创建与生成补丁的目录结构相同的目录。例如,如果补丁文件包含“/home/user/projects/p1/prog.c”,并且需要应用于“/home/anotheruser/work/project1/prog.c”,则可以使用“patch -d /home/anotheruser/work/project <file.patch”来完成。但是,如果有两个要打补丁的文件 - “prog.c lib/lib.c”,则需要执行“patch -d /home/anotheruser/work/project1 -p5 <file.patch”。 - khachik

4
对我而言,.diff文件仅包含"git diff"命令生成的文件差异(添加/删除行)。
对我而言,.patch文件也包含作者、日期和补丁/提交消息,由git show生成。
Github允许将.patch.diff添加到拉取请求URL中。 .diff仅包含文件更改,而.patch是该PR中所有提交的序列化,每个提交都包含提交消息和文件内容差异。

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