我没有看到'git format-patch'和'git diff'的输出有什么区别,有没有?并且我不能使用'git diff'生成补丁然后使用git apply应用它吗?
我的问题是我对索引添加了更改,但显然git format-patch只接受提交,所以如果我可以使用diff的输出,那么我可以使用此命令为更改中的更改生成指数:
git diff --cached > index.patch
答案 0 :(得分:120)
使用git format-patch
创建的补丁还将包含一些有关提交的元信息(提交者,日期,提交消息,......),并将包含二进制数据的差异。所有内容都将被格式化为邮件,以便可以轻松发送。然后,接收它的人可以使用git am
重新创建相应的提交,并且所有元数据都将保持不变。它也可以与git apply
一起应用,因为它是一个简单差异的超集。
使用git diff
打包的补丁将是一个带上下文的简单差异(想想diff -u
)。它也可以与git apply
一起使用,但不会重新创建元数据(因为它们不存在)。
总之,git format-patch
对于传输提交很有用,而git diff
对于在两棵树之间获取差异很有用。
答案 1 :(得分:9)
从手册git-format-patch准备适合电子邮件提交的补丁,而git-diff则显示更改。
它们是两个不同的东西,有不同的目的,它们只是输出一个补丁格式。但git-format-patch
添加了有关提交(日期,作者,提交消息)的数据,并将其捆绑为适合作为Unix邮件消息发送的格式(尽管这些只是文件,因此可以将它们发送给其他人方法仍由git-am应用。
同样git-format-patch
为您指定的范围内的每个提交生成一个补丁文件。这些更改将作为提交添加到您的存储库git-am
。
git-diff
只显示您要求的两种状态之间的差异,并可用于创建补丁文件。但这只是一个普通的补丁文件,应用补丁只会改变工作目录的状态。
是的,您可以通过这种方式为索引创建补丁。
答案 2 :(得分:1)
可以使用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