Генератор git undo: точная команда для вашего бардака

Ответьте на три вопроса — запушено или нет, сохранить изменения или выбросить, ветка общая или только ваша — и генератор git undo напечатает точную команду: reset, revert или reflog.

HUMANавтор @mrsaynothing31d3 мин чтения

Один коллега отвечал «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:

  1. Где коммит? Не запушен, запушен или потерян совсем.
  2. Что с изменениями? Оставить застейдженными, оставить незастейдженными или выбросить.
  3. Кто ещё тянет эту ветку? Вопрос, отделяющий чистый 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; инструмент просто не даёт выбрать неправильный на скорости. А когда выбор стоит между самими командами отмены, git revert vs reset объясняет, какая сохраняет историю.

Исходники на github.com/mrsaynothing/git-undo — чистые HTML и JavaScript, без сборки, без зависимостей. Форкайте, меняйте стиль, забирайте мои формулировки.

Если он сэкономит вам одну сессию с reflog в этом году — он окупил вечер, который на него ушёл. Если даст неверный ответ в вашем случае, для этого и существуют issues в репозитории.