我一直认为git index只是一个临时区域,我 即当git commit之后没有进行任何操作时,index为空,其中head是从头部到达的所有先前提交索引的总和。
显然,这种心态是错误的,关于terms
如何根据doc保存索引。当我从清洁工作目录软复位到早期提交时,后续提交中引入的更改将自动暂存,即添加到索引。或者更确切地说,它们不会添加到当前提交的索引中,而是传输整个索引。
这是否意味着干净的提交目录的索引实际上包含先前提交的更改,以及头部的更改?提交实际上是否在头部和索引之间提交差异?工作目录的清洁度和差异是否意味着指数的差异,而不是头部?作为数据结构的索引究竟是什么,git reset --soft <ref>
或git add
如何改变它?如何在提交后进行提交,它如何与快照和增量的概念相关?
答案 0 :(得分:4)
索引确实充当了临时区域,但与Git的其余部分一样,它是快照,而不是差异。干净提交目录的索引与上次提交相同,而不是空。这是一种常见的误解,因为大多数时候你会将索引视为delta,而git会尽最大努力向你显示增量。例如,git status似乎向您显示索引,但实际上,它“显示索引文件与当前HEAD提交之间的差异”。 git status
显示两个快照之间计算的增量。
考虑到这一点,你的其他问题很容易解释。软复位后,HEAD向后移动,索引保持原样。后来的提交并没有真正自动上演;它们保持原样,只是git status
将根据新的HEAD显示新的增量。 git commit也不会影响索引(除非你使用-a),它只是将它存储在新的提交中并更新HEAD,这就是git status
变空的原因。
请参阅What does the git index contain EXACTLY?了解实施细节,但我认为这不会增加您的概念性理解。