Git restore: как отменить изменения в файле до коммита

Категория: Git · Язык: Bash · Обновлено:

Чтобы вернуть файл к последнему сохранённому состоянию и отбросить правки, выполните git restore путь/к/файлу. Для файла, который уже добавлен в индекс командой git add, используйте git restore --staged путь/к/файлу. Старый способ: git checkout -- файл.

Что делает каждая команда

Задача

Команда

Отбросить правки в файле

git restore файл

Отбросить правки во всех файлах

git restore .

Убрать файл из индекса, сохранив правки

git restore --staged файл

Отбросить и правки, и индекс

git restore --staged --worktree файл

Взять файл из другого коммита

git restore --source=HEAD~2 файл

Удалить новые неотслеживаемые файлы

git clean -fd

Отменить правки в файле

Bash
git restore src/app.js           # вернуть файл к состоянию в индексе
git restore .                    # то же для всех изменённых файлов
git checkout -- src/app.js       # старый эквивалент, работает во всех версиях git

Убрать файл из индекса

Если вы случайно выполнили git add для лишнего файла:

Bash
git restore --staged src/secret.js   # файл останется изменённым, но не попадёт в коммит
git reset HEAD src/secret.js         # старый эквивалент

Вернуть файл из старого коммита

Bash
git restore --source=HEAD~2 src/app.js   # версия двухкоммитной давности
git restore --source=main src/app.js     # версия из другой ветки

Файл появится в рабочей папке как обычная правка, которую можно добавить в новый коммит.

Удалить неотслеживаемые файлы

git restore не трогает новые файлы, которые git ещё не отслеживает. Для них есть git clean. Сначала посмотрите, что будет удалено:

Bash
git clean -n        # показать список без удаления
git clean -fd       # удалить файлы и пустые папки
git clean -fdx      # то же, включая игнорируемые файлы

Частые вопросы

Чем restore отличается от reset?

git restore работает с файлами и не двигает ветку. git reset переносит указатель ветки на другой коммит и при режиме --hard перезаписывает все файлы.

Как отменить изменения только в одной части файла?

Используйте интерактивный режим: git restore -p файл. Git покажет блоки изменений по одному и спросит, отбросить ли каждый.