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

Posted

技术标签:

【中文标题】“git format-patch”和“git diff”有啥区别?【英文标题】:What is the difference between 'git format-patch and 'git diff'?“git format-patch”和“git diff”有什么区别? 【发布时间】:2011-06-05 04:17:36 【问题描述】:

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

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

git diff --cached > index.patch

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

【参考方案2】:

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

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

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

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

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

【讨论】:

谢谢。 UNIX 邮件有什么特别之处,以至于他们根据它设计了补丁? 没有什么特别的。这只是 git 是由 Linus Torvalds 设计的,他的工作流程包括在集成到 Linux 内核之前通过电子邮件发送和接收补丁以进行验证。 Git 是 designed by Linus Torvalds 用于保留 Linux 内核。Unix 邮件是一种常见格式。【参考方案3】:

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

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

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

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

【讨论】:

以上是关于“git format-patch”和“git diff”有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

git format-patch的使用

如何应用使用 git format-patch 生成的补丁?

git merge --squash & git format-patch 将多个commit生成一个patch

你如何使用 git format-patch 将提交压缩到一个补丁中?

Microsoft/Git-Credential-Manager-for-Mac-and-Linux

初始化仓库