⛩️

Jujutsu(jj)完全ガイド:Gitを超える次世代バージョン管理システムの実践活用法

に公開

Jujutsu(jj)完全ガイド:Gitを超える次世代バージョン管理システムの実践活用法

はじめに

Jujutsu(ジュジュツ、通称jj)は、Googleのエンジニアによって開発された次世代のバージョン管理システムです。「Gitと100%互換性がありながら、より使いやすい」という一見矛盾した目標を見事に実現しています。

本記事では、Jujutsuの基本概念から実践的な活用方法、さらにはAIツールとの並列開発まで、包括的に解説します。

目次

  1. なぜJujutsuなのか?5分で分かる革新性
  2. 30秒で始めるJujutsu
  3. Gitユーザーが最初に知るべき5つの違い
  4. 実践:日常開発でのJujutsu活用法
  5. コンフリクト処理の新しい考え方
  6. GitとJujutsuの併用パターン
  7. AIツールとの並列開発
  8. アーキテクチャ解説(上級者向け)
  9. よくある質問と移行ガイド

なぜJujutsuなのか?

Gitの問題を解決

多くの開発者が日々感じているGitの問題:

# よくある恐怖の瞬間
$ git rebase -i HEAD~5
# 途中でコンフリクト...パニック!

$ git reset --hard HEAD~3
# あ、間違えた!どうやって戻すんだっけ...

$ git stash
$ git checkout feature
$ git stash pop
# stashがconflict...なぜ?

Jujutsuはこれらすべてを解決します:

# Jujutsuなら
$ jj rebase -d main
# コンフリクトがあっても成功。後で解決できる

$ jj undo
# どんな操作も簡単に取り消し

# stash不要。そのまま移動
$ jj new feature

革新的な3つの特徴

  1. すべての操作が安全: jj undoで何でも元に戻せる
  2. 作業中の変更が自動保存: コミットし忘れがない
  3. コンフリクトに柔軟: 今すぐ解決しなくてもOK

30秒で始めるJujutsu

# インストール(Mac)
$ brew install jj

# 既存のGitプロジェクトで試す
$ cd my-git-project
$ jj git init --colocate

# 基本的な使い方
$ jj log                    # 履歴を見る
$ echo "Hello" > file.txt   # ファイル編集
$ jj diff                   # 変更を確認(git addは不要!)
$ jj describe -m "Hello追加" # コミットメッセージ
$ jj new                    # 次の作業を開始

たったこれだけで、Gitより安全で快適な開発が始められます。

Gitユーザーが最初に知るべき5つの違い

1. ステージングエリア(git add)が不要

# Git
$ vim file.txt
$ git add file.txt
$ git commit -m "Update"

# Jujutsu
$ vim file.txt
$ jj describe -m "Update"  # 自動的に変更が含まれる

2. 作業ディレクトリ = コミット

# 現在の状態を見る
$ jj log
@ qpvuntsm me@example.com 2024-03-14 15:30:00 e2c962fc
│ (no description set)
○ yykpmnuq me@example.com 2024-03-14 15:00:00 2b93da0c
│ Add feature

@マークが現在の作業コミット。ファイルを編集すると自動的にこのコミットが更新されます。

