Jujutsu (jj) 実践ガイド
Jujutsu (jj) は次世代のバージョン管理システムで、git の複雑さを解消し、より直感的な操作を提供する。
なぜ Jujutsu を使うのか
主な利点
- 自動追跡:
git addが不要。変更は自動的に追跡される - 柔軟な履歴編集: いつでもコミットを編集可能
- 直感的な操作: ブランチではなく「変更」という概念
- 安全な操作:
jj undoでほぼすべての操作を取り消し可能 - 視覚的な履歴:
jj logで分かりやすい履歴表示
Git との違い
| 操作 | Git | Jujutsu |
|---|---|---|
| ステージング | 必要 (git add) | 不要 (自動追跡) |
| コミット編集 | 制限あり (--amend) | いつでも可能 |
| 操作の取り消し | 複雑 (reset, revert) | 簡単 (jj undo) |
| 履歴表示 | テキスト | 視覚的なグラフ |
インストール
mise を使用する場合 (推奨)
mise install jujutsu@latest
mise を使用すると、バージョン管理が容易になる。詳細は mise ガイド を参照。
その他の方法
公式サイト: https://docs.jj-vcs.dev/latest/install-and-setup/
基本的な使い方
初期設定
既存の git リポジトリで jj を使い始める:
jj git init --colocate
日常的なワークフロー
1. 変更の確認
jj status
# または短縮形
jj st
2. 変更の記述
# 現在の変更にメッセージを追加
jj describe -m "機能Aを追加"
# または新しいコミットを作成
jj commit -m "機能Aを追加"
3. 履歴の確認
jj log
出力例:
@ qpvuntsm ohbayashi@example.com 2026-02-07 15:30:45 feature-a
│ 機能Aを追加
◉ tpstlust ohbayashi@example.com 2026-02-07 14:20:12 main
│ 初期コミット
◉ zzzzzzzz root()
4. リモートとの同期
# リモートから取得
jj git fetch
# リモートにプッシュ
jj git push
実践的なシナリオ
シナリオ 1: 新機能の開発
# 1. 新しい変更を作成
jj new
# 2. コードを編集
# (ファイルを編集)
# 3. 変更を記述
jj describe -m "ユーザー認証機能を追加"
# 4. 履歴を確認
jj log
# 5. リモートにプッシュ
jj git push
シナリオ 2: コミットメッセージの修正
# 1. 履歴を確認
jj log
# 2. 修正したいコミットを編集
jj edit <change-id>
# 3. メッセージを修正
jj describe -m "新しいメッセージ"
# 4. 最新の変更に戻る
jj edit @
シナリオ 3: 誤った操作の取り消し
# 1. 操作履歴を確認
jj op log
# 2. 直前の操作を取り消し
jj undo
# 3. 特定の操作まで戻る
jj op restore <operation-id>
シナリオ 4: 複数の変更を統合
# 1. 現在の変更を確認
jj log
# 2. 別の変更をリベース
jj rebase -r <change-id> -d <destination-id>
# 3. または変更をマージ
jj merge <change-id>
Kiro での使用
コミットメッセージのルール
Kiro を使用する際は、以下のルールに従う:
- 日本語で記述: すべてのコミットメッセージは日本語
- 動詞で始める: 「追加」「修正」「更新」「削除」「変更」
- 50文字以内: タイトルは簡潔に
- 英語プレフィックス禁止:
feat:,fix:などは使用しない
正しい例:
jj describe -m "ユーザー認証機能を追加"
jj describe -m "パスワード検証ロジックを修正"
jj describe -m "依存関係を最新版に更新"
間違った例:
jj describe -m "feat: Add user authentication"
jj describe -m "fix: Fix password validation"
Kiro が提案するコマンド
Kiro は以下のような jj コマンドを提案する:
# 変更の記述
jj describe -m "機能を追加"
# 新しいコミットの作成
jj commit -m "機能を追加"
# 履歴の確認
jj log
# リモートへのプッシュ
jj git push
よくある質問
Q: git add が不要なのはなぜ?
A: jj は作業ディレクトリの変更を自動的に追跡する。ステージングエリアという概念がないため、git add に相当する操作は不要。
Q: ブランチはどうなる?
A: jj では「変更 (change)」という概念を使用する。各変更は一意の ID を持ち、ブランチは変更へのポインタとして機能する。
Q: git に戻すことはできる?
A: 可能。.jj ディレクトリを削除すれば、通常の git リポジトリとして使用できる。jj は git と共存可能。
Q: GitHub/GitLab との連携は?
A: jj git push と jj git fetch で通常通り連携可能。リモートリポジトリは git として扱われる。
トラブルシューティング
競合が発生した場合
# 1. 競合を確認
jj status
# 2. ファイルを編集して競合を解決
# (エディタで競合マーカーを削除)
# 3. 解決済みとマーク
jj resolve --mark <file>
# 4. 変更を記述
jj describe -m "競合を解決"
操作を間違えた場合
# 直前の操作を取り消し
jj undo
# 複数回取り消し
jj undo
jj undo
# 操作履歴を確認して特定の時点に戻る
jj op log
jj op restore <operation-id>
変更が見つからない場合
# すべての変更を表示
jj log -r 'all()'
# 特定の変更を検索
jj log -r 'description("キーワード")'
コマンドリファレンス
基本操作
| コマンド | 説明 |
|---|---|
jj status | 現在の状態を表示 |
jj diff | 変更の差分を表示 |
jj log | 履歴を表示 |
jj describe -m "msg" | 変更にメッセージを追加 |
jj commit -m "msg" | 新しいコミットを作成 |
履歴操作
| コマンド | 説明 |
|---|---|
jj new | 新しい変更を作成 |
jj edit <id> | 変更を編集 |
jj rebase | 変更をリベース |
jj merge | 変更をマージ |
jj squash | 変更を統合 |
操作の取り消し
| コマンド | 説明 |
|---|---|
jj undo | 直前の操作を取り消し |
jj op log | 操作履歴を表示 |
jj op restore <id> | 特定の操作まで戻る |
リモート操作
| コマンド | 説明 |
|---|---|
jj git fetch | リモートから取得 |
jj git push | リモートにプッシュ |
jj git clone | リポジトリをクローン |
ブランチ操作
| コマンド | 説明 |
|---|---|
jj branch list | ブランチ一覧 |
jj branch create <name> | ブランチ作成 |
jj branch set <name> | ブランチを設定 |
jj branch delete <name> | ブランチ削除 |
参考リンク
まとめ
Jujutsu は git の複雑さを解消し、より直感的なバージョン管理を実現する。自動追跡、柔軟な履歴編集、安全な操作により、開発者はコードに集中できる。
このプロジェクトでは jj を標準として使用するが、必要に応じて git に戻すことも可能。