Git Worktreeで複数ブランチを同時に作業する方法



新人向けに Git worktree の説明をする機会があったのでメモ。
通常、1つの Git リポジトリは 1つの作業ディレクトリ(ワーキングツリー) しか持てません。 あるブランチを確認したいとき、今の作業を stash したり commit したりしてからブランチを切り替える必要があります。
Git worktree は、1つのリポジトリから 複数の作業ディレクトリを同時に展開 できる機能です。
リポジトリ(.git)
├── /project ← メイン(main ブランチ)
├── /project-feature-a ← worktree(feature/a ブランチ)
└── /project-hotfix ← worktree(hotfix/xxx ブランチ)それぞれのディレクトリが 独立したブランチ を持ち、同時並行で作業できます。
.git の履歴・設定は共有されるため、クローンを複数作るより軽量です。
機能開発の途中でバグ修正の依頼が来た場合、stash や中途コミットなしに別ディレクトリで即座に対応できます。
main の動作を確認しながら feature ブランチを開発する、といった作業が1台のマシンで同時にできます。
テストや重いビルドを走らせながら、別のブランチで開発を継続できます。
実装エージェントに独立した worktree を割り当てることで、複数 issue の実装を同時並行で行えます。
# 既存ブランチを別ディレクトリに展開
git worktree add <ディレクトリパス> <ブランチ名>
# 新しいブランチを作りながら展開(-b オプション)
git worktree add -b <新ブランチ名> <ディレクトリパス>git worktree list出力例:
/project abc1234 [main]
/project-feature-a def5678 [feature/issue-42]
/project-hotfix ghi9012 [hotfix/login-bug]# ディレクトリを削除してから登録解除
git worktree remove <ディレクトリパス>
# ディレクトリが既に手動削除済みの場合は prune で掃除
git worktree pruneworktree のディレクトリに cd した後は、通常の Git 操作がそのまま使えます。
cd /project-feature-a
git status
git add .
git commit -m "feat: ..."
git push# 現在 feature/new-ui ブランチで作業中
# → 急ぎのバグ修正依頼が来た
# hotfix 用の worktree を作成
git worktree add -b hotfix/login-error ../project-hotfix
# hotfix ディレクトリで修正・コミット・プッシュ
cd ../project-hotfix
# ... 修正作業 ...
git commit -m "fix: ログインエラーを修正"
git push origin hotfix/login-error
# 元の作業ディレクトリに戻る
cd ../project
# feature/new-ui の作業をそのまま継続
# hotfix 完了後に worktree を削除
git worktree# main ブランチの worktree を追加
git worktree add ../project-main main
# ターミナルを2つ開いて比較
# ターミナル1(feature ブランチ): cd ../project
# ターミナル2(main ブランチ): cd ../project-main
# 確認が終わったら削除
git worktree remove ../project-main# implementer エージェント用の worktree を作成
# ブランチ名の "/" を "-" に置換してディレクトリ名にする
git worktree add .claude/worktrees/feature-issue73 feature/issue73
# エージェントが独立した worktree で実装
# メインの作業ディレクトリには影響しない
# 作業完了後に削除
git worktree remove .claude/worktrees/feature-issue731つのブランチは1つの worktree にしか展開できません。 同じブランチを別ディレクトリでも使おうとするとエラーになります。
# ERROR: ブランチ feature/a は既に使用中
git worktree add ../another-dir feature/aworktree のディレクトリを rm -rf で削除しても、Git 側の登録は残ります。
git worktree list で孤立した worktree を確認し、定期的に git worktree prune を実行しましょう。
git worktree list # 一覧確認
git worktree prune # 孤立した登録を掃除ディレクトリパスを指定するときは、現在地からの相対パスが使えますが、
後から git worktree list で見たときに分かりやすいよう、絶対パスや一貫した命名規則を使うと管理しやすいです。
このプロジェクトでは .claude/worktrees/<ブランチ名の/を-に置換> を命名規則としています。
git stash で退避した変更は、同じリポジトリの全 worktree から見えます。
worktree A で stash したものを worktree B で誤って pop してしまうリスクがあるので注意してください。
.gitignore 対象のファイルは引き継がれないnode_modules/ や .env.local など、.gitignore に記載されているファイルは Git が管理しておらず、worktree 作成時に コピーも共有もされません。
新しく作成した worktree ですぐ開発サーバーを起動しようとすると、依存パッケージや環境変数がないためエラーになります。
# worktree を作成した後、必ずセットアップを行う
cd .claude/worktrees/feature-issue73
# 依存パッケージのインストール
npm install
# 環境変数ファイルをコピー(元の作業ディレクトリからコピーする)
cp ../../.env.local .env.local
# 開発サーバーを起動
npm run dev補足:
node_modules/はプロジェクトルートとは別に、各 worktree に個別にインストールが必要です。ディスク容量が増える点に注意してください。シンボリックリンクで共有する方法もありますが、パッケージのバージョンが異なるブランチ間では使えません。
| 課題 | worktree なし | worktree あり |
|---|---|---|
| 割り込み作業 | stash が必要 | 別ディレクトリで即対応 |
| ブランチ比較 | 切り替えが面倒 | 同時に開いて比較可能 |
| 並列ビルド | 不可 | 別 worktree で並列実行 |
| クローン | ディスク容量大 | .git を共有するので軽量 |