Git: Отмена коммита
Последнее обновление
То, как отменить коммит, зависит от того, какой это коммит и был ли он запушен. Для старого коммита в глубине истории - или чего-то уже опубликованного - нужен git revert, который добавляет новый коммит, обращающий изменения, ничего не переписывая. Несколько последних локальных коммитов можно просто убрать с помощью git reset. А если нужно отменить только самый последний коммит, страница «git отменить последний коммит» разбирает все варианты этого быстрого исправления.
Попробуйте эти команды в терминальном playground - настоящий shell в вашем браузере, ничего устанавливать не нужно.
Какую команду использовать
| Situation | Command |
|---|---|
| Отменить один старый коммит, сохранив всё, что после него | git revert <hash> |
| Отменить уже запушенный коммит | git revert <hash> |
| Отменить последние 3 локальных коммита, сохранив работу | git reset --soft HEAD~3 |
| Отменить последние 3 локальных коммита, отбросив работу | git reset --hard HEAD~3 |
| Отменить диапазон новыми обратными коммитами | git revert HEAD~3..HEAD |
reset vs revert
| Behavior | git reset | git revert |
|---|---|---|
| Переписывает историю | Да | Нет |
| Безопасно для запушенных коммитов | Нет | Да |
| Создаёт новый коммит | Нет | Да |
| Работает со старыми коммитами в середине истории | Нет | Да |
| Может отбросить изменения | Да (--hard) | Нет |
Разобранный пример
Отмените конкретный старый коммит - даже уже запушенный - не трогая коммиты, которые идут после него.
| Step | Command | Result |
|---|---|---|
| 1 | git log --oneline | Найдите хеш плохого коммита (например, a1b2c3d) |
| 2 | git revert a1b2c3d | Новый коммит обращает его; последующие коммиты не тронуты |
| 3 | git push | Поделитесь исправлением - история не переписывалась |
FAQ по отмене коммита в Git
Как отменить старый коммит, не потеряв коммиты после него?
git revert <hash>. Revert создаёт новый коммит, который обращает только тот коммит, что вы указали - все коммиты после него остаются ровно такими, какими были. Сначала найдите хеш с помощью git log --oneline. Если revert конфликтует с более поздними изменениями, Git останавливается, чтобы вы могли разрешить конфликт и выполнить git revert --continue.Как отменить несколько коммитов сразу?
git reset --soft HEAD~3 убирает последние три, оставляя их изменения в индексе (используйте --hard, чтобы их отбросить). Для запушенных коммитов вместо этого ревертните диапазон: git revert --no-commit HEAD~3..HEAD обращает все три, а затем один git commit фиксирует отмену.Как отменить коммит, который я уже запушил?
git revert <hash> вместо reset. Revert создаёт новый коммит, отменяющий изменения целевого коммита, оставляя историю нетронутой. Это безопасный способ отмены общих коммитов - переписывание запушенной истории с помощью reset заставляет всех остальных согласовывать свои копии.