reset и revert: отменяем изменения
Сделал неудачный коммит? Нужно откатиться? Git предлагает несколько способов — важно выбрать правильный.
Три инструмента отмены
| Команда | Что делает | Когда использовать |
|---|---|---|
git reset | Переписывает историю | Локальные ветки, до push |
git revert | Создаёт новый коммит-отмену | Shared ветки, после push |
git restore | Восстанавливает файлы | Отменить изменения в файлах |
git reset — переписать историю
git reset HEAD~1 # отменить последний коммит (--mixed по умолчанию)
git reset --soft HEAD~1 # убрать коммит → изменения в staging
git reset --mixed HEAD~1 # убрать коммит → изменения в working dir
git reset --hard HEAD~1 # убрать коммит → изменения УДАЛЕНЫТри режима — разная судьба изменений:
--soft — самый мягкий:
- История откатилась
- Изменения остались в staging (как будто сделал add, но не commit)
- Можно сразу перекоммитить с другим сообщением
--mixed (по умолчанию) — средний:
- История откатилась
- Изменения в working directory (надо делать add заново)
- Файлы не тронуты
--hard — самый жёсткий:
- История откатилась
- Изменения удалены
- Файлы приведены к состоянию целевого коммита
- Осторожно: без reflog не восстановить
Попробуй в симуляции
Выбери режим reset и запусти. Или посмотри что делает revert:
git revert — безопасная отмена
git revert HEAD # отменить последний коммит
git revert a3f7c21 # отменить конкретный коммит
git revert HEAD~3..HEAD # отменить последние 3 коммитаrevert добавляет новый коммит, который отменяет изменения. История не переписывается — все старые коммиты остаются.
До: C1 → C2 → C3 → C4 (HEAD)
После git revert C3:
C1 → C2 → C3 → C4 → C5 (Revert "...")
Это безопасно для shared веток: другие разработчики не теряют свою историю.
git restore — восстановить файлы
git restore файл.js # отменить изменения в working dir
git restore --staged файл.js # убрать из staging (не удаляя изменения)
git restore --source HEAD~2 файл # взять файл из 2 коммитов назадgit restore — современная замена части git checkout. Работает с файлами, не трогает историю коммитов.
git reflog — машина времени
git reflogd4e5f6a HEAD@{0}: reset --hard HEAD~1
a3f7c21 HEAD@{1}: commit: feat: профиль
7c8d9e0 HEAD@{2}: commit: fix: баг
Reflog хранит все перемещения HEAD за 90 дней. Даже после --hard reset коммиты не исчезли из Git — они просто недостижимы через ветки.
Восстановить «потерянный» коммит:
git reflog # найти хеш нужного состояния
git reset --hard a3f7c21 # вернуться к нему
# или
git switch -c recovery a3f7c21 # создать ветку из негоШпаргалка: что выбрать
Хочу переписать сообщение последнего коммита:
git commit --amend -m "правильное сообщение"Хочу добавить файл в последний коммит:
git add забытый-файл
git commit --amend --no-editХочу отменить последний коммит, но сохранить изменения:
git reset --soft HEAD~1Хочу откатить файл к версии из прошлого коммита:
git restore --source HEAD~2 auth.jsХочу отменить коммит который уже запушен:
git revert a3f7c21
git pushСлучайно сделал reset --hard и потерял работу:
git reflog # найти хеш
git reset --hard нужный-хешКоманды
git reset --soft HEAD~N # убрать N коммитов → staging
git reset --mixed HEAD~N # убрать N коммитов → working dir
git reset --hard HEAD~N # убрать N коммитов → удалить
git revert HEAD # отменить через новый коммит
git revert a3f7c21 # отменить конкретный коммит
git restore файл # восстановить файл
git restore --staged файл # убрать из staging
git reflog # журнал всех операций
git commit --amend # исправить последний коммитf0e1d2cinit: первый коммит4b5c6d7feat: авторизацияa3f7c21fix: баг с токеном7c8d9e0feat: профиль пользователяTARGETd4e5f6awip: черновикHEAD