“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 merge --squash & git format-patch 将多个commit生成一个patch
你如何使用 git format-patch 将提交压缩到一个补丁中?