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