git reset: soft, mixed, hard

Команда для перемещения указателя ветки (HEAD) назад по истории с разной степенью «жёсткости» — от сохранения всех изменений до полного сброса.

Зачем нужно

git reset позволяет отменить коммиты и вернуть репозиторий к более раннему состоянию. Три режима дают выбор: сохранить изменения в staging (--soft), сохранить в рабочей директории (--mixed), или полностью выбросить (--hard). Это основной инструмент для исправления ошибок в локальной истории до публикации.

Где используется

  • Отмена последнего коммита с сохранением изменений (--soft)
  • Вывод файлов из staging area (--mixed, без указания коммита)
  • Полный сброс рабочей директории до чистого состояния (--hard)
  • Объединение нескольких локальных коммитов в один перед push

Основной контент

Три режима reset

                  HEAD    Staging   Рабочая директория
--soft            ←       без изм.  без изм.
--mixed (default) ←       ←         без изм.
--hard            ←       ←         ←

Команды

# Отменить последний commit, изменения остаются в staging
git reset --soft HEAD~1

# Отменить последний commit, изменения в рабочей директории (не в staging)
git reset --mixed HEAD~1
# или просто:
git reset HEAD~1

# Отменить последний commit и выбросить все изменения (НЕОБРАТИМО)
git reset --hard HEAD~1

# Сбросить к конкретному коммиту
git reset --hard abc1234

# Сбросить к состоянию remote (выбросить все локальные коммиты)
git reset --hard origin/main

# Убрать файл из staging (без изменения рабочей директории)
git reset HEAD src/app.js
# или в Git 2.23+:
git restore --staged src/app.js

Практические сценарии

# Сценарий 1: объединить 3 коммита в один перед push
git reset --soft HEAD~3
git commit -m "feat: реализовать корзину"

# Сценарий 2: случайно закоммитил не в ту ветку
git reset --soft HEAD~1      # вернуть изменения в staging
git switch correct-branch
git commit -m "feat: ..."    # закоммитить в правильной ветке

# Сценарий 3: полностью сбросить рабочую копию к remote
git fetch origin
git reset --hard origin/main

# Сценарий 4: убрать файл из staging без потери изменений
git reset HEAD .env

Сравнение reset и revert

Команда Что делает Когда использовать
reset Перемещает HEAD, удаляет коммиты из истории Только локальные коммиты
revert Создаёт новый коммит, отменяющий изменения Опубликованные коммиты

Частые ошибки

  • git reset --hard на опубликованной ветке — перезапишет историю для всей команды; используй git revert
  • Потерять изменения после --hardgit reset --hard необратим для незакоммиченных изменений; проверяй git status заранее
  • Путать HEAD~1 и HEAD^ — оба означают «предыдущий коммит», HEAD~2 — два коммита назад
  • Забыть про git reflog — если случайно сбросил нужное, git reflog поможет найти потерянный коммит

Связанные темы

Ресурсы