Ответ
Есть несколько способов отката изменений в 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>