git restore: вернуть файл и вынуть его из индекса
Обновлено 31 июля 2026 г.
git restore отменяет сделанное на уровне файла: с флагом --staged убирает файл из индекса, без флага возвращает его к виду из последнего коммита. Отмена в git разложена по уровням, и эта команда закрывает два нижних.
Первый уровень: файл уже лежит в индексе (staging area), а коммитить его ты передумал.
$ git status --short
M report.txt
$ git restore --staged report.txt
$ git status --short
M report.txtДва столбца в коротком выводе git status читаются так: первый - индекс, второй - рабочий каталог. M значит «изменение отобрано в индекс», M - «изменение есть только в файле». Команда переносит букву из первого столбца во второй и ничего не теряет: git add вернёт всё как было.
Второй уровень: правки в самом файле оказались мусором и файл надо вернуть к последнему коммиту.
$ git restore report.txt
$ git status
On branch main
nothing to commit, working tree cleanТут стоит притормозить. Файл затёрт содержимым из архива, а правки, которых git ни разу не видел, пропали навсегда: восстанавливать ему нечего. Перед такой командой полезно глянуть git diff.
Источник по умолчанию - индекс, а когда в индексе ничего не отложено, там лежит содержимое последнего коммита. Взять версию из другого коммита можно флагом --source:
$ git restore --source=HEAD~1 report.txt # версия из предпоследнего коммита
$ git restore . # откатить все файлы в текущем каталогеСлучайно стёртый файл возвращается той же командой: после rm report.txt выполни git restore report.txt, и файл снова окажется на диске.
Частые ошибки
--staged часто принимают за полную отмену. Флаг трогает только индекс, содержимое файла на диске остаётся прежним. Чтобы вычистить обе зоны сразу, нужны оба флага: git restore --staged --worktree report.txt.
Вторая ловушка - советы из статей, написанных до 2019 года: там для тех же задач предлагают git checkout -- file и git reset HEAD file. Команды рабочие и никуда не делись, но у каждой из них несколько несвязанных ролей. В версии 2.23 роли развели: git switch переключает ветки, git restore восстанавливает файлы, git reset двигает указатель ветки.
Где это в учебнике
Отмена по уровням разобрана в четвёртой главе, там же про git diff и .gitignore.
Глава 4. Посмотреть, отменить, спрятать лишнее
Потренироваться руками - в интерактивном уроке Отмена изменений.