Сравнение 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.