Как удалить файл из индекса в 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 .
Используйте для удаления всех файлов из промежуточной области.

Другие вопросы по тегам