git worktree:ブランチごとに作業フォルダを分ける
stashやcloneをせずに、1つのリポジトリで複数のブランチを同時に開く方法。
この記事で扱うこと
worktreeは、履歴を共有したまま作業フォルダだけを増やす仕組みです。作る、使う、片づける、の3つのコマンドで足ります。
作業を中断せずに、別のブランチを開く
作業の途中で、急ぎの修正が入ることがあります。ブランチを切り替えるには、変更をコミットかstashで退避しなければなりません。リポジトリをもう一つcloneする方法もありますが、履歴が二重になり、片方で取り込んだ内容がもう片方には見えません。
git worktreeを使うと、1つのリポジトリに、作業フォルダを複数持てます。履歴とブランチは共有され、フォルダごとに別のブランチが開かれます。
作業フォルダは、メインのフォルダの外に作ります。中に作ると、メインの側から未追跡のファイルに見えてしまいます。
下の図のように、履歴は1つで、作業フォルダが複数になります。
作る・使う・片づける
新しい作業フォルダは、git worktree addで作ります。-bを付けると、新しいブランチも同時に作れます。
# ../app-fix に、fix/typo という新しいブランチを開く
git worktree add ../app-fix -b fix/typo
# いま開いているフォルダの一覧
git worktree list作ったフォルダに移動すれば、普通のリポジトリと同じようにコミットできます。終わってPRを出したら、フォルダを片づけます。
git worktree remove ../app-fixremoveは、コミットされていない変更があるフォルダを消しません。変更が残っていれば、先にコミットするか捨てるかを選びます。ブランチ自体は残るので、不要なら別に削除します。
知っておくこと
- 同じブランチは、同時に1つの作業フォルダでしか開けません。 すでに別のフォルダで開いているブランチを指定すると、エラーになります。
- 作業フォルダには.gitがファイルとして置かれます。 中身は、メインのリポジトリの.gitを指すパスです。このファイルを消すと、Gitがフォルダを認識できなくなります。
- 依存関係は、フォルダごとに入れ直します。 node_modulesのような、追跡されないファイルは共有されません。
- フォルダを手で消したときは、git worktree pruneで記録を整理します。 記録が残っていると、同じブランチを開き直せなくなることがあります。
作業フォルダが増えたら、git worktree listで今の状態を確認します。使い終わったフォルダは、早めに片づけます。
並行して作業するときに向いている場面
- 作業の途中で、急ぎの修正を別ブランチで出したい
- 他の人のPRを、手元のブランチを動かさずに動かして確認したい
- 長いビルドやテストを回している間に、別の作業を進めたい
- Claude Codeなどのエージェントに、別のブランチで作業させたい(作業が混ざらないよう、フォルダを分けられる)
公式リファレンス
Git — git-worktree Documentation ↗PAIBOT / DEVELOPMENT JOURNAL記事一覧に戻る →