Назад в блог

Jujutsu против Git: кнопка undo, которой у Git не было

29 сентября 2026 г.

это помогло?

Reflog в git спасёт ваши коммиты. Он не спасёт от команды, которую вы на них запустили. Этот зазор — отменять операцию, а не только коммит — и есть весь аргумент Jujutsu. И после чтения досье проекта, а не его маркетинга, аргумент держится крепче, чем думают его скептики.

Хаб Undo Anything in Git на этом сайте существует потому, что история отмены в git раздроблена: reset, revert, reflog — у каждого свои правила. Ставка jj: эта раздробленность — баг дизайна.

Что такое Jujutsu и зачем его вообще сравнивать с git?

jj — система контроля версий, совместимая с Git: 31 796 звёзд на GitHub, 376 контрибьюторов, первый релиз в декабре 2020-го и новый релиз каждый месяц с тех пор — от v0.35 в ноябре 2025-го до v0.45.1 в сентябре 2026-го, двенадцать релизов, попадающих в первую неделю месяца, как по расписанию. Последний коммит был отправлен в то же утро, когда вышла эта статья.

«Совместим с Git» — та часть, которую все упускают. jj использует репозиторий Git как хранилище по умолчанию — README говорит прямо: коммиты и файлы живут в формате git, поэтому ваш клон, remote, хостинги и CI продолжают работать. Вопрос jujutsu vs git, который ищут все, — неверная рамка: jj ближе к новому интерфейсу поверх хранилища, которому вы уже доверяете. Sapling от Meta поставил на обратное — собственный бэкенд хранилища, поэтому переход на него означает уход от большей части экосистемы git.

Что делает журнал операций такого, чего не может git?

Вот дизайнерское решение, ради которого стоила эта рецензия. Git записывает в reflog коммиты — потерянная по ошибке работа остаётся восстановимой около 90 дней. Но reflog не интересует последовательность команд, которая привела к бардаку. Статья выбор между revert и reset существует потому, что git заставляет вас выбрать правильную команду отмены до того, как вы узнали, какая была нужна.

jj записывает каждую операцию — каждый rebase, каждый abandon, каждый squash — в журнал операций. Строка из их README: «поскольку всё записано, вы можете с лёгкостью отменить ошибку, которую только что совершили». jj op log показывает историю состояния репозитория, а jj undo отступает по ней шаг за шагом. Не тот rebase? Отмена. Reset не туда? Отмена. Инструмент распространяет на собственные действия ту же безопасность, которую git распространяет на ваши данные.

История отмены в git исходит из того, что вы выберете правильную команду. История в jj — из того, что не выберете.

Конфликты действительно объекты первого класса?

Да, и это меняет командные процессы сильнее, чем история отмены. Git считает конфликт слияния временным состоянием рабочего дерева — решай сейчас или отменяй. jj хранит конфликты как объекты в истории: коммит с конфликтом может существовать, быть закоммичен и даже отправлен. Решите конфликт позже — и jj автоматически распространит решение на все дочерние коммиты. Тот же механизм, что перестраивает вашу стопку при правке раннего коммита.

Эффект на реальном проекте — стопка изменений, перестраивающая себя сама, — вот что переубеждает. Из треда Hacker News про паттерны jj (236 очков):

«Стопки PR с rebase по нескольким веткам стали пустяком. Конфликты — настоящие объекты в истории, к которым можно вернуться позже. Всё коммитится автоматически, так что я не теряю работу из-за неудачного reset/stash pop». — hellcow

Последнее предложение — то, над чем стоит задуматься. Рабочая копия в jj сама является коммитом и правится при каждом изменении. Stash не нужен, потому что stashить нечего — при смене ветки ваша незавершённая работа едет с вами как коммит. Другой комментатор, перешедший на jj на работе, где все сидят на git: «проблем было 0».

Что досье говорит против jj?

Честная бухгалтерия, потому что досье её имеет:

  • Честный 0.x. Двенадцать релизов в год — это и двенадцать шансов в месяц на ломающие изменения. Проект двигается быстро и говорит об этом прямо.
  • Bookmarks живут вне git. Коммиты и файлы лежат в хранилище git; метаданные веток — в собственном формате jj. Colocated-клоны строят мост между ними, но это ещё одна деталь, которую надо понять.
  • 1 262 открытых issue. Здоровый проект, честный бэклог.
  • Скептик тоже прав кое в чём. Самое залайканное возражение в том треде HN: «Я читал про jj столько раз, что до сих пор не понимаю, какую проблему он решает». Если ваш git-процесс — одна ветка и редкий merge, журнал операций не изменит вашу неделю. Выигрыш приходит со стековой работой, конфликтными историями и днями сплошных отмен — теми самыми днями, когда git undo генератор собирает трафик.

Переходить ли с git на jj?

Вердикт по досье, с обязательной строкой честности: я прочитал досье, но не запускал. Каждое число и каждая цитата здесь — из репозитория, его README и публичного треда HN, не с моего терминала.

Что досье поддерживает: попробуйте jj в режиме colocated на сайд-проекте — один клон, два инструмента, ноль миграции. Знание git переносится, потому что объекты внизу — из git. Команды могут внедрять по одному человеку: jj отправляет наверх обычные git-коммиты. Чего досье не поддерживает: big-bang миграцию устоявшейся команды и доверие критичной автоматизации инструменту 0.x до периода обкатки на зафиксированной версии.

Зазор отмены реален, дизайн целен; совместимость снимает привычную отговорку, и последним барьером остаётся привычка.

Променяете выходные мышечной памяти на журнал отмены, который покрывает сам инструмент? И честно — когда вы в последний раз теряли работу из-за reset, reflog вернул всё до последнего?

FAQ

Jujutsu совместим с Git?

Да. jj использует репозиторий Git как хранилище по умолчанию: один и тот же клон работает обоими инструментами сразу (colocated), а ваши remote, хостинги и CI остаются как есть.

Может ли jj отменить rebase или reset?

Да — для этого и существует журнал операций. jj записывает каждое своё действие, а jj undo отступает по нему шаг за шагом. Reflog git спасает только коммиты; журнал jj спасает сами операции.

Что jj делает с конфликтами слияния?

Хранит их как объекты первого класса в истории. Коммит с конфликтом может существовать, быть закоммичен и даже отправлен на сервер — а одно решение конфликта автоматически распространяется на все дочерние коммиты.

Jujutsu готов к продакшену?

Досье говорит «да» для одиночек и небольших команд: 31 796 звёзд, 376 контрибьюторов, релиз каждый месяц с 2020 года, и все разработчики ядра пишут jj на самом jj. Это по-прежнему 0.x: ломающие изменения приезжают с ежемесячными релизами.

— mrsaynothing

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

Одно письмо на пост. Согласиться или разобрать.

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

что это?