↓Перейти к содержанию
  1. Git: руководства и команды/

Как отменить изменения в файле Git: полное руководство

·5 минут·

Вы редактировали файл, а потом поняли, что всё пошло не так. Или случайно изменили не тот файл. Git позволяет безопасно отменить изменения на любом этапе — в рабочей директории, в индексе или из конкретного коммита. Это руководство охватывает все ситуации.

Отмена неопубликованных изменений в файле #

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

# Новый способ (Git 2.23+, рекомендуется)
git restore path/to/file.js

# Старый способ (работает во всех версиях Git)
git checkout -- path/to/file.js

Внимание: эта операция необратима. Несохранённые изменения будут потеряны без возможности восстановления через Git. Перед отменой убедитесь, что они вам не нужны, или сохраните их через git stash.

Просмотреть изменения перед отменой:

# Посмотреть что изменилось
git diff path/to/file.js

# Убедившись, что изменения не нужны — отменить
git restore path/to/file.js

Отмена изменений нескольких файлов сразу #

# Отменить изменения всех файлов в рабочей директории
git restore .

# Отменить изменения в конкретной директории
git restore src/

# Отменить изменения нескольких конкретных файлов
git restore file1.js file2.js file3.css

Отмена поставленных в индекс изменений (unstage) #

Вы выполнили git add, но передумали включать файл в следующий коммит. Нужно убрать его из индекса (staging area), сохранив изменения в файле.

# Убрать файл из индекса (новый способ)
git restore --staged path/to/file.js

# Убрать файл из индекса (старый способ)
git reset HEAD path/to/file.js

# Убрать все файлы из индекса
git restore --staged .

После выполнения файл останется изменённым в рабочей директории, но больше не будет в следующем коммите.

Убрать из индекса И отменить изменения #

Если нужно одновременно убрать файл из индекса и вернуть его к версии последнего коммита:

# Убрать из индекса и отменить изменения в файле
git restore --staged --worktree path/to/file.js

# Аналогично
git checkout HEAD -- path/to/file.js

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

Иногда нужно вернуть файл не к последнему коммиту, а к определённой версии из истории:

# Восстановить файл из предыдущего коммита
git restore --source=HEAD~1 path/to/file.js

# Восстановить из коммита два шага назад
git restore --source=HEAD~2 path/to/file.js

# Восстановить из конкретного коммита по хешу
git restore --source=a1b2c3d path/to/file.js

# Посмотреть содержимое файла в конкретном коммите (без восстановления)
git show a1b2c3d:path/to/file.js

После git restore --source=<commit> файл окажется в рабочей директории с изменениями, готовыми для добавления в индекс. Изменения не будут автоматически добавлены в git add.

Восстановление удалённого файла #

Если файл был удалён, но изменение ещё не закоммичено:

# Восстановить удалённый файл
git restore path/to/deleted-file.js

# Если файл был удалён через git rm (попал в индекс)
git restore --staged --worktree path/to/deleted-file.js

Если файл был удалён и закоммичен, нужно знать коммит, в котором он существовал:

# Найти коммит, где файл был удалён
git log --oneline --all -- path/to/deleted-file.js

# Восстановить из коммита перед удалением
git restore --source=a1b2c3d path/to/deleted-file.js
git add path/to/deleted-file.js
git commit -m "Восстановить удалённый файл"

git restore vs git checkout: различия #

До Git 2.23 единственным инструментом для отмены изменений был git checkout. Он делал слишком много вещей: переключал ветки, восстанавливал файлы, создавал ветки. Это путало новичков.

В Git 2.23 появились две специализированные команды:

  • git switch — для переключения веток
  • git restore — для восстановления файлов
# Старый способ (работает, но устарел)
git checkout -- file.js           # восстановить файл
git checkout HEAD -- file.js      # из последнего коммита
git checkout a1b2c3d -- file.js   # из конкретного коммита

# Новый способ (рекомендуется)
git restore file.js
git restore --source=HEAD file.js
git restore --source=a1b2c3d file.js

Оба варианта работают. Для новых проектов и при изучении Git рекомендуется git restore — он понятнее по смыслу.

Интерактивная отмена изменений #

Можно отменить только часть изменений в файле — выбрать конкретные «hunks» (блоки изменений):

# Интерактивный режим — выбрать какие изменения отменить
git restore -p path/to/file.js
# или
git checkout -p path/to/file.js

Git будет показывать каждый блок изменений и предлагать выбор: y (отменить), n (оставить), s (разбить на меньшие блоки), q (выйти).

Если случайно отменили нужные изменения #

Если вы случайно выполнили git restore и потеряли незакоммиченные изменения — к сожалению, Git не сохраняет несохранённые изменения рабочей директории, и их нельзя восстановить стандартными средствами Git.

Однако если вы используете IDE с системой local history (например, IntelliJ IDEA, VS Code с плагином Local History) — изменения могут быть там.

Если же вы выполнили git restore после git add (то есть файл был в индексе), шансы на восстановление выше через git reflog:

git reflog
# Посмотреть историю операций
# Найти момент до отмены

Практические примеры #

# Просмотр изменений перед отменой
git diff path/to/file.js
git diff --staged path/to/file.js  # если файл в индексе

# Отменить изменения в рабочей директории
git restore path/to/file.js

# Убрать из индекса (не отменяя изменения)
git restore --staged path/to/file.js

# Отменить всё в рабочей директории
git restore .

# Восстановить из прошлого коммита
git restore --source=HEAD~3 path/to/file.js

# Восстановить удалённый файл
git restore path/to/deleted-file.js

# Просмотреть версию файла из конкретного коммита
git show HEAD~2:path/to/file.js

# История изменений конкретного файла
git log --oneline path/to/file.js

# Отменить только часть изменений в файле
git restore -p path/to/file.js

# Жёсткий сброс всего рабочего дерева к HEAD (осторожно!)
git reset --hard HEAD

Часто задаваемые вопросы #

Как безопасно отменить изменения без их потери? Используйте git stash перед отменой — он сохранит изменения в стеке: git stash push path/to/file.js. Потом можно восстановить через git stash pop.

Какая разница между git restore и git checkout? Функционально одинаковы для восстановления файлов. git restore — новая специализированная команда (Git 2.23+), более понятная по семантике. git checkout — старый универсальный инструмент, который также переключает ветки.

Что делать, если я отменил нужные изменения? Если изменения не были в индексе — скорее всего, восстановить через Git не получится. Проверьте local history вашей IDE. Если были в индексе — попробуйте git reflog.

Как отменить изменения только части файла? Используйте git restore -p path/to/file.js для интерактивного выбора блоков изменений.

Можно ли отменить удаление файла? Да, если удаление ещё не закоммичено — git restore path/to/deleted-file.js. Если уже закоммичено — git restore --source=<hash-before-deletion> path/to/deleted-file.js.

Заключение #

Для отмены изменений в файлах используйте git restore — это современный, специализированный инструмент. git restore <file> — для файлов в рабочей директории, git restore --staged <file> — для файлов в индексе, git restore --source=<commit> <file> — для восстановления из истории. Перед отменой всегда проверяйте изменения через git diff или git status.