複数ブランチを同時に開く- git worktree
1つのリポジトリから複数の作業ディレクトリ(ワークツリー)を生やして、別ブランチを同時にチェックアウトします。
概念図
構文
git worktree <add|list|remove|prune> [<args>]使用例
新しい作業ディレクトリで hotfix ブランチを開く
git worktree add ../my-app-hotfix hotfix/login新規ブランチを切って別ディレクトリで作業
git worktree add -b feature/new ../my-app-feature現在の worktree 一覧を表示
git worktree listworktree を安全に削除
git worktree remove ../my-app-hotfix手動削除した worktree の管理情報を掃除
git worktree pruneworktree とは
git worktree は、1つのリポジトリ(.git ディレクトリ)を共有しつつ、複数の作業ディレクトリを作る仕組みです。
通常の git clone と違って履歴やオブジェクトは共有されるため、ディスク使用量が小さく、取得済みのコミットを再ダウンロードする必要もありません。
典型的な使い所は「feature ブランチを書いている途中に hotfix の依頼が来た」ような場面です。
git stash で退避してブランチを切り替える代わりに、別ディレクトリに hotfix ブランチを生やせば、現在の作業は触らずに並行作業できます。
ビルド成果物や node_modules もディレクトリごとに独立するため、ブランチ切り替え時の再ビルド地獄からも解放されます。
近年は Claude Code などの AI エージェントが並列で作業するための分離環境としても注目されています。
基本的な使い方
worktree を追加する
git worktree add <path> <branch>で既存ブランチを別ディレクトリにチェックアウトします。新規ブランチを同時に作る場合は-bオプションを付けます。パスはリポジトリの外(例:../my-app-hotfix)に置くのが一般的です。別ディレクトリで作業する
作成された worktree ディレクトリに
cdして、通常通りgit add/git commit/git pushを行います。ブランチごとに独立した作業ツリーなので、ビルドもテストも並行で回せます。一覧を確認する
git worktree listで現在存在する worktree と、それぞれがどのブランチ・コミットを指しているかを確認できます。不要になったら削除する
git worktree remove <path>で安全に削除できます。対象ディレクトリをrm -rfで消すのは避けてください(管理情報が残ってしまいます)。誤って手で消してしまった場合はgit worktree pruneで掃除できます。
# 1. hotfix ブランチを別ディレクトリで開く
git worktree add ../my-app-hotfix hotfix/login
# 2. 新規ブランチを切って作業
git worktree add -b feature/new ../my-app-feature
# 3. 一覧を確認
git worktree list
# 4. 使い終わったら削除
git worktree remove ../my-app-hotfixハマりポイント
同じブランチを2つの worktree で開けない
Git は同じブランチを複数の worktree で同時にチェックアウトすることを禁止しています(HEADの同期が取れなくなるため)。どうしても必要な場合は
--forceを付けるか、別ブランチを切って作業してください。rm -rfでの削除は残骸を残すディレクトリを直接削除すると、
.git/worktrees/<name>/に管理情報が残り、git worktree listに「prunable」として表示され続けます。git worktree removeを使うか、後からgit worktree pruneで掃除しましょう。submodule・node_modules は自動では共有されない
worktree は
.gitは共有しますが、サブモジュールやnode_modulesはディレクトリごとに独立です。新しい worktree でもgit submodule update --initやpnpm installを忘れずに実行してください。フック・設定はメインの
.gitを参照する.git/hooksやconfigはメインリポジトリ側に置かれるため、worktree ごとに別のフックを設定することはできません(共有が基本)。stash との使い分け
「数分で戻る一時退避」なら
git stash、「数時間〜数日並行して触る別ブランチ」ならgit worktreeが向いています。ビルド環境ごと分離できるのが worktree の強みです。
