Jujutsuとは
Jujutsu(読み方:じゅじゅつ、CLIコマンドは jj)は、Googleエンジニアによって開発されたオープンソースのバージョン管理システム(VCS)です。2022年ごろから公開され、2024年末には jj-vcs という独立したGitHub organizationに移管されました。
「GitのUXを根本的に改善する」というコンセプトを持ちつつ、既存のGitリポジトリと完全互換なのが最大の特徴です。
info
2026年現在、Jujutsuはまだ実験的なプロジェクトです。Git互換部分は安定して動作しており、多くの開発者が日常使いしていますが、一部機能は開発途中です。
GitとJujutsuの関係
Jujutsuは「Gitの代替」ではなく、Gitの上に乗る新しいフロントエンドと捉えるのが正確です。
┌─────────────────────────────┐
│ Jujutsu (jj) │ ← 新しいUX・コマンド体系
├─────────────────────────────┤
│ Gitストレージ │ ← データの実体はGitのまま
└─────────────────────────────┘
-
.gitディレクトリはそのまま存在する - 既存のGitリモート(GitHub/GitLab等)をそのまま使える
-
jj git fetch/jj git pushでGitリモートと同期できる - チームの一部が
jjを使い、残りがgitを使うという混在運用も可能
Gitとの主な概念の違い
1. ワーキングコピーが常にコミット
Gitでは「ワーキングツリー → ステージング → コミット」という3ステップがあります。
Jujutsuではこの概念が大きく変わります。
ファイルを編集した瞬間、それは即座にコミットの一部になります。
Git: 作業ディレクトリ → (git add) → ステージング → (git commit) → コミット
jj: 作業ディレクトリ ────────────────────────────────────────→ コミット(常時)
ステージング(git add)という概念がなく、jj は常にワーキングコピーを自動スナップショットしています。
2. ステージングエリアがない
git add は不要です。変更したファイルはすべて現在のコミット(@ と表記)に自動的に含まれます。
# Git の場合
git add src/main.py
git commit -m "fix: バグ修正"
# jj の場合
jj commit -m "fix: バグ修正" # add は不要
3. ブランチ → ブックマーク
Gitの「ブランチ」に相当するものをJujutsuでは**ブックマーク(bookmark)**と呼びます。
重要な違いは、Jujutsuではブランチなしで作業するのが通常の状態という点です。Gitの「detached HEAD」が通常状態に相当します。名前をつけるのはGitHub等にプッシュする直前でOKです。
# ブックマーク(ブランチ)を作成してプッシュ
jj bookmark create feature-login -r @-
jj git push --bookmark feature-login --allow-new
4. Change IDとCommit ID
Jujutsuのコミットには2種類のIDがあります。
| ID | 説明 |
|---|---|
| Change ID | そのコミットを「書き換えても」変わらない識別子(例: qmvvknzz) |
| Commit ID | Gitのcommit hashと同じ。書き換えると変わる |
これにより、git commit --amend で書き換えたコミットを後から参照するときに混乱が起きません。
5. 匿名ブランチ(Anonymous Branches)
Jujutsuは匿名ブランチを正式にサポートしています。名前をつけないまま複数のコミットを積み重ねられます。GitがMercurial的な設計思想も取り込んだ形です。
6. ファーストクラスのコンフリクト処理
Gitではコンフリクトが発生すると作業がブロックされます。
Jujutsuではコンフリクト状態のままコミットを持ち続けられます。
jj rebase -d main # コンフリクトが発生してもそのまま続行できる
jj status # コンフリクトがある旨が表示されるが、作業は続けられる
jj resolve # 準備ができたときに解決する
さらに、コンフリクトを解決するとその解決がすべての子孫コミットに自動で伝播されます。
7. オペレーションログ(Operation Log)
リポジトリに対するすべての操作が記録されます。
jj op log # 過去のすべての操作を表示
jj undo # 直前の操作を取り消す
jj op restore abc123 # 特定の状態に戻す
git reflog より強力で、git fetch や git push まで含めた全操作が対象です。
GItとのコマンド対応表
| 目的 | Git | Jujutsu |
|---|---|---|
| リポジトリ作成 | git init |
jj git init |
| クローン | git clone <url> |
jj git clone <url> |
| 状態確認 | git status |
jj status |
| ログ確認 | git log |
jj log |
| コミット | git add . && git commit -m "msg" |
jj commit -m "msg" |
| コミットメッセージ編集 | git commit --amend |
jj describe |
| 新しい作業開始 | git checkout -b <branch> |
jj new |
| 別コミットに移動 | git checkout <hash> |
jj edit <id> |
| コミットをまとめる | git rebase -i |
jj squash |
| コミットを分割 | git rebase -i |
jj split |
| リベース | git rebase <branch> |
jj rebase -d <branch> |
| フェッチ | git fetch |
jj git fetch |
| プッシュ | git push |
jj git push |
| 取り消し |
git reflog + git reset
|
jj undo |
| ブランチ作成 | git checkout -b <name> |
jj bookmark create <name> |
GitHubとの連携
リポジトリのクローン
jj git clone https://github.com/user/repo.git
cd repo
日常の開発フロー
# 1. mainから新しい変更を始める
jj new main
# 2. ファイルを編集(自動的に現在のコミットに反映される)
vim src/feature.py
# 3. コミットメッセージを付けて次のコミットへ進む
jj commit -m "feat: 新機能を追加"
# 4. さらに変更を続ける...
GitHubへのプッシュとPull Request
# ブックマーク(ブランチ)を作成
jj bookmark create feature-my-function -r @-
# GitHubへプッシュ(初回は --allow-new が必要)
jj git push --bookmark feature-my-function --allow-new
# あとは GitHub上でPull Requestを作成(通常通り)
または、ブックマーク名を自動生成させることもできます:
# Change IDから自動でブックマーク名を生成してプッシュ
jj git push --change @-
リモートの変更を取り込む
# フェッチ(git pull に相当する直接コマンドはない)
jj git fetch
# mainに追従してリベース
jj rebase -d main
レビューコメントへの対応
# 方法1: 新しいコミットを追加する(コミット履歴に残る方式)
jj new feature-my-function
# 修正を加える
jj commit -m "fix: レビュー指摘を修正"
jj bookmark set feature-my-function # ブックマークを移動
jj git push
# 方法2: 既存コミットを書き換える(履歴をクリーンに保つ方式)
jj edit <change-id> # 対象コミットに移動
# 修正を加える(子孫は自動でリベースされる)
jj git push --force-with-lease
スタック型PRの作成
複数の依存するPRを同時に作る場合:
jj new main
# PR1の変更...
jj commit -m "feat: 基盤実装"
jj new
# PR2の変更(PR1に依存)...
jj commit -m "feat: 追加機能"
# それぞれブックマークを作成してプッシュ
jj bookmark create part1 -r @--
jj bookmark create part2 -r @-
jj git push --bookmark part1 --allow-new
jj git push --bookmark part2 --allow-new
Jujutsuを使い始める
インストール
# macOS (Homebrew)
brew install jj
# Cargo (Rust)
cargo install --locked jj-bin
# Linux (各ディストリビューションのパッケージマネージャーも利用可)
既存のGitリポジトリで試す
cd existing-git-repo
jj git init --git-repo . # Gitリポジトリとして初期化
jj log # ログを確認
既存の .git ディレクトリをそのまま使うため、git コマンドとの混在運用も問題なく動作します。
Revsets:強力なコミット選択言語
JujutsuにはRevsetsという関数型のクエリ言語があります。
# mainより新しい自分のコミットをすべて表示
jj log -r "ancestors(@) & descendants(main) & mine()"
# コンフリクトのあるコミットを表示
jj log -r "conflict()"
# 直近5件のコミット
jj log -r "heads(ancestors(@, 5))"
git log のオプションより表現力が高く、複雑な条件のコミット群を簡単に選択できます。
まとめ:Jujutsuを使うべきか?
こんな人におすすめ
-
git rebase -iを頻繁に使う人 - コミット履歴をきれいに保ちたい人
-
git stash/git worktreeの代替を探している人 - スタック型PRを多用する人
注意点
- まだ実験的なプロジェクト(ただし実用レベルで安定)
- エディタやIDEとの統合はGitより少ない
- チームメンバー全員が移行する必要はない(混在可能)
-
git pull相当の単一コマンドがない(jj git fetch+jj rebaseの2ステップ)
Jujutsuは「Gitを捨てる」ツールではなく、Gitの資産を活かしながらUXを改善するツールです。個人の開発環境から気軽に試せるので、まず jj git clone で既存のリポジトリをクローンして触ってみるのがおすすめです。
参考リンク
この記事はZennでも公開しています。