Git restore: убрать лишнее и сохранить нужное
Рабочая директория, индекс и HEAD: разбираемся на одном файле.
Когда в коммит случайно попадает лишний файл, не обязательно отменять всю работу. Сначала определите, где лежат изменения: только в рабочей директории или уже в индексе. От этого зависит следующая команда.
Сначала посмотреть
Предположим, вы редактировали README.md и подготовили его к коммиту. Две команды показывают разные сравнения: обычный diff — рабочую директорию относительно индекса, staged — индекс относительно последнего коммита.
git status --short
git diff -- README.md
git diff --staged -- README.mdПустой вывод первой команды diff ещё не означает, что изменений нет: они могли целиком оказаться в индексе. Поэтому полезно проверять оба сравнения.
Убрать файл из будущего коммита
git restore --staged -- README.mdСодержимое рабочей копии сохранится. Изменится только индекс: версия файла в нём вернётся к HEAD. Можно продолжить редактирование и добавить файл позже.
Отбросить локальную правку
git restore -- README.mdЗдесь рабочая копия заменяется содержимым из индекса. Незакоммиченные правки, отсутствующие в индексе, будут потеряны. Если они могут пригодиться, сначала сохраните копию файла. Для частичного восстановления используйте git restore -p -- README.md и внимательно прочитайте каждый предлагаемый фрагмент.
Проверить результат
Повторите status и оба diff. Хороший результат — не обязательно чистая рабочая директория, а именно тот набор изменений, который вы собирались включить в коммит. Restore управляет содержимым файлов и индекса; для отмены уже опубликованного коммита предназначен другой инструмент — revert.