Git Worktree 完全ガイド
Git Worktree で MoAI-ADK 並列開発を進める方法を 1 編にまとめました。基礎概念から コマンドリファレンス、ワークフロー、ベストプラクティスまで扱います。
Git Worktree は 1 つの Git リポジトリを複数のディレクトリで同時に作業 できるように
してくれる Git 内蔵機能です。ブランチを行き来するたびに git checkout でコンテキストを
入れ替える代わりに、ブランチごとにディレクトリを 1 つずつ開いておきます。
graph TD
subgraph Traditional["従来の方式"]
T1[単一の作業ディレクトリ]
T2[ブランチ切替が必要]
T3[コンテキストスイッチングのコスト]
end
subgraph Worktree["Worktree 方式"]
W1[Worktree 1
feature/A]
W2[Worktree 2
feature/B]
W3[Worktree 3
main]
end
Traditional -.->|不便| WorktreeMoAI-ADK はこの機能の上に SPEC 単位の隔離環境を載せます。SPEC ごとに環境が完全に 分かれるため、エージェントが並列に動いても互いの作業を上書きしません:
- 独立した Git 状態 — Worktree ごとに自身のブランチとコミット履歴が別々に積み上がります
- 分離された LLM 設定 — Worktree ごとに異なる LLM 実行モードを使えます。 計画には Claude、実装には GLM を割り当てるトークノミクス運用がここから出てきます
- 隔離された作業空間 — ファイルシステムのレベルで完全に分かれます
3 つの仕事がそれぞれ別のコマンドに分かれています。この境界を先に押さえておくと、 残りが読みやすくなります。
| やりたいこと | 担当 |
|---|---|
| Worktree を作る · 入る | ランチャー moai cc · moai glm · moai cg の -w フラグ |
| Worktree の一覧を見る | git worktree list |
| 同期 · 整理 · 復旧 · 状態ガード | moai worktree (エイリアス moai wt) のサブコマンド |
moai worktree に生成コマンドはありません。ワークツリーはランチャーの -w フラグが
作り、その場でセッションまで起動します。
moai cc -w [名前] [--spawn]
moai glm -w [名前] [--spawn]
moai cg -w [名前] [--spawn]- 短い名前 (
feat-auth) —.claude/worktrees/feat-auth/の下で解決されます。 存在しなければ新しく作られます - 絶対パス —
~/.moai/worktrees/または<プロジェクト>/.claude/worktrees/配下の既存ワークツリーへ再進入します - 値の省略 (
-wのみ) — 名前が自動で付けられます - 上の 2 つの接頭辞から外れた絶対パスは拒否されます。うっかり見当違いの場所に ワークツリーができるのを防ぐためです
-w だけを渡すと、現在のプロセスがワークツリーのセッションに置き換わります。今の
ウィンドウをそのまま残してワークツリーをもう 1 つ開くには --spawn を付けます。tmux の
新しいウィンドウが立ち上がり (フォーカスはそのまま)、移動先の pane ID が出力されます。
--spawn は tmux セッションの中でのみ動作します。tmux の外で使うと、何も変更せずに
エラー終了します。
# ワークツリーを作りながら Claude バックエンドで進入
moai cc -w feat-auth
# 同じワークツリーへ GLM バックエンドで進入
moai glm -w feat-auth
# 現在のセッションを保ったまま新しい tmux ウィンドウで GLM チームメイトを起動
moai cg -w feat-auth --spawn
# 任意の場所にワークツリーを自分で作りたいときは git をそのまま使う
git worktree add -b feature/SPEC-AUTH-001 \
~/.moai/worktrees/your-project/SPEC-AUTH-001 origin/main
moai glm -w ~/.moai/worktrees/your-project/SPEC-AUTH-001git worktree listWorktree を base ブランチの変更内容と同期します。
moai worktree sync [branch-name]- branch-name (任意): 同期するワークツリーのブランチ。省略すると現在のディレクトリの ワークツリーが対象になります
--base BRANCH: 基準ブランチ (デフォルト値:main)--strategy MODE:merge(デフォルト値) またはrebase
# 現在のディレクトリの Worktree を main と同期 (merge 戦略、デフォルト)
moai worktree sync
# 特定の Worktree を rebase 戦略で同期
moai worktree sync feature/SPEC-AUTH-001 --strategy rebase
# 別の base ブランチを基準にする
moai worktree sync feature/SPEC-AUTH-001 --base developブランチに紐づく Worktree を消し、必要ならブランチまで削除します。ただしマージも
プッシュも行いません。base ブランチへマージする作業は git merge や PR で別途
進めてください。
moai worktree done <branch-name>- branch-name (必須、ちょうど 1 個): 整理するワークツリーのブランチ名。
SPEC-AUTH-001のような SPEC ID 形式を渡すとfeature/SPEC-AUTH-001に展開されます
--force: コミットされていない変更があっても強制削除--delete-branch: Worktree 削除後にブランチも削除--auto: 自動化用の無出力モード。ワークツリーが見つからなくてもエラー終了しないので、 PR マージ直後の整理ステップに組み込むのに向いています
# Worktree 削除
moai worktree done feature/SPEC-AUTH-001
# Worktree 削除 + ブランチ削除
moai worktree done feature/SPEC-AUTH-001 --delete-branch
# PR マージ後の自動整理 (無出力)
moai worktree done feature/SPEC-AUTH-001 --autoflowchart TD
A[moai worktree done ブランチ] --> B{そのブランチの
Worktree が存在?}
B -->|いいえ| C[エラーメッセージ]
B -->|はい| D[Worktree 削除]
D --> E{--delete-branch?}
E -->|はい| F[ブランチ削除]
E -->|いいえ| G[ブランチ維持]
F --> H[完了]
G --> H[完了]Worktree を削除します (マージなし)。ブランチは維持されます。
moai worktree remove <path>- path (必須、ちょうど 1 個): 削除する Worktree のファイルシステムのパス。 ブランチ名でも SPEC ID でもありません
--force: コミットされていない変更があっても強制削除
# 基本削除
moai worktree remove ~/.moai/worktrees/your-project/SPEC-AUTH-001
# 強制削除
moai worktree remove ~/.moai/worktrees/your-project/SPEC-AUTH-001 --forcestale な参照を整理し、マージ済みまたは放置された Worktree を選んで削除します。
moai worktree clean [options]- (フラグなし): stale なワークツリー参照のみ prune
--merged-only: ブランチが base へマージされた Worktree のみ削除--stale: 失うもののない放置された Worktree をまとめて整理 (デフォルトはプレビュー)--yes:--staleのプレビューではなく実際の削除を実行--json:--staleと併用すると、保護対象外のすべての Worktree を、保持理由と四つの判定(dirty・マージ・アンカー・無視されたコンテンツ)とともに JSON で出力。何も削除せず、--yesより優先されます--base BRANCH:--merged-only·--staleの判定に使う base ブランチ (デフォルト値:origin/main)
--stale と --merged-only は同時に使えません。
--stale は次の 2 つの条件をすべて満たすワークツリーだけを削除対象に分類します。
- 作業ツリーがクリーンである — 未コミットの変更も untracked ファイルもない
- ブランチに base を超える固有のコミットがない
どちらか 1 つでも外れるとそのワークツリーは維持され、維持した理由が併せて出力されます。 ブランチはいかなる場合も削除しません — ワークツリーのディレクトリが消えても、コミットは ブランチ名のまま残ります。メインチェックアウトと、今コマンドを実行中のワークツリーは常に 保護対象から外れません。
flowchart TD
A[moai worktree clean --stale] --> B{メインチェックアウト、または
実行中のワークツリー?}
B -->|はい| C[手を付けない]
B -->|いいえ| D{作業ツリーはクリーンか?}
D -->|いいえ| E[維持 — 未コミット/untracked あり]
D -->|はい| F{base を超える
固有のコミットがあるか?}
F -->|はい| G[維持 — コミット消失のリスク]
F -->|いいえ| H{--yes があるか?}
H -->|いいえ| I[削除予定の一覧のみ出力]
H -->|はい| J[Worktree 削除
ブランチは保存]# stale な参照のみ整理
moai worktree clean
# マージ済みの Worktree を整理 (base=main)
moai worktree clean --merged-only
# 別の base ブランチを基準に整理
moai worktree clean --merged-only --base develop
# 放置された Worktree のプレビュー — 何も削除しない
moai worktree clean --stale
# プレビュー内容を確認したうえで実際に削除
moai worktree clean --stale --yes情報--staleはプレビューがデフォルト値です。一覧を目で確認して から--yesを付けて実行し直してください。
ディスクをスキャンし git worktree repair を実行して、壊れた Worktree レジストリを
復旧します。復旧後は stale な参照を prune し、最終的に認識されたワークツリーの一覧を
出力します。フラグはありません。
moai worktree recover次の 3 つのコマンドは、オーケストレーターが Agent(isolation: "worktree") を呼び出す
前後で作業ツリーの状態を取得し、照合し、戻すために使う状態ガードのプリミティブです。
HEAD · ブランチ · porcelain · .moai/specs/ 配下の untracked ファイルの状態を取得し、
.moai/state/ へ JSON として記録します。
オプション: --out (保存先パス、デフォルト値 .moai/state/worktree-snapshot-<id>.json)、
--agent-name (エージェント名の記録)。
moai worktree snapshot --agent-name my-agent --out .moai/state/snap.json現在の作業ツリーをスナップショットと突き合わせます。--snapshot は必須で、
--agent-response を渡すとエージェント応答 JSON の空の worktreePath まで検出します。
終了コード: 0=clean、1=divergence、2=suspect (空の worktreePath)、3=両方。
moai worktree verify --snapshot .moai/state/snap.json --agent-name my-agentgit restore --source=<snapshot HEAD> --staged --worktree :/ を実行し、追跡中の
ファイルをスナップショット HEAD の状態へ戻します。Untracked ファイルは git で復元できない
ためパスを知らせるだけで、自分で作り直す必要があります。
moai worktree restore --snapshot .moai/state/snap.json
# 実行せずコマンドのみ出力
moai worktree restore --snapshot .moai/state/snap.json --dry-run注意restoreは追跡ファイルのローカル変更を捨てます。戻す前に 残しておくものがないか確認してください。
flowchart TD
Start(( )) -->|"/moai plan"| Plan["Plan"]
Plan -->|"moai glm -w で進入"| Implement["Implement"]
Implement -->|"DDD 実装"| Implement
Implement -->|"ドキュメント同期"| Document["Document"]
Document -->|"コードレビュー"| Review["Review"]
Review -->|"承認"| Merge["Merge"]
Review -->|"修正が必要"| Implement
Merge -->|"moai worktree done"| Done["Done"]計画はメインチェックアウトで進めます。
# Terminal 1 で
> /moai plan "ユーザー認証システムの実装"出力 (例):
✓ SPEC ドキュメント生成: .moai/specs/SPEC-AUTH-001/spec.md
次のステップ:
1. 新しいターミナルで実行: moai glm -w SPEC-AUTH-001
2. 開発開始: /moai run SPEC-AUTH-001# Terminal 2 で — ワークツリーを作りながら GLM バックエンドで進入
$ moai glm -w SPEC-AUTH-001
# 進入したセッションからそのまま実行
> /moai run SPEC-AUTH-001作業の流れ:
sequenceDiagram
participant T1 as Terminal 1
Plan
participant T2 as Terminal 2
Implement
participant Git as Git Repository
T1->>Git: SPEC ドキュメントのコミット
T1->>T2: SPEC ID の受け渡し
T2->>T2: moai glm -w SPEC-AUTH-001
Note over T2: ワークツリー生成 + 進入
T2->>Git: DDD 実装コミット群
Note over T2: ANALYZE → PRESERVE → IMPROVE
T2->>Git: さらに多くの実装コミット
T2->>T2: /moai sync SPEC-AUTH-001
T2->>Git: ドキュメント化コミット# Terminal 2 で作業完了後 (push は別途 git/PR で進行)
exit
# base ブランチのマージは git merge または PR で処理した後、
# Terminal 1 で Worktree 整理
moai worktree done feature/SPEC-AUTH-001 --delete-branchプロセス:
flowchart TD
A[作業完了] --> B[git merge または PR で base マージ]
B --> C[moai worktree done ブランチ]
C --> D[Worktree 削除]
D --> E{--delete-branch?}
E -->|はい| F[ブランチ削除]
E -->|いいえ| G[ブランチ維持]
F --> H[完了]
G --> H[完了]トークノミクスの基本戦略です。計画ステップは推論の強いモデル (Opus) にまとめて処理し、 実装ステップは安価なモデル (GLM) で複数に分散させます:
graph TD
subgraph Planning["Planning Phase (Opus)"]
P1["moai plan
SPEC-001"]
P2["moai plan
SPEC-002"]
P3["moai plan
SPEC-003"]
end
subgraph Implementation["Implementation Phase (GLM)"]
I1["moai glm -w SPEC-001"]
I2["moai glm -w SPEC-002"]
I3["moai glm -w SPEC-003"]
end
Planning --> Implementation# Terminal 1: 計画をまとめて処理
> /moai plan "認証"
> /moai plan "ログ"
# Terminal 3, 4, 5: 並列実装 (各ターミナルで 1 行ずつ)
moai glm -w SPEC-001 # Terminal 3
moai glm -w SPEC-002 # Terminal 4
moai glm -w SPEC-003 # Terminal 5tmux を使っているなら、ウィンドウを移動せずに 1 つのターミナルからすべて起動できます:
moai glm -w SPEC-001 --spawn
moai glm -w SPEC-002 --spawn
moai glm -w SPEC-003 --spawn# 現在どの Worktree があるか確認
git worktree list
# 別の Worktree のセッションへ進入
moai glm -w SPEC-AUTH-002flowchart TD
A[マージ試行] --> B{衝突?}
B -->|いいえ| C[マージ完了]
B -->|はい| D[衝突ファイルの表示]
D --> E[手動解決]
E --> F[git add]
F --> G[git commit]
G --> H[マージ完了]# 良い例
moai glm -w SPEC-AUTH-001 # 明確な SPEC ID
moai glm -w SPEC-FRONTEND-007 # カテゴリを含む
# 避けるべき例
moai glm -w feature-branch # SPEC ID を使わない
moai glm -w temp # 曖昧な名前# マージ済みの Worktree を定期整理
moai worktree clean --merged-only
# 放置された Worktree を確認してから整理
moai worktree clean --stale
moai worktree clean --stale --yes作業ステップごとにモデルを分けて割り当てるのが Worktree トークノミクスの核心です:
graph TD
A[作業タイプ] --> B[Plan
/moai plan]
A --> C[Implement
/moai run]
A --> D[Document
/moai sync]
B --> E[Claude Opus
高コスト/高品質]
C --> F[GLM 5
低コスト]
D --> G[Claude Sonnet
中コスト]# Worktree でコミットするとき
git commit -m "feat(SPEC-AUTH-001): JWT ベースの認証を実装
- JWT トークン生成/検証ロジックを追加
- リフレッシュトークンローテーションを実装
- ログアウト時のトークン無効化
Co-Authored-By: Claude <noreply@anthropic.com>"--spawn が tmux ウィンドウの管理を肩代わりするので、セッションを手で作る場面は
ほとんどありません。
# tmux の中でワークツリーセッションを 3 つまとめて起動
moai glm -w SPEC-001 --spawn
moai glm -w SPEC-002 --spawn
moai cc -w SPEC-003 --spawn
# 出力された pane ID で移動
tmux select-window -t %7# 登録された Worktree の確認
git worktree list
# Git ログの確認
git -C ~/.moai/worktrees/your-project/SPEC-AUTH-001 log --oneline --graph --all
# 変更内容の確認
git -C ~/.moai/worktrees/your-project/SPEC-AUTH-001 diff main