0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

おい、Git worktree を使え

0
Posted at

AI時代に必須の「並列開発スキル」を完全理解する

「AIにコードを書かせている生成待ちの間に、別のタスクを進めたい」
「しかし、ブランチを切り替えるとエディタの状態がリセットされ、AIのコンテキスト(文脈)が失われてしまう」

もしあなたが、CursorやGitHub CopilotなどのAIツールを使っているにもかかわらず、頻繁に git stashgit switch を繰り返しているなら、AIのパフォーマンスを著しく低下させています。

この記事では、AI駆動開発に不可欠な 「Git worktree」 について解説します。


【Why】なぜ、AI開発に worktree が必須なのか?

結論から言えば、**「AIのエディタセッション(コンテキスト)を維持したまま、物理的に別の作業環境を確保するため」**です。

従来のフロー vs AI開発のフロー

  • AIは「開いている状態」に依存する
    現在のAIエディタは、開いているタブ、直前のチャット履歴、ターミナルのログなどを「コンテキスト」として読み取り、推論の精度を高めています。
  • git switch はコンテキストを破壊する
    通常のブランチ切り替えを行うと、ファイルの中身が書き換わり、エディタのタブ構成が変わり、プロセスを再起動する必要があります。これはAIにとって「文脈の喪失」を意味します。
  • 再開コストの増大
    元のブランチに戻った際、AIに再度「先ほどのタスクの続きですが...」と指示し直すのは非効率です。

「タスクごとに独立したディレクトリ(作業ツリー)を保持し、コンテキストを永続化させる」
これを実現するのが Git worktree です。


【What】Git worktree とは何か?

技術的に定義すると、**「単一のローカルリポジトリ(.git)に対して、複数のワーキングツリー(作業ディレクトリ)を関連付ける機能」**です。

仕組みの根本理解

通常、Gitリポジトリは以下の1対1の関係で成り立っています。

  • リポジトリデータベース (.git): コミット履歴やブランチ情報を管理。
  • ワーキングツリー: 現在チェックアウトされているファイル群。

Git worktreeを使用すると、1つのリポジトリデータベースに対し、複数のワーキングツリーを同時にチェックアウトできます。

  • ディレクトリA: main ブランチを展開中(緊急バグ修正用)
  • ディレクトリB: feature/new-api ブランチを展開中(AIによる実装用)

これらは物理的に別のフォルダとして存在するため、エディタを別ウィンドウで開けば、互いに干渉することなく並列作業が可能です。もちろん、コミット履歴やオブジェクトデータベースは共有されています。


【How】実践的な使い方

最も運用トラブルが少ない、推奨されるワークフローとコマンドを紹介します。

1. ディレクトリ構成のベストプラクティス

worktreeを作成する際は、リポジトリの中に作るのではなく、リポジトリの「隣」(並列な階層)に作成することを強く推奨します。これにより、.gitignore の設定漏れによるトラブルを防げます。

推奨構成:

/Projects
  ├── my-app/          <-- [Main] いつものリポジトリ
  └── my-app-feature/  <-- [Worktree] 新しく作成する作業ディレクトリ

2. worktree の作成 (add)

メインのディレクトリにいる状態で、以下のコマンドを実行します。

# git worktree add -b <新ブランチ名> <作成するディレクトリパス>

git worktree add -b feature/ai-refactor ../my-app-feature

  • -b <ブランチ名>: 新しいブランチを作成してチェックアウトします。
  • ../<フォルダ名>: 一つ上の階層に新しいディレクトリを作成します。

3. 作業の開始

作成されたディレクトリ(../my-app-feature)を、エディタの 「新しいウィンドウ」 として開きます。これで、既存の作業状態を保持したまま、完全に独立した環境でAIを利用できます。

4. worktree の削除 (remove)

作業が完了し、マージが済んだらディレクトリを削除します。(メインのディレクトリに戻ってから実行してください)

# git worktree remove <ディレクトリパス>

git worktree remove ../my-app-feature

これにより、ディレクトリの実体削除と、Git内部の管理情報の削除が同時に行われます。


【Warning】注意点とやってはいけないこと

Git worktreeは強力ですが、運用上の制約があります。以下の4点は必ず押さえてください。

🚫 禁止1:同一ブランチの多重チェックアウト

「メインのディレクトリで main を開いている状態で、worktreeでも main をチェックアウトする」ことはできません。Gitは整合性を保つため、同一ブランチが複数の場所で更新されることを防ぎます。

🚫 禁止2:ディレクトリの手動削除

不要になったworktreeディレクトリを、rm コマンドやファイラーで直接削除しないでください。.git 内に「worktreeが存在する」という管理情報(メタデータ)が残り続け、エラーの原因になります。必ず git worktree remove を使用してください。

万が一手動で消してしまった場合:
以下のコマンドで整合性を修復(不要なメタデータを削除)できます。
git worktree prune

⚠️ 注意1:依存ライブラリのインストール (npm install)

新しく作成されたworktreeは、Git管理下のファイルのみが展開された状態です。Git管理外のファイル(Ignored files)は存在しません。したがって、node_modules は空の状態です。

作成後は必ずパッケージのインストールを実行してください。

npm install
# または yarn install / pnpm install

⚠️ 注意2:環境変数のコピー (.env)

同様に、APIキーなどを管理する .env ファイルもGit管理外であることが一般的です。これらは自動でコピーされないため、メインのディレクトリから手動でコピーする必要があります。


まとめ

  • Why: AIのコンテキスト(記憶)を維持し、並列処理を可能にするため。
  • What: 1つのリポジトリ(履歴)に対し、複数の作業ディレクトリ(実体)を持つ機能。
  • How: git worktree add ../<path> でリポジトリの隣に作成する。
  • Caution: node_modules.env は毎回用意する。同じブランチは同時に開かない。

AI開発において、人間は「コードを書く」役割から「複数のAIエージェントを統括する」役割へと変化しています。Git worktreeを使いこなし、開発スピードを最大化してください。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?