Продвинутый Git
1rebase: линейная история2stash: прячем незавершённую работу3reset и revert: отменяем изменения← вы здесь
Урок 3~12 минут

reset и revert: отменяем изменения

Сделал неудачный коммит? Нужно откатиться? Git предлагает несколько способов — важно выбрать правильный.

Три инструмента отмены

КомандаЧто делаетКогда использовать
git resetПереписывает историюЛокальные ветки, до push
git revertСоздаёт новый коммит-отменуShared ветки, после push
git restoreВосстанавливает файлыОтменить изменения в файлах

git reset — переписать историю

bash
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 — безопасная отмена

bash
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 — восстановить файлы

bash
git restore файл.js              # отменить изменения в working dir
git restore --staged файл.js     # убрать из staging (не удаляя изменения)
git restore --source HEAD~2 файл # взять файл из 2 коммитов назад

git restore — современная замена части git checkout. Работает с файлами, не трогает историю коммитов.

git reflog — машина времени

bash
git reflog
d4e5f6a HEAD@{0}: reset --hard HEAD~1
a3f7c21 HEAD@{1}: commit: feat: профиль
7c8d9e0 HEAD@{2}: commit: fix: баг

Reflog хранит все перемещения HEAD за 90 дней. Даже после --hard reset коммиты не исчезли из Git — они просто недостижимы через ветки.

Восстановить «потерянный» коммит:

bash
git reflog                    # найти хеш нужного состояния
git reset --hard a3f7c21      # вернуться к нему
# или
git switch -c recovery a3f7c21  # создать ветку из него

Шпаргалка: что выбрать

Хочу переписать сообщение последнего коммита:

bash
git commit --amend -m "правильное сообщение"

Хочу добавить файл в последний коммит:

bash
git add забытый-файл
git commit --amend --no-edit

Хочу отменить последний коммит, но сохранить изменения:

bash
git reset --soft HEAD~1

Хочу откатить файл к версии из прошлого коммита:

bash
git restore --source HEAD~2 auth.js

Хочу отменить коммит который уже запушен:

bash
git revert a3f7c21
git push

Случайно сделал reset --hard и потерял работу:

bash
git reflog   # найти хеш
git reset --hard нужный-хеш

Команды

bash
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               # исправить последний коммит
revert — для shared веток. reset — для локальной работы. Не путай.
reset и revert
История коммитов
f0e1d2cinit: первый коммит
4b5c6d7feat: авторизация
a3f7c21fix: баг с токеном
7c8d9e0feat: профиль пользователяTARGET
d4e5f6awip: черновикHEAD
Состояние
Staging
нет
Working Dir
нет
Режим reset
🎯
Миссия 1 из 4
Какой режим reset убирает коммит, но оставляет изменения в staging?