Глиф Учебники

Как отменить последний коммит

Справочник · Git · 2 минуты чтения

Как отменить

Способ зависит от того, отправлен ли коммит на сервер. Если не помните, посмотрите git status: строка Your branch is ahead of 'origin/main' (в русской версии Git — «Ваша ветка опережает…») значит, что коммит пока есть только у вас.

Коммит ещё не отправленуберите его

Уберите коммит, оставив изменения в файлах:

Bash
git reset --soft HEAD~1

Коммит исчезнет из истории, а все его изменения вернутся в индекс — как будто вы только что сделали git add. Можно поправить файлы и закоммитить заново. HEAD~1 — коммит перед текущим; убрать два последних — HEAD~2.

Коммит уже отправлен (git push)отмените его новым коммитом

Не удаляйте отправленный коммит, а отмените его новым коммитом с обратными изменениями:

Bash
git revert HEAD
git push

Почему так — в разделе Почему отправленный коммит не убирают через reset.

Какой вариант выбрать

НужноКоманда
Убрать коммит, изменения оставить в индексеgit reset --soft HEAD~1
Убрать коммит, изменения оставить в файлах, но не в индексеgit reset HEAD~1
Убрать коммит вместе с изменениямиgit reset --hard HEAD~1
Отменить отправленный коммитgit revert HEAD
Только поправить сообщение или добавить забытый файлgit commit --amend — см. Как изменить сообщение коммита

git reset --hard удаляет изменения убранного коммита и все незакоммиченные правки в рабочей папке. Перед ним проверьте git status: если там есть нужные правки, сначала сохраните их коммитом или через git stash.

Почему отправленный коммит не убирают через reset

reset переписывает историю: у вас коммита больше нет, а на сервере и у коллег он остался. Обычный git push после этого откажется, а принудительный (--force) заменит историю на сервере — и у всех, кто уже забрал коммит, история разойдётся с сервером. git revert ничего не переписывает: он добавляет коммит с обратными изменениями, и обмен идёт как обычно.

Отменить так можно любой коммит, не только последний: git revert 3e677f8. Если коммит — слияние веток, Git попросит указать сторону: git revert -m 1 хеш (1 — основная ветка, в которую сливали).

Если убрали лишнее

После git reset --hard коммит ещё можно найти. Команда git reflog показывает, где был HEAD после каждой команды:

Терминал
$ git reflog
27ca428 (HEAD -> main) HEAD@{0}: reset: moving to HEAD~1
00bcdfd HEAD@{1}: commit: Третий пункт

Строка commit перед reset — нужный коммит. Верните ветку на него:

Bash
git reset --hard 00bcdfd

Незакоммиченные правки, удалённые reset --hard, так не вернуть — их нет в истории.

Подводные камни