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

Raf*_*fid 85 git diff patch

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

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

git diff --cached > index.patch
Run Code Online (Sandbox Code Playgroud)

Syl*_*sne 123

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

装饰的补丁git diff将是一个带上下文的简单差异(想想diff -u).它也可以应用git apply但不会重新创建元数据(因为它们不存在).

总之,git format-patch传输提交git diff很有用,同时在两棵树之间获得差异很有用.


Abi*_*ern 9

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

它们是两个不同的东西,有不同的目的,它们恰好输出一个补丁格式.但git-format-patch添加有关提交(日期,作者,提交消息)的数据并将其捆绑为适合作为Unix邮件消息发送的格式(尽管这些只是文件,因此它们可以发送到其他方法并仍然应用于GIT-AM).

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

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

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

  • 没有什么特别的.这就是git是由Linus Torvalds设计的,其工作流程包括在集成到Linux内核之前通过电子邮件发送和接收补丁进行验证. (7认同)

K. *_*bol 6

可以使用该命令生成补丁文件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
Run Code Online (Sandbox Code Playgroud)

应用生成的补丁文件:

# 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
Run Code Online (Sandbox Code Playgroud)