Git restore: убрать лишнее и сохранить нужное

Рабочая директория, индекс и HEAD: разбираемся на одном файле.

Когда в коммит случайно попадает лишний файл, не обязательно отменять всю работу. Сначала определите, где лежат изменения: только в рабочей директории или уже в индексе. От этого зависит следующая команда.

Сначала посмотреть

Предположим, вы редактировали README.md и подготовили его к коммиту. Две команды показывают разные сравнения: обычный diff — рабочую директорию относительно индекса, staged — индекс относительно последнего коммита.

bash
git status --short
git diff -- README.md
git diff --staged -- README.md

Пустой вывод первой команды diff ещё не означает, что изменений нет: они могли целиком оказаться в индексе. Поэтому полезно проверять оба сравнения.

Убрать файл из будущего коммита

bash
git restore --staged -- README.md

Содержимое рабочей копии сохранится. Изменится только индекс: версия файла в нём вернётся к HEAD. Можно продолжить редактирование и добавить файл позже.

Отбросить локальную правку

bash
git restore -- README.md

Здесь рабочая копия заменяется содержимым из индекса. Незакоммиченные правки, отсутствующие в индексе, будут потеряны. Если они могут пригодиться, сначала сохраните копию файла. Для частичного восстановления используйте git restore -p -- README.md и внимательно прочитайте каждый предлагаемый фрагмент.

Проверить результат

Повторите status и оба diff. Хороший результат — не обязательно чистая рабочая директория, а именно тот набор изменений, который вы собирались включить в коммит. Restore управляет содержимым файлов и индекса; для отмены уже опубликованного коммита предназначен другой инструмент — revert.

Документация

Git: git-restore ↗