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

115
我没有看到“git format-patch”和“git diff”的输出有什么区别,它们之间有什么区别吗?我不能使用'git format-patch'对索引中的更改进行操作,因为它只接受提交,所以我可以使用'git diff'命令为索引中的更改生成补丁,并使用“git apply”应用它。我的问题是已经将更改添加到了索引中。
git diff --cached > index.patch
3个回答

146
使用git format-patch创建的补丁还包括一些有关提交的元信息(提交者、日期、提交消息等),并且将包含二进制数据的差异。所有内容都将格式化为邮件,以便轻松发送。接收方可以使用git am重新创建相应的提交,并且所有元数据将保持完好。由于它是简单差异的超集,因此也可以使用git apply应用。
使用git diff创建的补丁将是带有上下文的简单差异(类似于diff -u)。它也可以使用git apply应用,但不会重新创建元数据(因为它们不存在)。
总之,git format-patch用于传输提交,而git diff用于获取两个树之间的差异。

20

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

它们是两个不同的东西,具有不同的目的,只是恰好输出一个补丁格式。但是 git-format-patch 添加了有关提交(日期、作者、提交消息)的数据,并将其打包成适合作为 Unix 邮件消息发送的格式(尽管这些只是文件,因此可以通过其他方法发送并仍由 git-am 应用)。

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

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

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


谢谢。UNIX邮件有什么特别之处,以至于他们基于它设计了补丁? - Rafid
7
这并没有什么特别的。只是因为git是由Linus Torvalds设计的,他的工作流程涉及通过电子邮件发送和接收补丁以进行验证,然后再将其集成到Linux内核中。 - Sylvain Defresne
1
Git是由Linus Torvalds(http://youtu.be/4XpnKHJAok8)设计用于保持Linux内核的。Unix邮件是一种常见格式。 - Abizern

6
补丁文件可以使用git diff命令生成,但与通过git format-patch命令生成的补丁相比,主要区别在于:
  1. 没有关于提交的元数据(例如日期、作者、提交消息等);
  2. 没有有关差异的统计信息(如差异状态,包括x个文件已更改,y个插入项(+),z个删除项(-));
  3. 没有二进制差异,只有文本差异。

enter image description here

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

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

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