Почему "git rm --cached" удаляет обновленные файлы?

У меня есть README.md в моем локальном репозитории git. Локальный репозиторий git ничего не поставил и ничего не изменилось в рабочем дереве. См. Ниже:

$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
nothing to commit, working tree clean

Затем я запустил git rm --cached -- README.md, он говорит следующее:

$ git rm --cached -- README.md
rm 'README.md'

В соответствии с git help rm:

- кэшировать

Используйте эту опцию для исключения и удаления путей только из индекса. Файлы рабочих деревьев, независимо от того, модифицированы они или нет, будут оставлены в покое.

В README.md нет ступенчатых изменений. Таким образом, промежуточная область/индекс не должна содержать ничего. Почему он все еще удален?

ADD1

На основании ответа @DietrichEpp:

Государства существуют в 3-х местах как git:

  • рабочее дерево
  • Индекс
  • репо

Git решает, что un-tracked или un-staged путем сравнения 1 и 2;

Git решает, что to-be-commited путем сравнения 2 и 3;

git reset может использоваться для изменения состояния в 1 и/или 2.

Ответы

Ответ 1

Индекс не содержит ничего, он содержит все, что вы собираетесь совершить, включая файлы, которые уже являются частью репо. Скажем, что вы запускаете следующие команды:

touch a.txt b.txt
git add a.txt b.txt
git commit
git rm --cached a.txt
git commit

При первом запуске git add он добавляет в индекс a.txt и b.txt. Затем git commit принимает все, что находится в индексе, и фиксирует его.

Индекс все еще содержит a.txt и b.txt.

Когда вы git rm --cached, он удаляет a.txt из индекса, но b.txt все еще находится в индексе. Затем git commit принимает все, что находится в индексе (только b.txt), и фиксирует его. Файл a.txt все еще существует, потому что git rm --cached не касается фактического файла, а также git commit.

Поскольку первая фиксация содержит a.txt, а вторая фиксация не выполняется, это отображается как удаление.

Главное, что git status делает, показывает вам разницу между индексом и фактическими файлами на диске. Поэтому, если git status пуст, то все не проигнорированные файлы на диске также находятся в индексе.