'git format-patch和'git diff'有什么区别?


92

我没有看到'git format-patch'和'git diff'的输出之间的区别,有什么区别吗?而且我不能使用'git diff'生成补丁,然后使用git apply应用它吗?

我的问题是我在索引中添加了更改,但是显然git format-patch仅接受提交,因此,如果我可以使用diff的输出,那么可以使用此命令为索引中的更改生成补丁:

git diff --cached > index.patch

Answers:


129

使用创建的补丁git format-patch还将包含有关提交的一些元信息(提交器,日期,提交消息等),并且将包含二进制数据的差异。一切都将被格式化为邮件,以便可以轻松发送。然后,接收它的人可以使用重新创建相应的提交,git am并且所有元数据都将保持完整。它也是git apply简单diff的超集,因此也可以应用。

创建的补丁git diff将是与上下文的简单差异(认为diff -u)。它也可以与之一起使用,git apply但是不会重新创建元数据(因为它们不存在)。

总而言之,git format-patch对于传输提交git diff很有用,而对于获取两棵树之间的差异很有用。


12

git-format-patch从手册中准备适用于电子邮件提交的补丁,而git-diff显示更改。

它们是两种不同的东西,具有不同的用途,它们只是输出补丁格式。但是git-format-patch会添加有关提交的数据(日期,作者,提交消息),并将其捆绑为适合作为Unix邮件消息发送的格式(尽管这些只是文件,因此可以将它们发送到其他方法,并且仍然可以通过git-am)。

还会git-format-patch为您指定范围内的每个提交生成补丁文件。这些更改将作为提交添加到您的存储库git-am

git-diff仅显示您要求的两种状态之间的差异,可用于创建补丁文件。但这只是一个普通的修补程序文件,应用修补程序只会更改工作目录的状态。

是的,您可以通过这种方式为索引创建补丁。


谢谢。UNIX邮件有什么特别之处,以便他们基于此来设计补丁?
拉菲德

7
没有什么特别的。这就是git是由Linus Torvalds设计的,其工作流程包括在集成到Linux内核之前通过电子邮件发送和接收补丁以进行验证。
西尔文·德夫雷斯内

Git 由Linus Torvalds设计,用于保留Linux内核。Unix邮件是一种常见格式。
阿比森2011年

1

可以使用git diff命令生成补丁文件,但与git format-patch命令生成的补丁相比,主要区别是:

  1. 没有关于提交的元数据(例如日期,作者,提交消息等);
  2. 没有关于diff的统计信息(diffstat,例如x个文件已更改,y个插入(+),z个删除(-));
  3. 没有二进制差异,只有文本差异。

在此处输入图片说明

为所有更改的文件(在索引或工作目录中)生成补丁文件:

git diff HEAD --binary > my.patch
# git diff + git diff --cached/staged == git diff HEAD

要应用生成的补丁文件:

# restore the changed files firstly
git restore --staged .
git restore .

# apply the patch to redo the changes 
git apply my.patch
# or
patch -p1 < my.patch
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.