Ответ
Команда git reset перемещает указатель текущей ветки (HEAD) на указанный коммит, при этом изменяя состояние индекса (staging area) и рабочей директории. Это основной инструмент для отмены изменений в истории Git.
Основные режимы работы:
-
git reset --soft <commit>- Действие: Перемещает HEAD на указанный коммит, но оставляет все изменения из отменённых коммитов в индексе (как проиндексированные).
- Использование: Для перекоммита истории (объединения нескольких коммитов в один).
-
git reset --mixed <commit>(режим по умолчанию)- Действие: Перемещает HEAD и сбрасывает индекс до состояния указанного коммита, но сохраняет все изменения в рабочей директории как неиндексированные (modified).
- Использование: Чтобы отменить коммит, но оставить изменения в файлах для доработки — самый частый сценарий.
-
git reset --hard <commit>- Действие: Полностью сбрасывает состояние репозитория (HEAD, индекс и рабочую директорию) к состоянию указанного коммита. Все последующие изменения безвозвратно удаляются.
- Использование: Для полного отката к предыдущему состоянию. Требует крайней осторожности, так как данные не попадают в корзину.
Практические примеры:
# Отменить последний коммит, оставив его изменения проиндексированными
git reset --soft HEAD~1
# Отменить последний коммит, оставив изменения в рабочей папке (неиндексированными)
git reset HEAD~1 # аналог git reset --mixed HEAD~1
# Полностью удалить последний коммит и все связанные с ним изменения в файлах
git reset --hard HEAD~1
# Откатить изменения до коммита с определённым хэшем
git reset --hard a1b2c3d
Важно: git reset --hard — опасная команда. Её стоит использовать, только если вы уверены, что изменения больше не понадобятся, или они сохранены в другой ветке.