• #git
  • #worktree
  • #Claude Code
  • #並行開発
未分類

git worktree で実現する並行開発

この記事で解決できること

開発中に「緊急のバグ修正が入った」「レビュー依頼が来た」といった割り込みが発生したとき、こんな経験はないだろうか。

# 作業中の変更を一時退避
git stash

# ブランチ切り替え
git checkout hotfix/urgent-bug

# node_modules がないのでインストール
npm install

# 修正完了後、元のブランチに戻る
git checkout feature/my-work
git stash pop

# あれ、どこまでやってたっけ...

git worktreeを使えば、複数のブランチを別々のディレクトリで同時に開ける。stash不要で、コンテキストスイッチのストレスから解放される。

git worktree とは

通常、1つのGitリポジトリには1つの作業ディレクトリしかない。git worktreeを使うと、同じリポジトリから複数の作業ディレクトリ(ワークツリー)を作成できる。

projects/
├── mdx-playground/           # メインのワークツリー (master)
└── mdx-playground-worktrees/
    ├── hotfix-login/         # hotfix/login-validation ブランチ
    └── feature-auth/         # feature/auth ブランチ

各ワークツリーは.gitを共有するためcloneより軽量である。そして完全に独立しているので、stashなしでブランチ間を行き来できる。

基本コマンド

ワークツリーの作成

# 新規ブランチを作成しつつワークツリーを作る
git worktree add ../mdx-playground-worktrees/hotfix-login -b hotfix/login-validation

# 既存ブランチでワークツリーを作る
git worktree add ../mdx-playground-worktrees/feature-auth feature/auth

一覧表示

git worktree list

出力例:

C:/Users/numbe/Git_repo/mdx-playground                          abc1234 [master]
C:/Users/numbe/Git_repo/mdx-playground-worktrees/hotfix-login   def5678 [hotfix/login-validation]

削除

# ワークツリーを削除(ブランチは残る)
git worktree remove ../mdx-playground-worktrees/hotfix-login

# ブランチも削除する場合は別途
git branch -d hotfix/login-validation

不要なワークツリーの掃除

# 手動で削除したディレクトリの参照を掃除
git worktree prune

推奨ディレクトリ構成

ワークツリーをどこに置くかは2つのアプローチがある。

パターン1: 隣接ディレクトリ(推奨)

projects/
├── mdx-playground/              # メイン
└── mdx-playground-worktrees/    # ワークツリー置き場
    ├── hotfix-login/
    └── feature-quiz/

メリット: メインリポジトリがすっきり、IDE での混乱がない

パターン2: .git/worktrees 内

mdx-playground/
├── .git/
│   └── worktrees/
│       ├── hotfix-login/
│       └── feature-quiz/
└── (通常のファイル)

メリット: 一箇所にまとまる。ただし .gitignore への追加不要(.git 内なので)

AI エージェントとの並行開発

git worktreeの真価は、AIコーディングツールとの組み合わせで発揮される。

なぜ worktree が必要か

Claude CodeなどのAIエージェントは、作業ディレクトリを排他的に使う前提で動く。1つのディレクトリで複数のエージェントを走らせると、以下の問題が発生する。

  • ファイルの競合が発生
  • 意図しない変更の上書き
  • コミット履歴の混乱

worktreeを使えば、各エージェントに独立した作業空間を与えられる。

並行開発ワークフロー

ターミナル1 (メイン)           ターミナル2 (worktree)
─────────────────────        ─────────────────────
mdx-playground/              mdx-playground-worktrees/hotfix/
> claude                     > claude
(機能開発を継続)              (緊急バグ修正)

実際の手順:

# 1. 緊急対応用の worktree を作成
git worktree add ../mdx-playground-worktrees/hotfix -b hotfix/urgent

# 2. 新しいターミナルで worktree に移動
cd ../mdx-playground-worktrees/hotfix

# 3. 依存関係をインストール
pnpm install

# 4. Claude Code を起動して修正を依頼
claude

# 5. 修正完了後、コミット&プッシュ
git add . && git commit -m "fix: urgent bug" && git push

# 6. メインに戻って worktree を削除
cd ../../mdx-playground
git worktree remove ../mdx-playground-worktrees/hotfix
git branch -d hotfix/urgent

複数エージェントの実例

incident.io のチームは 4〜5 個の Claude エージェント を同時に走らせている。

┌─────────────────────────────────────────────────────┐
│ Terminal 1: feature/quiz-animation                 │
│ > claude "クイズのアニメーションを実装して"          │
├─────────────────────────────────────────────────────┤
│ Terminal 2: hotfix/login-bug                       │
│ > claude "ログインエラーを修正して"                  │
├─────────────────────────────────────────────────────┤
│ Terminal 3: refactor/api-cleanup                   │
│ > claude "API 層をリファクタリングして"              │
└─────────────────────────────────────────────────────┘

各エージェントが独立したブランチで作業するため、競合なく並行開発できる。

Windows 環境での Tips

PowerShell ヘルパー関数

頻繁に worktree を作る場合、PowerShell プロファイルに関数を追加すると便利。

# $PROFILE に追加
function New-Worktree {
    param(
        [Parameter(Mandatory=$true)]
        [string]$BranchName
    )
    $worktreeDir = "../$(Split-Path -Leaf (Get-Location))-worktrees/$BranchName"
    git worktree add $worktreeDir -b $BranchName
    Write-Host "Created worktree at: $worktreeDir"
    Write-Host "Run: cd $worktreeDir"
}

function Remove-Worktree {
    param(
        [Parameter(Mandatory=$true)]
        [string]$BranchName,
        [switch]$WithBranch
    )
    $worktreeDir = "../$(Split-Path -Leaf (Get-Location))-worktrees/$BranchName"
    git worktree remove $worktreeDir
    if ($WithBranch) {
        git branch -d $BranchName
    }
}

Set-Alias nwt New-Worktree
Set-Alias rwt Remove-Worktree

使い方:

nwt hotfix/urgent      # ワークツリー作成
rwt hotfix/urgent -WithBranch  # ワークツリーとブランチを削除

Git Bash での alias

# ~/.bashrc に追加
wt-add() {
    local branch=$1
    local repo=$(basename $(pwd))
    git worktree add "../${repo}-worktrees/${branch}" -b "$branch"
}

wt-rm() {
    local branch=$1
    local repo=$(basename $(pwd))
    git worktree remove "../${repo}-worktrees/${branch}"
    [ "$2" = "--with-branch" ] && git branch -d "$branch"
}

注意点

環境構築は毎回必要

新しいworktreeにはnode_modules.envもない。

# worktree に移動したら
pnpm install
cp ../<メインディレクト>/.env .env

リソース消費

複数のClaude Codeセッションを走らせると、以下の問題がある。

  • メモリ使用量が増加
  • API コスト(トークン)が複数分かかる

3〜5個程度が実用的な上限である。

同じブランチは1つの worktree のみ

1つのブランチを複数のworktreeでチェックアウトすることはできない。

# これはエラーになる
git worktree add ../wt1 feature/x
git worktree add ../wt2 feature/x  # fatal: 'feature/x' is already checked out

まとめ

課題git stashgit worktree
コンテキストの退避手動 stash/pop不要
並行作業不可複数ブランチを同時に開ける
AI エージェントとの相性競合リスクあり独立した作業空間
環境構築毎回(checkout 後)毎回(worktree 作成後)

git worktreeは、特にAIエージェントとの並行開発で威力を発揮する。stashを卒業して、ストレスフリーな開発を実現しよう。

参考