如果我的暂存索引为空,为什么 `git rm` 删除了一个不存在的文件?

If my staging index is empty, why is `git rm` deleting a file that isn't there?

根据 git rm 文档,它的行为是这样的:

Remove files from the index, or from the working tree and the index

如果我刚刚提交并且我的索引是空的,执行 git rm some_file 将暂存 some_file 的删除。我希望 rm 什么都不做。为什么会删除一个不存在的文件,对版本库的最终影响是什么?

这里的技巧是索引在提交后不是空的。

事实上,它包含了提交之前和提交期间的所有内容。

我不确定这个概念是从哪里来的。 git commit 确实有一个拼写为 --allow-empty 的标志,这可能使它看起来索引此时为空,但标志的拼写具有误导性:它允许的是空 diff,而不是一个空的 commit.

git add 确实向索引中添加了新内容,但是对于已经存在的文件,添加的新内容只是取代了已经存在的旧条目。 (也许 git add 的拼写导致人们假设索引在提交后为空?)

(另一个有点奇怪的是 git rm 还添加了一些东西:具体来说,一条记录说 "this path-name, which does exist in the HEAD commit, should not exist in the next commit." 这是因为索引起着双重作用:它不是 只是 "what to put in the next commit",还有一个缓存来加速git 扫描你的工作树。事实上你可以完全删除索引文件,这会取消一切但不会' t 计划删除任何内容:git 只是在这种情况下从 HEAD 提交重新构建索引。)