mrsaynothing.dev
git undo, cancel, revert — отмена commit с сохранением изменений, любым словом

> git undo, cancel, revert — отмена commit с сохранением изменений, любым словом▋

Все запросы keep-changes из нашей собственной поисковой доски — undo, cancel, revert — разобраны на одной странице: команда под каждую ситуацию, ловушка --hard и reflog как страховочная сетка.

mrsaynothing· 11 октября 2026 г.· 6 мин чтения

✦ фиксgit reset --soft HEAD~1

Git поставляет пять глаголов для возврата кода — undo, cancel, revert, reset, restore — и ни один из них на самом деле не называется undo. Где-то очень гордится собой словарь синонимов.

Вот во что обходится словарь. На прошлой неделе головной запрос семьи — git undo last commit keep changes — собрал 73 показа на позиции 11.1 без единого клика, с ростом +100% неделя к неделе, и в сопровождении четырёх кузенов с другим написанием. Люди не путаются в git. Они боятся --hard, и каждый дежурный туториал отвечает на этот страх единственным флагом, который его подтверждает. Эта страница проходит семью сверху вниз: выберите глагол, сверьтесь с таблицей и только потом трогайте историю.

все reset revert restore stash
Глагол, который набирают Что git делает на самом деле Сохраняет работу? Команда
"undo" Метка ветки отступает на commit; изменения возвращаются в staging Да — в индексе git reset --soft HEAD~1
"cancel" Reset по умолчанию: метка отступает, изменения возвращаются, но без staging Да — в рабочем дереве git reset HEAD~1
"revert" Добавляется новый commit, отменяющий старый; история никогда не переписывается Да — как обратный diff git revert HEAD
"unstage" Пути покидают индекс; содержимое файлов не тронуто Да — из рабочего дерева ничего не ушло git restore --staged file.txt
"отложи на потом" Работа упаковывается и ставится на полку, куда можно вернуться Да — в стеке stash git stash push -m "wip"

Единственное решение, которое имеет значение

commit, о котором жалеете? начните здесь да — кто-то его скачал нет — он всё ещё ваш git revert HEAD история получает обратный commit — ничего скачанного не переписывается git reset --soft HEAD~1 метка отступает, работа возвращается в staging плохое изменение отменено публичной аддитивной историей закоммитьте как следует та же работа, лучшее сообщение или разбивка
fig 1 — отправлено или нет: единственный вопрос, выбирающий глагол. Обе дороги сохраняют работу; undo-генератор ниже принимает весь хаос на вход.

Как отменить последний commit, сохранив изменения?

git reset --soft HEAD~1 — метка ветки отступает на один commit, и всё сделанное возвращается в staging. Ничего не удаляется, ничего не покидает индекс; можно закоммитить заново с лучшим сообщением или разбить работу. Полный разбор, включая случай с push, — в git undo last commit: keep changes, stay safe.

verify: после reset команда git status должна показать ваши файлы в блоке «Changes to be committed» — это ваша работа, возвращённая вам.

"git undo commit keep changes" значит что-то другое?

Нет — тот же вопрос, тот же ответ. «Undo» никогда не был командой git; наша доска показывает оба написания, нацеленные на идентичные проблемы, и оба решаются reset --soft. Когда люди говорят undo, они имеют в виду двинь метку, сохрани работу — единственное, что soft reset делал вообще всегда.

Почему у "git revert last commit keep changes" другой ответ?

Потому что revert — единственный член семьи, который добавляет историю, а не перематывает её. git revert HEAD создаёт новый commit, чей diff отменяет старый — «сохранение изменений» происходит само, плохой commit остаётся в журнале, а рабочее дерево остаётся без него. Это правильный инструмент, как только кто-то чужой скачал ветку; развилка reset-vs-revert размечена в git revert vs reset: which one saves your history?

Revert = публичная отмена. Он никогда не переписывает то, что у других уже есть; он отменяет изменение новым, аддитивным commit'ом.

"git cancel commit" — это настоящая команда?

Нет — cancel это разговорная речь, а перевод разговорной речи на git — reset. «Cancel commit but keep changes» и «cancel last commit but keep changes» — ещё два написания той же недели на нашей доске — оба сводятся к git reset --soft HEAD~1. Git заботят только метка, которую вы двигаете, и флаг, который вы передаёте; словарный запас приносите с собой.

Можно удалить commit, который никто не скачивал?

Да — неотправленный commit всё ещё ваш, и его можно перекроить без последствий. reset --soft сохраняет работу, reset HEAD~1 сохраняет её без staging, и только --hard её выбрасывает — единственный «несохраняющий» глагол на этой странице. Если commit вообще не ваш и на него ничто не ссылается, соберёт его в итоге git gc, а не вы.

Можно сделать stash одного файла?

Да — git stash push -m "wip" -- src/app.ts откладывает один путь и не трогает остальное дерево. Разделитель -- как раз ограничивает stash именованными путями. Пограничные случаи одного файла — включая то, почему stash переживает checkout, — живут в git stash a single file without losing the rest.

Можно cherry-pick нескольких commit'ов?

Да — диапазон: git cherry-pick A^..B берёт все commit'ы после A до B включительно, по порядку. Добавьте -n, если хотите получить их в staging одной кучей вместо отдельных коммитов. Руководство по конфликтам для трудных диапазонов — в git cherry pick: multiple commits, branches, conflicts.

Как cherry-pick несколько commit'ов из другой ветки?

Тот же диапазон работает между ветками: git switch target && git cherry-pick A^..B. Git разрешает commit'ы из исходной ветки и повторяет их на вашей — ждите конфликтов там, где ветки разошлись, и разбирайте их по одному, а не скопом.

Можно вернуть потерянный commit?

Почти всегда да — reflog помнит, где был HEAD, около 90 дней по умолчанию (gc.reflogExpire в git). Найдите потерянный hash через git reflog, затем git reset --soft HEAD@{1}, чтобы вернуть его под рабочее дерево. Вы ничего не отменяете — вы двигаете метку, пока git тихо хранит квитанции.

Какой git undo использовать?

Тот, что в таблице выше, честно — а если хотите, чтобы выбрала машина: git-undo генератор принимает ваш хаос на вход и печатает точную команду, а его релизный пост показывает рассуждение по каждому случаю. Все проверенные спасения кластера сложены в хабе git-undo.

Ловушка в комнате: --soft, --mixed, --hard

Флаг решает, куда приземлится работа, и опасен лишь один из трёх. --soft вернёт её в staging, --mixed (по умолчанию) — без staging, --hard подгоняет всё под целевой commit и выбрасывает остальное. Если вы уже набрали --hard в панике: reflog держит commit ещё ~90 дней — git reflog, затем reset на hash. Глагол, набранный в первые пять секунд, не решает ничего навсегда; дневник git длиннее вашего сожаления.

Какое написание привело вас сюда — undo, cancel или revert? Скажите в комментариях; генератор принимает все три, а самое странное станет следующим постом. Доска говорит, что большинство набрало undo — данные были здесь раньше совета.

$ Поделиться

$ Следующий гайд — на почту

Одно письмо на пост. Починил — пошёл дальше.

self-hosted · никаких третьих сторон · отписка в один клик

Одно письмо, еженедельная сводка. Ноль пикселей.

что это?