Tips: 多くのコマンドには省略形があります(例:jj st = jj statusjj desc = jj describe

3. ブランチは必須ではない

# ブランチなしで作業
$ jj new -m "新機能"
# 開発...

# 後で必要になったらブランチ名を付ける
$ jj bookmark create -r @ feature-x

: 以前は jj branch コマンドでしたが、現在は jj bookmark に変更されています。

4. リベースが常に成功する

$ jj rebase -d main
# コンフリクトがあっても成功!
# コンフリクトマーカーがファイルに入るだけ

5. いつでもundoできる

$ jj undo  # 直前の操作を取り消し
$ jj op log  # 操作履歴を確認
$ jj op restore <操作ID>  # 特定の時点に戻る

実践:日常開発でのJujutsu活用法

シナリオ1: 機能開発の流れ

# 1. 作業開始
$ jj new main -m "ユーザー認証機能"

# 2. 開発
$ vim auth.py
$ jj diff  # 進捗確認

# 3. 途中で別の作業が必要に(stash不要!)
$ jj new main -m "緊急バグ修正"
$ vim bugfix.py
$ jj bookmark create -r @ hotfix
$ jj git push

# 4. 元の作業に戻る
$ jj new "ユーザー認証機能"
# さっきの続きから再開

シナリオ2: コードレビューの対応

# PRのフィードバックを受けて修正
$ jj new feature-branch -m "レビュー対応"
$ vim code.py  # 修正

# 元のコミットに統合
$ jj squash --into feature-branch

# 再度プッシュ
$ jj git push

シナリオ3: 複数の実験的変更

# 3つの異なるアプローチを試す
$ jj new main -m "アプローチ1: 再帰的実装"
$ vim solution1.py

$ jj new main -m "アプローチ2: 反復的実装"
$ vim solution2.py

$ jj new main -m "アプローチ3: 関数型実装"
$ vim solution3.py

# 全部組み合わせてテスト
$ jj new アプローチ1 アプローチ2 アプローチ3 -m "統合テスト"
$ pytest  # どの組み合わせが最適か確認

コンフリクト処理の新しい考え方

従来のGit:作業が止まる

$ git rebase main
CONFLICT: Merge conflict in app.py
error: Failed to merge in the changes.
# ここで作業が中断...

Jujutsu:作業を続けられる

$ jj rebase -d main
Rebased 3 commits
New conflicts appeared in these commits:
  qpvuntsm 1234abcd (conflict) feature implementation

$ jj log
@ zyxwvuts me@example.com 2024-03-14 (empty) working
○ qpvuntsm me@example.com 2024-03-14 (conflict) feature implementation
○ main

コンフリクトがあっても:

  • 他のファイルの作業は継続可能
  • 新しいコミットも作成可能
  • 適切なタイミングで解決すればOK

実践的なコンフリクト処理

# 方法1: すぐに解決する
$ jj edit qpvuntsm  # コンフリクトのあるコミットを編集
$ vim app.py  # コンフリクトマーカーを解決
$ jj status  # 解決を確認

# 方法2: 後で解決する
$ jj new -m "他の作業を先に"
# ... 他の開発を進める ...

# 落ち着いてから解決
$ jj edit qpvuntsm
$ vim app.py

なぜこれが便利なのか

  1. 開発の流れが止まらない: チームを待たせない
  2. コンテキストスイッチが減る: 集中している作業を継続
  3. 実験が安全: 複雑なマージも気軽に試せる

GitとJujutsuの併用パターン

パターン1: 完全移行(推奨)

# Gitを使わず、jjのみ使用
$ jj git clone https://github.com/team/project
$ jj new -m "開発開始"
# すべてjjコマンドで完結

メリット: シンプル、jjの機能をフル活用
デメリット: チーム全体の学習が必要

パターン2: 共存モード(移行期)

# 既存のGitリポジトリで両方使用
$ git clone https://github.com/team/project
$ cd project
$ jj git init --colocate

# 自分はjjを使う
$ jj new -m "新機能"

# チームにはGitとして見える
$ jj bookmark set feature-123
$ git push origin feature-123

メリット: 段階的移行が可能、既存ツールを維持
デメリット: 両方の概念を理解する必要

パターン3: 個人はjj、チームはGit

# 開発はjjで快適に
$ jj new -m "実装"
$ jj squash
$ jj rebase -d main

# 共有時のみGitコマンド
$ jj bookmark set my-feature
$ jj git push

AIツールとの並列開発

Claude Codeとの簡単な並列開発

Jujutsuの並行性を活かして、人間とAIが同時に開発:

# ターミナル1:あなたがフロントエンド担当
$ jj new -m "UI開発"
$ code src/frontend/

# ターミナル2:Claude CodeがAPI担当
$ jj new -m "API開発"
$ claude-code "src/backend/にREST APIを実装"

# ターミナル3:定期的に統合
$ jj new @- @-- -m "統合テスト"
$ npm test

実践例:TODOアプリを30分で作る

# 1. Claude Codeにベース作成を依頼
$ claude-code "Next.jsでTODOアプリの基本構造を作成"

# 2. 人間がUIを改善
$ jj new -m "UIデザイン改善"
# Material-UIでスタイリング...

# 3. Claude CodeにAPI追加
$ jj new -m "API機能追加"
$ claude-code "認証機能とデータ永続化を追加"

# 4. 統合して完成
$ jj new @- @-- -m "統合"

アーキテクチャ解説

コアコンセプト

Change ID(不変)→ リベースしても同じ
    ↓
Commit ID(可変)→ 内容が変わると変化
    ↓
Working Copy → 常に最新のコミット

Operation Log

すべての操作が記録される仕組み:

Operation {
    timestamp: "2024-03-14T15:30:00Z",
    description: "rebase onto main",
    parent_ops: ["abc123..."],
    resulting_view: View { ... }
}

これにより:

  • 任意の時点に戻れる
  • 並行操作が安全
  • データ損失がない

よくある質問と移行ガイド

Q: 既存のGitプロジェクトで使える?

A: はい、2つの方法があります:

# 方法1:共存モード
$ cd existing-project
$ jj git init --colocate

# 方法2:jjのみ
$ jj git clone https://github.com/user/repo

Q: チームメンバーもjjを使う必要がある?

A: いいえ。あなたがjjを使っても、他のメンバーには通常のGitコミットとして見えます。

Q: 学習コストは?

A: 基本的な使い方なら1時間で習得可能。Gitを知っていれば、より簡単に感じるはずです。

コマンドの変更履歴

注意: jjは活発に開発されており、コマンドが変更されることがあります。例えば:

  • jj branchjj bookmark に変更(2024年)
  • jj checkout → 廃止され jj new に統合

最新のコマンドは公式ドキュメントで確認してください。

移行チェックリスト

  • jjをインストール
  • 小さなプロジェクトで試す
  • 基本コマンドに慣れる(new, describe, log)
  • undoの威力を体験
  • チームに共有

まとめ

Jujutsuは「Gitをより良くする」という明確な目標を持って設計されています。

今すぐ試すべき理由:

  • 既存のGitプロジェクトで即使える
  • 操作ミスを恐れる必要がない
  • 開発フローが自然になる
  • AIツールとの相性が抜群

注意点:

  • jjは活発に開発中のため、コマンドが変更されることがある
  • 例: branchbookmark への変更(2024年)
  • 最新情報は公式ドキュメントで確認を

次のステップ:

# まずは個人プロジェクトで
$ jj git init --colocate
$ jj new -m "jjを試してみる"

Gitで苦労していた作業が、Jujutsuでは驚くほど簡単になることを実感してください。

参考資料

Discussion