Jujutsu(jj)完全ガイド:Gitを超える次世代バージョン管理システムの実践活用法
Jujutsu(jj)完全ガイド:Gitを超える次世代バージョン管理システムの実践活用法
はじめに
Jujutsu(ジュジュツ、通称jj)は、Googleのエンジニアによって開発された次世代のバージョン管理システムです。「Gitと100%互換性がありながら、より使いやすい」という一見矛盾した目標を見事に実現しています。
本記事では、Jujutsuの基本概念から実践的な活用方法、さらにはAIツールとの並列開発まで、包括的に解説します。
目次
- なぜJujutsuなのか?5分で分かる革新性
- 30秒で始めるJujutsu
- Gitユーザーが最初に知るべき5つの違い
- 実践:日常開発でのJujutsu活用法
- コンフリクト処理の新しい考え方
- GitとJujutsuの併用パターン
- AIツールとの並列開発
- アーキテクチャ解説(上級者向け)
- よくある質問と移行ガイド
なぜ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つの特徴
-
すべての操作が安全:
jj undo
で何でも元に戻せる - 作業中の変更が自動保存: コミットし忘れがない
- コンフリクトに柔軟: 今すぐ解決しなくても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 status
、jj desc
= jj describe
)
3. ブランチは必須ではない
# ブランチなしで作業
$ jj new -m "新機能"
# 開発...
# 後で必要になったらブランチ名を付ける
$ jj bookmark create -r @ feature-x
注: 以前は jj branch
コマンドでしたが、現在は jj bookmark
に変更されています。
4. リベースが常に成功する
$ jj rebase -d main
# コンフリクトがあっても成功!
# コンフリクトマーカーがファイルに入るだけ
undo
できる
5. いつでも$ 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
なぜこれが便利なのか
- 開発の流れが止まらない: チームを待たせない
- コンテキストスイッチが減る: 集中している作業を継続
- 実験が安全: 複雑なマージも気軽に試せる
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 branch
→jj bookmark
に変更(2024年) -
jj checkout
→ 廃止されjj new
に統合
最新のコマンドは公式ドキュメントで確認してください。
移行チェックリスト
- jjをインストール
- 小さなプロジェクトで試す
- 基本コマンドに慣れる(new, describe, log)
- undoの威力を体験
- チームに共有
まとめ
Jujutsuは「Gitをより良くする」という明確な目標を持って設計されています。
今すぐ試すべき理由:
- 既存のGitプロジェクトで即使える
- 操作ミスを恐れる必要がない
- 開発フローが自然になる
- AIツールとの相性が抜群
注意点:
- jjは活発に開発中のため、コマンドが変更されることがある
- 例:
branch
→bookmark
への変更(2024年) - 最新情報は公式ドキュメントで確認を
次のステップ:
# まずは個人プロジェクトで
$ jj git init --colocate
$ jj new -m "jjを試してみる"
Gitで苦労していた作業が、Jujutsuでは驚くほど簡単になることを実感してください。
Discussion