Что делает команда git reset и какие у неё есть режимы?

«Что делает команда git reset и какие у неё есть режимы?» — вопрос из категории Инструменты тестирования, который задают на 10% собеседований QA Тестировщик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Команда git reset перемещает указатель текущей ветки (HEAD) на указанный коммит, при этом изменяя состояние индекса (staging area) и рабочей директории. Это основной инструмент для отмены изменений в истории Git.

Основные режимы работы:

  1. git reset --soft <commit>

    • Действие: Перемещает HEAD на указанный коммит, но оставляет все изменения из отменённых коммитов в индексе (как проиндексированные).
    • Использование: Для перекоммита истории (объединения нескольких коммитов в один).
  2. git reset --mixed <commit> (режим по умолчанию)

    • Действие: Перемещает HEAD и сбрасывает индекс до состояния указанного коммита, но сохраняет все изменения в рабочей директории как неиндексированные (modified).
    • Использование: Чтобы отменить коммит, но оставить изменения в файлах для доработки — самый частый сценарий.
  3. 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 — опасная команда. Её стоит использовать, только если вы уверены, что изменения больше не понадобятся, или они сохранены в другой ветке.