删除索引标题行是否有任何(隐藏的)影响?
它们并没有真正隐藏,它们只是不会伸手打你的脸(不像,比如说,Git 的索引与 交互的方式.gitignore
)。
我假设该git apply
工具将出于优化原因仅查看哈希值。
实际上恰恰相反。应用命令被赋予一个差异,并尝试将该差异应用到工作树和/或索引中的现有文件。这些差异具有上下文和更改,并且上下文和/或更改可能与要应用差异的现有文件不匹配。如果我们应该添加:
(the BEST)
在第 12 行和第 13 行之间,应该是
one ice cream flavor
is chocolate
但现在他们读到:
the odors of skunks
and ferrets
好吧,也许那不再是最好的了,是吗?
无论如何,如果事情看起来很可疑,Git 能够使用该行在您自己的本地存储库中四处寻找,以尝试在添加差异之前index
找出文件的样子。如果它可以这样做——如果它可以找到原始文件——它就可以将补丁应用到原始文件。它现在有三个文件:
- 原始文件,通过该
index
行找到;
- 更新的文件,通过将补丁应用于原始文件而成功,因为该
index
行提供了实际的原始文件,因此补丁匹配;和
- 您的文件版本。
git merge
有了这三个版本的单个文件,Git 现在可以像在那个文件上那样做一个完整的三向合并。Git 可以判断补丁不匹配的原因是否是因为行移动了——所以现在可以将补丁应用于正确的行,例如,可能是第 52 和 53 行而不是 12 和 13 行——或者如果这是因为您进行了相互冲突的更改,现在出现了合并冲突。(也许你正确地将这些硫醇化合物识别为最难闻的东西,尽管尸胺和腐胺会让它们一败涂地。)
...使用git diff --binary sometag
...
来自 Git的二进制补丁要求您拥有正确的原像(该index
行给出的项目)。如果没有索引行,假设我正确读取源代码,Git 将拒绝应用补丁,使补丁本身无用。如果要删除索引行,不妨删除二进制补丁。