Как удалить файл из индекса в git?
Как удалить файл из индекса ( = область хранения = кэш), не удаляя его из файловой системы?
7 ответов
Ты хочешь:
git rm --cached [file]
Если вы опустите --cached
Опция также удалит его из рабочего дерева. git rm
немного безопаснее, чем git reset
потому что вы будете предупреждены, если поставленное содержимое не соответствует ни кончику ветви, ни файлу на диске. (Если это не так, вы должны добавить --force
.)
Это должно отменить удаление файла
git reset HEAD <file>
git reset HEAD <file>
для удаления конкретного файла из индекса.
а также
git reset HEAD
для удаления всех проиндексированных файлов.
Только использовать git rm --cached [file]
чтобы удалить файл из индекса.
git reset <filename>
может использоваться для удаления добавленных файлов из индекса, если файлы никогда не фиксируются.
% git add First.txt
% git ls-files
First.txt
% git commit -m "First"
% git ls-files
First.txt
% git reset First.txt
% git ls-files
First.txt
НОТА: git reset First.txt
не влияет на индекс после фиксации.
Это подводит меня к теме git restore --staged <file>
. Его можно использовать для (предположительно после первой фиксации) удаления добавленных файлов из индекса, если файлы никогда не фиксируются.
% git add Second.txt
% git status
On branch master
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
new file: Second.txt
% git ls-files
First.txt
Second.txt
% git restore --staged Second.txt
% git ls-files
First.txt
% git add Second.txt
% git commit -m "Second"
% git status
On branch master
nothing to commit, working tree clean
% git ls-files
First.txt
Second.txt
Desktop/Test% git restore --staged .
Desktop/Test% git ls-files
First.txt
Second.txt
Desktop/Test% git reset .
Desktop/Test% git ls-files
First.txt
Second.txt
% git rm --cached -r .
rm 'First.txt'
rm 'Second.txt'
% git ls-files
tl; dr Посмотрите на последние 15 строк. Если вы не хотите, чтобы вас путали с первой фиксацией, второй фиксацией, перед фиксацией, после фиксации.... всегда используйтеgit rm --cached [file]
По моему скромному мнению и моему опыту работы с git, область подготовки - это не то же самое, что index. Конечно, я могу ошибаться, но, как я уже сказал, мой опыт использования git и моя логика говорят мне, что этот индекс - это структура, которая следует за вашими изменениями в вашей рабочей области (локальном репозитории), которые не исключаются игнорированием настроек и промежуточной области - хранить файлы, фиксацию которых уже подтверждены, то есть файлы в индексе, для которого была запущена команда добавления. Вы не замечаете и не понимаете эту "небольшую" разницу, потому что используетеgit commit -a -m "comment"
добавление индексированных и кэшированных файлов в рабочую область и фиксация одной командой или слишком частое использование IDE, таких как IDEA. Кеш - это то, что хранит изменения в индексированных файлах. Если вы хотите удалить файл из индекса, который ранее не был добавлен в промежуточную область, варианты, предложенные перед вами, подходят для вас, но... Если вы это уже сделали, вам нужно будет использовать
Git restore --staged <file>
И, пожалуйста, не спрашивайте меня, где я был 10 лет назад... Я скучал по тебе, этот ответ для будущих поколений)
В зависимости от вашего рабочего процесса, это может быть тот тип вещей, которые вам нужны достаточно редко, так что нет смысла пытаться найти решение для командной строки (если вы по какой-то причине не работаете без графического интерфейса).
Просто используйте один из инструментов на основе графического интерфейса, которые поддерживают управление индексами, например:
git gui
<- использует оконную инфраструктуру Tk - стиль, аналогичныйgitk
git cola
<- более современный графический интерфейс
Они позволяют перемещать файлы в индекс и выходить из него одним щелчком мыши. Они даже поддерживают выбор и перемещение частей файла (отдельные изменения) в индекс и из индекса.
Как насчет другой точки зрения: если вы запутались, используя одну из предложенных, довольно загадочных команд:
git rm --cached [file]
git reset HEAD <file>
... у вас есть реальная возможность потерять данные или, по крайней мере, затруднить их поиск. Если вам действительно не нужно делать это с очень высокой частотой, использование инструмента с графическим интерфейсом будет более безопасным.
Работа без индекса
Основываясь на комментариях и голосах, я понял, что многие люди используют индекс все время. Я не. Вот как:
- Передайте всю мою рабочую копию (типичный случай):
git commit -a
- Зафиксируйте всего несколько файлов:
git commit (list of files)
- Зафиксируйте все, кроме нескольких измененных файлов:
git commit -a
затем изменить черезgit gui
- Графически просмотрите все изменения в рабочей копии:
git difftool --dir-diff --tool=meld
git rm --cached -r .
Используйте для удаления всех файлов из промежуточной области.