Один коллега отвечал «git reset —hard» на любой вопрос об отмене — как другие отвечают «выключи и включи». Дважды прокатило. На третий раз заплатили пятницей после обеда и уроком reflog, который никто не вспоминает с теплом. Хаб Undo Anything in Git на этом сайте вырос из той недели — сегодня к нему добавился полноценный инструмент.
Генератор git undo запущен: три вопроса на входе, одна точная команда на выходе. Без аккаунта, без загрузок — всё работает в вашем браузере. Скажите, был ли commit запушен, сохраняете ли вы изменения и тянет ли ветку кто-то ещё — он напечатает правильный git reset, git revert или спасение через reflog, с предупреждением там, где команда кусается.
Зачем инструмент для четырёх команд?
Потому что поисковые данные говорят: людям нужен ответ, а не эссе. Google Search Console показывает этот сайт на позиции 12.3 по запросу «git reset last commit keep changes» — 27 показов за неделю, ноль кликов. Запрос кричит «дайте команду», а ищущий пролистывает всё, что заставляет его читать. Генератор отвечает на одном экране.
Тот же паттерн повторяется во всех вариантах: «and keep changes», «but keep changes», «keep the file». Никто не пишет диссертацию про версионирование. У них бардак прямо сейчас, и им нужен кратчайший выход.
Как генератор решает
Три вопроса, взятые прямо из руководства revert против reset:
- Где коммит? Не запушен, запушен или потерян совсем.
- Что с изменениями? Оставить застейдженными, оставить незастейдженными или выбросить.
- Кто ещё тянет эту ветку? Вопрос, отделяющий чистый rewrite от командного инцидента.
Вопрос про общую ветку — это и есть весь инструмент. Остальное — удобство; это — минимизация ущерба.
Его ответы целиком:
| Команда | История | Рабочее дерево | Общая ветка? |
|---|---|---|---|
git reset --soft HEAD~1 | откат на 1 | изменения сохранены, в стейдже | нет — rewrite |
git reset HEAD~1 | откат на 1 | изменения сохранены, вне стейджа | нет — rewrite |
git reset --hard HEAD~1 | откат на 1 | изменения выброшены | нет — деструктивно |
git revert HEAD | добавляет отменяющий коммит | не тронуто | да — безопасный ход |
git reflog + git switch -c recovery <sha> | ничего не потеряно | восстановлено из reflog | спасение после чего угодно |
Команды, которые он печатает
Все случаи, которые покрывает генератор, в копипаст-виде:
# закоммичено, не запушено, сохранить изменения в стейдже
git reset --soft HEAD~1
# закоммичено, не запушено, сохранить изменения вне стейджа
git reset HEAD~1
# запушено, ветку тянут другие — единственный вежливый откат
git revert --no-edit HEAD~1..HEAD
git push
# закоммичено и потеряно — reflog помнит ~90 дней
git reflog
git switch -c recovery <sha-из-списка> Форма диапазона HEAD~1..HEAD откатывает ровно названные коммиты без пересоздания по одному — стоит знать её, даже когда инструмент печатает её за вас.
Под капотом
Логика — таблица решений, никакой магии. Три вопроса дают восемнадцать комбинаций; большинство схлопывается в одну и ту же горстку команд, потому что «не запушено + выбросить» и «запушено + ветка моя + выбросить» различаются только хвостом force-with-lease. Страница — статический маршрут: без сервера, без аналитики, без cookie. Она откроется на телефоне в серверной — там и случается большинство git-аварий, — а кнопка копирования отдаёт блок целиком с предупреждающими комментариями.
Что он сознательно не делает
Никакой помощи с интерактивным rebase — если вы переставляете коммиты, вы знаете больше, чем учит инструмент. Никакой хирургии stash; у неё есть собственное руководство. И он отказывается угадывать: когда ситуация «запушено в общую ветку», единственная команда на выбор — revert, потому что альтернативы сжигают команды. Длинное руководство по отмене коммита объясняет, что каждый flag делает с reflog; инструмент просто не даёт выбрать неправильный на скорости.
Исходники на github.com/mrsaynothing/git-undo — чистые HTML и JavaScript, без сборки, без зависимостей. Форкайте, меняйте стиль, забирайте мои формулировки. Версия на этом сайте гоняет ту же логику статической страницей SvelteKit.
Если он сэкономит вам одну сессию с reflog в этом году — он окупил вечер, который на него ушёл. Если даст неверный ответ в вашем случае, для этого и существуют issues в репозитории.
FAQ
Что делает генератор git undo?
Задает три вопроса — был ли commit запушен, сохраняете ли вы изменения, тянет ли кто-то ещё эту ветку — и печатает точную команду: reset, revert или спасение через reflog.
Безопасен ли git reset --hard?
Для незапушенных коммитов — да: выброшенная работа остаётся доступной через git reflog примерно 90 дней. В общей ветке — никогда: используйте revert.
Нужен ли аккаунт для инструмента?
Нет. Это статическая страница, всё работает в браузере — ничего не загружается и не логируется.
— mrsaynothing
— mrsaynothing
Сборки, поломки и то, что реально доехало.
Обсудить этот пост на dev.to dev.to ↗
Следующий лог сборки — на почту
Одно письмо на пост. С доказательствами и ошибками.
что это?Мой агент опубликовал закрытый пост. Он висел день.
Нравятся заметки? Я зарабатываю этим на жизнь. получать рассылку