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 stash | git worktree |
|---|---|---|
| コンテキストの退避 | 手動 stash/pop | 不要 |
| 並行作業 | 不可 | 複数ブランチを同時に開ける |
| AI エージェントとの相性 | 競合リスクあり | 独立した作業空間 |
| 環境構築 | 毎回(checkout 後) | 毎回(worktree 作成後) |
git worktreeは、特にAIエージェントとの並行開発で威力を発揮する。stashを卒業して、ストレスフリーな開発を実現しよう。