本文へ移動
Signalcraft
English

← Signalcraft一覧へ戻る

AIエージェント用Git worktreeとWorktrunkを調べる

AIエージェント用Git worktreeとWorktrunkを調べる

AIエージェントを複数の課題へ同時に割り当てるなら、ブランチ名だけでなく作業ディレクトリも分ける必要があります。

1つのディレクトリを共有すると、未コミット変更、生成物、依存関係、開発サーバーが混ざります。

この問題を調べるため、Git標準のworktreeとWorktrunkを「並行作業の境界」と「ライフサイクル管理」に分けて考えます。

branchだけでは作業を隔離できない

同じディレクトリでブランチだけを切り替える運用では、次の状態が共有されます。

  • 前の課題の未コミット変更
  • エージェントが編集中のファイル
  • node_modulesやビルドキャッシュ
  • .envと接続先
  • 開発サーバーのポート
  • 実行中のプロセス

人間が常に端末を見ていても、混ざった状態を見落とします。

AIエージェントは、端末を見ていない間にもファイルとコマンドを扱います。

そのため、「人間がブランチ状態を把握している」という前提を安全境界にしない方がよいです。

Git worktreeが提供する境界

Gitの公式ドキュメントでは、1つのリポジトリへ複数の作業ツリーを関連付けられます。

それぞれが作業ツリー、HEAD、indexを持つため、別ブランチを同時にチェックアウトできます。

作成の最小例は次です。

git worktree add -b feature-auth ../repo.feature-auth main
git worktree list

作業を終えてレビューと統合が済んだら、対象worktreeと不要なブランチを確認してから整理します。

git worktree remove ../repo.feature-auth
git branch -d feature-auth

worktreeはリポジトリの完全なコピーではありません。

Gitオブジェクトを共有しながら、作業ツリーやindexを分けるため、同じブランチを複数のworktreeでチェックアウトする制約があります。

ディレクトリをファイルシステムから直接削除した場合は、git worktree listで残った管理情報を確認し、必要ならgit worktree pruneを使います。

常時マウントされない場所へ置く場合は、git worktree lockも確認します。

Worktrunkはライフサイクルを短くする

Git標準のworktreeは、パス、ブランチ、統合、削除を個別に操作します。

Worktrunkはそのライフサイクルをブランチ名中心のCLIへまとめます。

公式ドキュメントで最初に確認する入口は次です。

wt switch --create feature-auth
wt list
wt merge main

wt mergeは導入したバージョンや設定によって、コミット、squash、rebase、worktree削除まで扱うことがあります。

実行前に、差分、未コミット変更、コマンドのヘルプを確認します。

作成フック、削除フック、ポート割り当て、AIコマンド起動も設定できるが、最初から有効にする必要はありません。

まず作成、一覧、明示的な統合だけを使い、困りごとが出た機能を追加します。

エージェントを起動する単位を決める

エージェントへは、1つの作業ディレクトリと1つの作業指示を割り当てます。

公式例に近い起動形は次です。

wt switch --create --execute codex feature-a -- '認証処理のテストを追加する'

--executeの引数やエージェントCLIは環境ごとに異なります。

重要なのは、1つのworktreeへ複数の書き込み主体を置かないことです。

ファイルを分けても、同じAPI契約や設定ファイルを変更すれば、統合時の競合は起こります。

並行化する前に、共有インターフェースと統合順序を決めます。

mainを基準状態として保護する

mainは、統合済みの基準状態を確認し、worktreeを作る起点として使います。

エージェントの作業をmainで直接始めません。

小さな変更でも、コミット対象ならタスク用worktreeを作ります。

プロジェクトルールには、少なくとも次を明記します。

  • mainを直接編集しない
  • 並行作業では1タスク1worktreeにする
  • 他のworktreeのファイルを変更しない
  • git reset --hardや広い範囲を削除しない
  • 統合前に差分と検証結果を確認する
  • .envや秘密情報を無条件にコピーしない

このルールはエージェントだけでなく人間にも適用します。

worktreeの外側にある状態を管理する

worktreeはファイルを分けるが、開発環境のすべてを自動的に分離しません。

依存関係

Node.jsのnode_modulesやRustのtargetをworktreeごとに作ると、初回セットアップが重くなります。

共有キャッシュは高速化に役立つが、ブランチ間で生成物を混ぜる可能性もあります。

最初はworktreeごとにセットアップし、速度が問題になってから共有方法を検証します。

.env

Git管理外の.envにも、データベース接続先やAPIキーが入ります。

コピーする場合は、低権限の開発用credentialだけを使います。

本番資格情報を複数のworktreeへ配るより、worktreeごとに安全なテスト環境を用意します。

ポート

複数の開発サーバーが同じ3000番ポートを使うと衝突します。

ブランチ名からポートを決めるか、Worktrunkのポート割り当てを使います。

エージェントにサーバーを起動させない運用も選択肢です。

統合と後片付けをレビューの一部にする

エージェントの出力を、そのままmainへ取り込みません。

最低限、次の順番で確認します。

  1. worktreeの差分を見る
  2. コミット済み変更と未コミット変更を分ける
  3. lint、テスト、buildをworktreeで実行する
  4. 変更範囲と生成物を確認する
  5. Pull Requestまたはローカルマージで統合する
  6. 不要なworktreeとブランチを削除する

wt listgit worktree listを定期的に確認します。

古いworktree、起動中のプロセス、不要なブランチを放置すると、並行作業の境界が分かりにくくなります。

まとめ

Git worktreeの価値は、複数ブランチを開くことだけではありません。

作業の責任範囲をディレクトリ単位で分け、レビュー可能な変更へ変える境界になります。

Worktrunkは作成、一覧、統合、削除の手順を短くします。

ただし、.env、ポート、依存関係、認証情報は別途設計する必要があります。

AIエージェントの並行作業でmainを保護する目的なら、Git標準のworktreeだけでも基礎は成立します。

参考資料