Помните, что Git в основном делает new коммитов.Чтобы сделать новый коммит, вы, как правило, запустите git commit
.При этом используются все файлы из индекса .Файлы, которые находятся в индексе:
Те, которые были в индексе, когда вы начали, и все еще там, потому что вы не изменили их с тех пор: они попали туда, потому что вы запустилиgit checkout
некоторого существующего коммита.
Те, что сейчас в индексе, потому что вы запустили git add <em>file</em>
.Это скопировало файл file
из вашего рабочего дерева в ваш индекс.Если раньше в индексе была копия file
(потому что она была в коммите, который вы извлекли), то теперь в индексе есть другая копия.Если не было файла с именем file
в индексе раньше (по любой причине), то теперь - это .
Индекс также называется областью подготовки .Когда вы используете git status
, Git сравнивает содержимое индекса с HEAD
(текущим) содержимым коммита и сообщает вам, что отличается , говоря, что это изменения, подготовленные для коммита .
Файлы в индексе называются отслеженные файлы.
Удаление отслеженной копии файла
Вы можете использовать git rm --cached <em>file</em>
для удаления index копия любого файла, не касаясь work-tree копии этого файла.Так что, если .idea/somefile
находится в индексе прямо сейчас , вы можете удалить его с помощью git rm --cached .idea/somefile
.Вы можете удалить все файлы в индексе, которые начинаются с .idea/
, используя git rm -r --cached .idea
: это не коснется вашего рабочего дерева (где вы можете просматривать свои файлы и работать с ними), но удалит все .idea/*
и .idea/**/*
файлы из индекса.
Старые коммиты не изменятся;это представляет новую опасность
Независимо от того, что вы делаете сейчас , любой коммит, в котором было .idea/somefile
, будет иметь .idea/somefile
в дальнейшем.Этот коммит нельзя изменить; самое большее, что вы можете сделать, это прекратить его использовать.Например, вы можете сделать новый и улучшенный коммит, который имеет все те же файлы в тех же версиях, за исключением , в котором пропущено .idea/somefile
.Затем вместо исходного коммита (в котором по-прежнему содержится .idea/somefile
) вы используете новый коммит (которого нет), поэтому Git не пытается создать .idea/somefile
при извлечении нового коммита.
Но предположим, что вы do проверили старый коммит.Когда вы сделаете это, .idea/somefile
будет в этого старого коммита.Этот файл будет скопирован в ваш индекс (так что .idea/somefile
теперь возвращается в индекс ) и в ваше рабочее дерево (так что .idea/somefile
в вашем рабочем деревебыл заменен сохраненным из коммита).Если вы теперь решите переключиться со старого коммита обратно на новый коммит, который не имеет .idea/somefile
, Git увидит, что .idea/somefile
находится в вашем индексе и в вашемрабочее дерево, и что эти два соответствуют файлу в коммите, от которого вы удаляетесь.Так что Git удалит .idea/somefile
из и ваш индекс и вашего рабочего дерева и перейдет к новому коммиту.
Если эти файлыявляются важными и трудными для восстановления, вы должны стать очень осторожными при посещении исторических коммитов с файлами, как только вы сделали новые коммиты, которые не сохраняют эти файлы.Например, вы можете захотеть сначала удалить каталог .idea
(«папка») рабочего дерева, чтобы при извлечении Git старого коммита он создавал новый .idea
, который вы можете удалить, когда вывернуться к новым коммитам.
Обратите внимание, что Git вообще не хранит каталоги.Git хранит только файлы - и не по отдельности, а только внутри одного или нескольких коммитов.Всякий раз, когда вы извлекаете коммит, содержащий файл с именем .idea/somefile
, Git извлекает его , создает .idea/
, если это необходимо.Но .idea/
само по себе не в Git, просто .idea/somefile
.