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

«Как откатить изменения в файле в Git?» — вопрос из категории DevOps, который задают на 24% собеседований PHP Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Есть несколько способов отката изменений в Git, в зависимости от того, на каком этапе находится файл.

1. Откат незакоммиченных изменений в рабочей директории

Если вы еще не добавили файл в индекс (git add), чтобы отменить все локальные правки и вернуть файл к состоянию последнего коммита:

git restore <file>
# Или устаревшая, но знакомая команда:
# git checkout -- <file>

2. Откат изменений, добавленных в индекс (staged)

Если вы выполнили git add, но еще не закоммитили:

# Убираем файл из индекса, но сохраняем изменения в рабочей директории
git restore --staged <file>
# Затем, если нужно, откатываем и сами изменения в файле:
git restore <file>

3. Создание коммита, отменяющего предыдущий (revert)

Безопасный способ отменить изменения, уже попавшие в историю. Создает новый коммит с инверсными изменениями.

# Откатываем конкретный коммит
git revert <commit-hash>
# Откатываем последний коммит
git revert HEAD

4. «Удаление» коммита из истории (reset)

Опасно! Меняет историю. Используйте только в локальной ветке, если изменения не были отправлены в общий репозиторий.

# «Удаляет» последний коммит, но оставляет изменения в рабочей директории
git reset --soft HEAD~
# «Удаляет» последний коммит и убирает изменения из индекса
git reset HEAD~
# «Удаляет» последний коммит и полностью стирает изменения из файлов
git reset --hard HEAD~

5. Поиск и восстановление утерянных коммитов

Если вы уже сделали reset --hard и потеряли коммит, его можно найти и восстановить:

# Показать историю всех действий (включая «удаленные» коммиты)
git reflog
# Восстановить состояние на момент выбранного действия
git reset --hard <hash-from-reflog>