我真的不明白这个索引匹配HEAD的概念。索引即将提交,因此索引总是应该为空,因为在重置前一次提交时一切都被提交了?
关于this问题,似乎git索引包含所有内容的缓存版本,而不仅仅是更改,所有这些都是相关的吗?
答案 0 :(得分:2)
我想我知道你很困惑。 Git不存储差异。 1
我想你已经看过了,但让我重申一遍:索引包含你将要做的 next 提交。
当你刚刚提交了一个提交时,你使用了索引 2 ,因此“索引中的内容现在”与“HEAD
中的内容”之间没有区别。 这并不意味着索引是空的。事实上,索引仍然充满了“HEAD
中的内容”。如果你运行git commit --allow-empty
,git会再次提交相同的索引,获得一个使用与前一次提交相同的树的新提交。如果您清空索引, 3 然后将其与HEAD
进行比较,您将看到您将删除每个文件。
其他可能有帮助的是,当你要求git将索引与现有提交(git diff --cached
,git status
等进行比较)时,它会让人想起 new < / em> diff 然后。它对git diff <commit-1> <commit-2>
以及git show <commit-id>
和git log -p
也是如此。 Git没有存储差异,每次都会生成新的。 4
1 这故意忽略了git的“包文件”中的“增量压缩”,它实际上存储差异,但不像其他版本控制系统那样。
2 实际上,您可以使用任意数量的不同索引文件,而某些命令(例如git commit -- <path>
)会创建一个新的临时索引而不是使用“the”(默认)索引。但通常你最后一次提交使用“the”索引,而不是一些替代的临时索引文件。
3 要“清空”索引,你实际上必须向它写“删除文件”记录,因为如果你真的把它作为一个空文件,git会重新生成索引,或者去掉它。这是因为索引实际上具有双重作用:它既是“下一次提交”又是“加速git的一种方式,因此它不必读取大量目录和文件”。
此外,--allow-empty
标志在这里有误导性:它意味着“允许diff为空”,而不是“允许索引为空”。
4 Linus Torvalds将此描述为一项功能,因为这意味着如果有人让git diff
更聪明,那么新的智能现在可追溯应用于之前的每次提交。这是一个正确的观察结果,所有成本都是 5 计算能力。
5 并且“一点点”我们的意思是“公制****负载”:)