Каждый файл, который вы используете в Git, имеет до трех одновременно активных копий. Для конкретности давайте поговорим о файле с именем obj/a
(я просто предположим, был такой файл).
Существует одна копия obj/a
в трех местах, когда вы начало:
Один из них - или может быть, в любом случае - в коммите , который вы выбрали с помощью git checkout master
или git switch master
, или как бы вы ни выбрали ветвь и, следовательно, фиксация.
Вторая копия obj/a
в Git index . Индекс, также называемый промежуточной областью , содержит копию 1 каждого файла, готового к go в следующем коммите, который вы сделаете. Копия в индексе сначала помещается туда вашей командой git checkout
или git switch
. Он остается там до тех пор, пока вы не сделаете что-то с этим или с ним.
Наконец, единственная копия obj/a
, которую вы можете увидеть , - это обычный файл в вашем рабочее дерево или рабочее дерево .
Причина принятой копии заключается в том, что каждая фиксация содержит копию всех из ваших файлов, как снимок фиксации. Эта копия, однажды сделанная, не может быть изменена вообще. Никакая часть любого коммита не может быть изменена: все коммиты замораживаются навсегда.
Причина копии рабочего дерева заключается в том, что зафиксированная копия не только замораживается навсегда , он также сжат в специальный Git -только формат, который может использовать только Git. Это хорошо для архивирования, но бесполезно для выполнения любой работы. Git должен извлечь его и превратить в обычный повседневный файл, чтобы вы могли его использовать. По этой же причине ваше рабочее дерево называется «рабочим деревом» или «рабочим деревом»: именно там вы выполняете свою работу.
Копия index - это та, которая не действительно есть очевидная причина для существования. Но у Git есть один. 2
Когда вы запустили:
git rm -r --cached obj/
Git удалил index копию obj/a
, Переданная копия не может быть удалена : она находится в коммите, и никакая часть любого коммита не может быть изменена. Копия рабочего дерева obj/a
, которую вы можете увидеть и использовать, была оставлена, потому что вы сказали Git оставить ее в покое когда вы сказали --cached
. Итак, теперь у вас осталось две копии файла вместо трех.
Если вы хотите избавиться от work-tree копии файла используйте команду «удалить файл рабочего дерева» на вашем компьютере, что бы это ни было (возможно, rm
). Если бы вы сказали Git ранее git rm -r obj/
, вы бы указали Git удалить две копии: одну в индексе и одну в рабочем дереве. Теперь, когда индексная копия исчезла , git rm
не удалит копию рабочего дерева, потому что копия рабочего дерева теперь является неотслеживаемым файлом . Так что теперь вам нужно использовать команду non-Git.
(В качестве альтернативы вы можете git add obj/a
, который скопирует файл в указатель. Теперь он будет во всех снова три места, и теперь git rm obj/a
удалит и индекс, и копии рабочего дерева.)
1 Технически, то, что в индексе, не является действительным скопируйте файла, а скорее имя и режим файла и ссылку на данных файла, готовых для ввода в новый коммит. Но если вы не начнете проверять содержимое индекса непосредственно с помощью git ls-files --stage
или не используете git update-index
для изменения содержимого индекса, разница здесь не так уж и важна.
2 То есть У Git есть копия файла, хотя см. Сноску 1. У Git тоже есть причина: для Git проще сделать Git. Существуют системы, которые работают очень похоже на Git, но не занимаются индексом. Они просто используют копию рабочего дерева в качестве предложенного следующего коммита. Это работает, но медленнее и не предлагает некоторые функции, которые Git делает.