我没有看到“git format-patch”和“git diff”的输出有什么区别,它们之间有什么区别吗?我不能使用'git format-patch'对索引中的更改进行操作,因为它只接受提交,所以我可以使用'git diff'命令为索引中的更改生成补丁,并使用“git apply”应用它。我的问题是已经将更改添加到了索引中。
git diff --cached > index.patch
git format-patch
创建的补丁还包括一些有关提交的元信息(提交者、日期、提交消息等),并且将包含二进制数据的差异。所有内容都将格式化为邮件,以便轻松发送。接收方可以使用git am
重新创建相应的提交,并且所有元数据将保持完好。由于它是简单差异的超集,因此也可以使用git apply
应用。git diff
创建的补丁将是带有上下文的简单差异(类似于diff -u
)。它也可以使用git apply
应用,但不会重新创建元数据(因为它们不存在)。git format-patch
用于传输提交,而git diff
用于获取两个树之间的差异。git-format-patch 准备适用于邮件提交的补丁,而git-diff 显示更改。
它们是两个不同的东西,具有不同的目的,只是恰好输出一个补丁格式。但是 git-format-patch
添加了有关提交(日期、作者、提交消息)的数据,并将其打包成适合作为 Unix 邮件消息发送的格式(尽管这些只是文件,因此可以通过其他方法发送并仍由 git-am 应用)。
此外,git-format-patch
为您指定范围内的每个提交生成一个补丁文件。这些更改将作为提交添加到您的存储库中,使用git-am
。
git-diff
只显示您要求的两个状态之间的差异,并可用于创建补丁文件。但这只是一个普通的补丁文件,应用补丁将只更改工作目录的状态。
是的,您可以通过这种方式为索引创建一个补丁。
git diff
命令生成,但与通过git format-patch
命令生成的补丁相比,主要区别在于:
要为所有更改的文件(在索引或工作目录中)生成补丁文件:
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