git worktree
1つのリポジトリから複数の作業ディレクトリを同時に作成します。ブランチを切り替えずに、別々のディレクトリで並行して作業したいときに使います。
構文
git worktree <subcommand> [options] 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を複数作るより軽量です。