根据git rm
文档,这是它的行为方式:
从索引中删除文件,或者从工作树和索引中删除文件
如果我只是做了一个提交并且我的索引是空的,执行git rm some_file
将分阶段删除some_file
. 我希望rm
什么都不做。为什么要删除一个不存在的文件,对存储库的最终影响是什么?
这里的诀窍是提交后索引不为空。
事实上,它包含了它在提交之前和期间所拥有的内容。
我不确定这个概念是从哪里来的。确实git commit
有一个 flags spelled --allow-empty
,这可能使它看起来索引在这一点上是空的,但这是误导性的标志的拼写:它允许的是一个空的diff,而不是一个空的commit。
将新内容添加到索引中也是如此git add
,但是对于已经存在的文件,添加的新内容只是替换了已经存在的旧条目。(也许是 的拼写git add
导致人们认为提交后索引为空?)
(另外一点有点奇怪的是,git rm
它还添加了一些东西:具体来说,一条记录说“这个路径名,确实存在于HEAD
提交中,不应该存在于下一次提交中。”这是因为索引起着双重作用:这不仅仅是“在下一次提交中放入什么”,而且是一个缓存以加快 git 扫描工作树的速度。实际上,您可以完全删除索引文件,这会取消所有内容但不会安排任何内容删除:HEAD
在这种情况下,git 只是从提交中重新构建索引。)