応用

git worktree

1つのリポジトリから複数の作業ディレクトリを同時に作成します。ブランチを切り替えずに、別々のディレクトリで並行して作業したいときに使います。

構文 git worktree <subcommand> [options]

オプション

フラグ 説明
add 新しい worktree(作業ディレクトリ)を追加します(例: git worktree add ../hotfix hotfix/urgent-bug)。
list 現在存在するすべての worktree の一覧とパス、チェックアウト中のブランチを表示します。
remove 指定した worktree を削除します。
prune 手動で削除されて実体のなくなった worktree の管理情報をクリーンアップします。

git worktree は、1つの Git リポジトリに対して複数の作業ディレクトリ(worktree)を同時に持てるようにする機能です。通常、1つのリポジトリでは同時に1つのブランチしかチェックアウトできませんが、worktree を使うと別々のディレクトリでそれぞれ異なるブランチを同時にチェックアウトできます。

なぜ worktree が必要か

作業中に別ブランチの内容を確認したくなったとき、通常は git stash で退避してから git switch する必要があります。

# worktree を使わない場合
git stash push -m "作業中の変更"
git switch hotfix/urgent-bug
# ... 緊急対応 ...
git switch feature/login
git stash pop

git worktree を使えば、stash を挟まずに別ディレクトリで並行作業できます。

main-repo/            ← main ブランチ(既存の作業ディレクトリ)
├── .git/
└── ...

../hotfix/            ← hotfix/urgent-bug ブランチ(新しい worktree)
└── ...

基本的な使い方

# 新しいブランチ用に worktree を追加する
git worktree add ../hotfix hotfix/urgent-bug

# 既存のブランチをチェックアウトする worktree を追加する
git worktree add ../review feature/login

# 新規ブランチを作成しつつ worktree を追加する
git worktree add -b feature/new-ui ../new-ui main

../hotfix ディレクトリが新規作成され、そこに hotfix/urgent-bug ブランチの内容がチェックアウトされます。元のディレクトリの作業内容には一切影響しません。

worktree の一覧を確認する

git worktree list
/home/user/main-repo       a1b2c3d [main]
/home/user/hotfix          f9e8d7c [hotfix/urgent-bug]
/home/user/review          e4f5g6h [feature/login]

使い終わった worktree を削除する

# worktree を削除する
git worktree remove ../hotfix

# 手動でディレクトリを削除してしまった場合の後片付け
git worktree prune

rm -rf で直接ディレクトリを消してしまうと Git の管理情報だけが残ってしまうため、可能な限り git worktree remove を使い、消してしまった場合は git worktree prune でクリーンアップします。

よくある使いどころ

シーン使い方
作業中に緊急のhotfixが必要になった別ディレクトリに worktree を追加し、stash なしで対応
PRのレビュー時に実際に動かして確認したいレビュー対象ブランチ用の worktree を追加して実行環境として使う
長時間かかるビルド・テストを別ブランチで走らせつつ他の作業を続けたいworktree を分けて同時並行で作業

ヒント

  • 同じブランチを複数の worktree で同時にチェックアウトすることはできません(Git が二重チェックアウトを防止します)。
  • worktree はメインリポジトリと .git オブジェクトを共有するため、git clone を複数作るより軽量です。