Как отменить коммит в Git — 3 команды под 3 разные ситуации

«Сделал коммит, а там опечатка / не те файлы / вообще зря» — и накатывает паника, будто работа потеряна. Расслабься: у Git редкая суперсила — он почти ничего не стирает насовсем. Даже «удалённые» коммиты какое-то время лежат в специальном журнале. Отменить коммит — дело одной команды. Всё, что нужно, — понять, какой именно из трёх случаев у тебя.
Шаг 1. Пойми, что именно отменяешь
Прежде чем что-то вводить, ответь на два вопроса:
- Коммит уже запушен на GitHub, или он пока только у тебя локально?
- Изменения из коммита ты хочешь сохранить (просто пересобрать коммит) или выбросить совсем?
От ответов зависит команда. Перепутать их — единственный способ реально потерять работу, так что тридцать секунд на диагностику окупаются.
Шаг 2. Локальный коммит — отменить, сохранив изменения
Самый частый случай: закоммитил рано, хочешь переделать. Коммит ещё не ушёл на сервер.
git reset --soft HEAD~1
HEAD~1 — «на один коммит назад». --soft означает: коммит распустить, но все изменения оставить — они снова лежат подготовленными к коммиту (staged). Правь и коммить заново. Если хочешь, чтобы изменения вернулись, но не были подготовлены, — git reset HEAD~1 без флага.
Важно: так делают, только пока коммит не запушен. Переписывать историю, которую уже видели другие, — путь к боли.
Шаг 3. Коммит уже запушен — откатывай через revert
Если коммит уже на GitHub, стирать его нельзя — у других он уже есть. Правильный ход — сделать новый коммит, который отменяет старый:
git revert <хеш_коммита>
Хеш подсмотри в git log. revert не переписывает историю — он добавляет сверху «противоположный» коммит, который аккуратно откатывает изменения. История честная, никто не сломается, можно спокойно пушить. Это и есть безопасный откат уже опубликованного.
Шаг 4. Нужно выбросить и коммит, и изменения
Коммит — мусор, и код из него не нужен вообще:
git reset --hard HEAD~1
--hard сносит и коммит, и изменения рабочей папки. Это единственная по-настоящему опасная команда из трёх — она стирает несохранённую работу. Используй, только когда точно уверен. Совет: перед --hard заведи запасную ветку командой git branch backup — тогда всё останется в ней.
Что получится
После нужной команды git log покажет историю без злополучного коммита (или с честным revert-коммитом сверху). Рабочий код — в том состоянии, которое ты выбрал: с сохранёнными изменениями или чистый. Паника отменяется.
Вопрос: git reset или git revert — что выбрать?
Простое правило: не запушено → reset, запушено → revert. reset переписывает историю и хорош, пока коммит только у тебя. revert дописывает отменяющий коммит сверху и безопасен для общей истории. Ещё команды — в шпаргалке для новичка.
Вопрос: я сделал reset --hard и всё пропало — реально вернуть?
Часто да. Введи git reflog — это журнал, где Git помнит, где был HEAD последние дни. Найди строчку с нужным коммитом и git reset --hard <хеш> вернёт тебя туда. Именно поэтому Git прощает почти любую ошибку: потерянное обычно ещё лежит в reflog.
Короткие уроки-истории, симулятор агента и ежедневная практика — в нашем мобильном приложении. Бесплатно.





