/
Вопросы и ответы
/
Git
/

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

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

4 года назад

Andrey Moshkov

Ответы

16

Тут нужно понять, что именно необходимо сделать. Потому что под отменой часто понимают удаление последнего коммита. Удалить последний коммит можно очень просто с помощью команды git reset. Причём можно как сохранить изменения в рабочей директории, так и полностью удалить все изменения сделанные в последнем коммите.

1
2
git reset HEAD~ # удаляем только коммит
git reset --hard HEAD~ # удаляем коммит и изменения

А вот отменить изменения сделанные в последнем коммите можно с помощью команды git revert. Она делает еще один коммит, но с противоположными изменениями.

1
2
git revert aa600a43cb164408e4ad87d216bc679d097f1a6c
# нужно передать ей хеш коммита, который мы отменяем

4 года назад

Roman Ashikov

7

Обратите внимание, что команда git reset может быть опасна, поскольку она изменяет историю репозитория. Поэтому важно следить за тем, что вы делаете, и убедиться, что вы работаете над локальным репозиторием, а не с удаленным репозиторием, так как при изменении истории удаленного репозитория у других участников могут возникнуть проблемы с синхронизацией своих локальных репозиториев.

4 года назад

Сергей Мишин

0

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

Сначала определитесь, что именно нужно сделать. Ответ зависит от того, отправили вы коммит в удалённый репозиторий или нет.

Коммит ещё не отправлен (только локально)

Хочу убрать коммит, но оставить изменения в файлах

1
git reset HEAD~

Коммит исчезнет, файлы останутся изменёнными. Можно исправить и закоммитить снова.

Хочу убрать коммит и вернуть файлы к предыдущему состоянию

1
git reset --hard HEAD~

Файлы будут перезаписаны. Восстановить их после этого сложно — будьте внимательны.

Хочу исправить коммит, а не удалять

Если просто забыли добавить файл или опечатались в сообщении:

1
2
git add забытый_файл.py
git commit --amend -m "Правильное сообщение коммита"

--amend заменяет последний коммит новым. История не удлиняется.

Коммит уже отправлен в удалённый репозиторий

git reset в этом случае опасен: вы переписываете историю, и у остальных участников команды возникнут конфликты.

Правильный способ — создать новый коммит, который отменяет изменения:

1
git revert HEAD

Git создаст новый коммит с противоположными изменениями и откроет редактор для сообщения. Чтобы не открывал — добавьте флаг:

1
git revert HEAD --no-edit

После этого отправляйте в обычном режиме:

1
git push

Сравнение подходов

СитуацияКомандаМеняет историю
Коммит локальный, хочу переделатьgit reset HEAD~Да
Коммит локальный, хочу всё стеретьgit reset --hard HEAD~Да
Только исправить сообщение / добавить файлgit commit --amendДа
Коммит уже в удалённом репозиторииgit revert HEADНет

Главное правило

Если коммит уже в удалённом репозитории — используйте только git revert. git reset в этом случае сломает историю у всех, кто уже получил этот коммит.

6 месяцев назад

Никита Вихров

0

Если коммит ещё не отправлен на сервер, отмените его командой git reset --soft HEAD~1. Коммит исчезнет, а изменения останутся в файлах и в индексе: их можно поправить и закоммитить заново.

1
git reset --soft HEAD~1

Если коммит уже отправлен в общий репозиторий, используйте git revert HEAD: Git создаст новый коммит, который отменяет изменения последнего.

Какую команду выбрать

СитуацияКомандаЧто станет с изменениями
Коммит не отправлен, изменения нужныgit reset --soft HEAD~1остаются в индексе, готовы к новому коммиту
То же, но убрать файлы из индексаgit reset HEAD~1остаются в файлах, не добавлены в индекс
Коммит не отправлен, изменения не нужныgit reset --hard HEAD~1удаляются
Коммит уже на сервереgit revert HEADотменяются новым коммитом, история сохраняется
Исправить только сообщение или добавить забытый файлgit commit --amendпоследний коммит заменяется исправленным

HEAD~1 — коммит перед последним. Отменить три последних коммита: HEAD~3.

Исправить последний коммит

Забыли добавить файл или опечатались в сообщении:

1
2
git add forgotten.txt
git commit --amend -m "Исправленное сообщение"

Чтобы оставить старое сообщение: git commit --amend --no-edit.

Коммит уже отправлен

В общей ветке историю не переписывают: у коллег уже есть ваш коммит. Создайте отменяющий коммит и отправьте его:

1
2
git revert HEAD --no-edit
git push

Если ветка ваша и её никто не забирал, можно переписать историю и отправить с принудительной заменой:

1
2
git reset --hard HEAD~1
git push --force-with-lease

--force-with-lease откажется перезаписывать ветку, если в ней появились чужие коммиты.

В коммит попал лишний файл

Например, .env с паролями. Уберите файл из репозитория, но оставьте на диске:

1
2
3
git rm --cached .env
echo ".env" >> .gitignore
git commit -m "Убрать .env из репозитория"

Файл останется в истории предыдущих коммитов. Если в нём были пароли или ключи, считайте их утёкшими и замените. Удалить файл из всей истории можно утилитой git filter-repo.

Если отменили лишнее

git reflog хранит историю перемещений HEAD, в том числе после reset --hard:

1
2
3
4
git reflog
# a1b2c3d HEAD@{0}: reset: moving to HEAD~1
# e4f5g6h HEAD@{1}: commit: Добавить форму входа
git reset --hard e4f5g6h

Работу с историей и отмену изменений разбирают в бесплатном курсе «Основы Git».

25 дней назад

Никита Вихров

+7 800 100 22 47

бесплатно по РФ

+7 495 085 21 62

бесплатно по Москве

108813 г. Москва, вн.тер.г. поселение Московский,
г. Московский, ул. Солнечная, д. 3А, стр. 1, помещ. 20Б/3
ОГРН 1217300010476
ИНН 7325174845