Сравнение Git и Jujutsu

2025-10-13 · 5 мин. для прочтения

Сравнение Git и Jujutsu.

Содержание

1 Общая информация

1.1 Git

  • Распределённая система контроля версий, созданная Линусом Торвальдсом в 2005 году для разработки ядра Linux.
  • Широко используется и является стандартом де-факто для отслеживания изменений в коде.
  • Имеет явную область подготовки изменений (staging area), требующую явного добавления изменений перед коммитом.
  • Может быть сложен для изучения и использования из-за крутого порога вхождения и сложных команд.

1.2 Jujutsu (jj)

  • Экспериментальная система контроля версий, совместимая с Git.
  • Предлагает упрощённую ментальную модель и улучшенные рабочие процессы.
  • Не имеет явной области подготовки изменений; рабочая копия рассматривается как специальный коммит.
  • Обеспечивает более безопасное и простое редактирование истории, улучшенную обработку конфликтов и другие функции.
  • Jujutsu не заменяет Git полностью, а предлагает альтернативный подход к работе с версиями, который может быть удобнее в некоторых случаях.s

2 Основные различия

2.1 Подход к отслеживанию изменений

  • Git: использует staging area (индекс) — промежуточный этап, на котором изменения подготавливаются перед коммитом.
    • Требуется явное добавление изменений в индекс командой git add.
  • Jujutsu: рабочая копия рассматривается как специальный коммит, все изменения автоматически отслеживаются.
    • Нет необходимости в явном добавлении изменений или использовании механизма stash.

2.2 Работа с историей

  • Git: для изменения истории используется интерактивный ребейз (git rebase -i), что может быть сложным для начинающих.
    • Для простых изменений доступна команда git commit --amend.
  • Jujutsu: предлагает гибкие инструменты для редактирования истории (jj edit, jj squash, jj unsquash), автоматическое ребейзирование потомков при изменении коммита, что упрощает работу с историей.

2.3 Разрешение конфликтов

  • Git: конфликты должны быть разрешены до завершения операций (например, слияния или ребейза).
    • Используются маркеры конфликтов в файлах.
  • Jujutsu: конфликты могут быть зафиксированы и разрешены позже.
    • Конфликты рассматриваются как полноценные объекты, что позволяет выполнять операции даже в состоянии конфликта.

2.4 Управление ветками

  • Git: ветки — это именованные указатели на коммиты.
    • Для работы с ветками используются команды git branch и git checkout.
  • Jujutsu: по умолчанию используются «анонимные» ветки, именованные ветки доступны, но не обязательны.
    • Управление ветками осуществляется с помощью команды jj branch.

2.5 Отмена действий и журналирование

  • Git: возможности отмены ограничены, используется git reflog.
    • Нет встроенной поддержки для повтора (redo) действий.
  • Jujutsu: поддерживает подробное журналирование всех операций, что позволяет легко отменять и повторять действия.
    • Для этого используются команды jj op log, jj undo и jj op undo.

2.6 Дополнительные возможности

  • Git: устоявшийся набор инструментов и широкая экосистема плагинов и интеграций.
  • Jujutsu:
    • поддерживает многоуровневые ветки (разделение локальных, удалённых и совместных веток);
    • предлагает мощный язык запросов для выбора коммитов (revsets);
    • обеспечивает безопасные параллельные операции;
    • позволяет работать с несколькими рабочими пространствами в одном репозитории.

2.7 Уровень зрелости и распространённости

  • Git: широко распространён, имеет большое сообщество, множество инструментов и интеграций.
  • Jujutsu: всё ещё находится в активной разработке, сообщество и экосистема пока менее развиты, чем у Git.

2.8 Целевая аудитория

  • Git: подходит для широкого круга разработчиков.
  • Jujutsu: может быть интересен начинающим разработчикам за счёт упрощённого подхода, а также опытным разработчикам и командам, стремящимся упростить рабочие процессы и улучшить совместную работу.

3 Использование jj вместо git

3.1 Основные понятия jj

  • Репозиторий в jj — это направленный ацикличный граф (DAG), где каждый узел — это изменение (change).
  • Изменения (changes) — аналоги коммитов в Git, но с более стабильным ID.
  • Закладки (bookmarks) — уникальные строки, ссылающиеся на изменения, выполняют роль веток в Git.

3.2 Преимущества jj

  • Автоматическая логика пересоздания коммитов.
  • Возможность легко откатиться к предыдущему состоянию (jj undo).
  • Упрощённое управление конфликтами и ребейзами.
  • Работа с закладками вместо веток упрощает понимание и управление историей изменений.

3.3 Настройте окружение

  • Настройте имя пользователя и email:

    jj config set --user user.name "Some One"
    jj config set --user user.email "someone@example.com"
    
  • Укажите предпочитаемый редактор:

    jj config set --user ui.editor EDITOR
    

3.4 Инициализируйте репозиторий

  • Для нового проекта используйте команду jj git init.
  • Чтобы добавить jj в существующий Git-репозиторий, выполните jj git init --colocate.

3.5 Клонируйте репозиторий

  • Используйте команду jj git clone URL [DEST], где URL — адрес удалённого репозитория, а DEST — путь для клонирования на вашем устройстве.

3.6 Начните работу с репозиторием

  • Вместо работы с индексом (staging area) в Git, в jj рабочая копия представлена как полноценный коммит — это упрощает процесс добавления изменений.
  • Используйте команды jj для управления изменениями:
    • jj log — просмотреть историю изменений;
    • jj status — проверить статус рабочего изменения;
    • jj undo — отменить последнюю команду;
    • jj new — создать новое изменение;
    • jj describe -m "edit foo" — задать описание изменения;
    • jj bookmark list — показать все закладки;
    • jj commit -m "feat: More features" — создать коммит с сообщением.

3.7 Работа с конфликтами

  • jj трактует конфликты как отдельные сущности, что позволяет более интеллектуально их разрешать.
  • Чтобы разрешить конфликт, отредактируйте файл и уберите маркеры конфликта (<<<<<<<, =====, >>>>>>>);
    • для бинарных файлов замените файл нужной версией;
    • при необходимости используйте jj restore, чтобы откатить изменения.

3.8 Работа с удалённым репозиторием

  • Для получения изменений из удалённого репозитория используйте jj git fetch.
  • Для отправки изменений в удалённый репозиторий — jj git push.
  • Связывайте локальные закладки с удалёнными ветками с помощью jj bookmark track.
Дмитрий Сергеевич Кулябов
Authors
Профессор кафедры теории вероятностей и кибербезопасности
Мои научные интересы включают физику, администрирование Unix и сетей.