Git worktreeとは?複数ブランチを同時に作業する方法を初心者向けに解説
Git worktreeの基本的な使い方と実践的な活用方法を初心者向けに解説します。複数のブランチを同時に開いて並行作業できるworktreeコマンドで、ブランチ切り替えの手間を大幅に削減しましょう。
Git worktreeとは
Git worktreeは、1つのリポジトリから複数の作業ディレクトリを作成できるコマンドです。通常、ブランチを切り替えるにはgit checkoutやgit switchを使いますが、worktreeを使うと複数のブランチを同時に別々のディレクトリで開いて作業できます。
たとえば、機能開発中に緊急のバグ修正が入った場合、通常は作業を中断してブランチを切り替える必要があります。worktreeを使えば、別のディレクトリでバグ修正用のブランチを開き、両方の作業を並行して進められます。
worktreeの仕組み
通常のブランチ切り替えとworktreeの違いを図で見てみましょう。
通常のブランチ切り替え
通常の方法では、1つの作業ディレクトリを切り替えながら使います。未コミットの変更がある場合、stashで退避するか、コミットしてから切り替える必要があります。
worktreeを使った並行作業
worktreeを使うと、1つの.gitディレクトリを共有しながら、複数の作業ディレクトリを持てます。それぞれのディレクトリは独立しているため、同時に異なるブランチで作業できます。
| 方法 | 作業ディレクトリ | 同時作業 | 切り替えの手間 |
|---|---|---|---|
| 通常のcheckout | 1つ | 不可 | 毎回発生 |
| git worktree | 複数 | 可能 | なし |
worktreeの基本的な使い方
worktreeを追加する
git worktree addコマンドで新しい作業ディレクトリを作成します。
# 基本構文: git worktree add <パス> <ブランチ名>
git worktree add ../my-project-feature feature
# 新しいブランチを作成しながらworktreeを追加
git worktree add -b hotfix ../my-project-hotfix main
| コマンド | 説明 |
|---|---|
git worktree add ../path branch | 既存ブランチでworktreeを作成 |
git worktree add -b new-branch ../path base | 新規ブランチを作成してworktreeを追加 |
作成されたディレクトリに移動すれば、そのブランチで作業を開始できます。
# 作成したworktreeに移動
cd ../my-project-feature
# 通常通りGit操作が可能
git status
git add .
git commit -m "機能追加"
worktree一覧を確認する
git worktree list
出力例:
/Users/user/my-project abcd123 [main]
/Users/user/my-project-feature efgh456 [feature]
/Users/user/my-project-hotfix ijkl789 [hotfix]
各行に、パス、コミットハッシュ、ブランチ名が表示されます。
worktreeを削除する
作業が完了したworktreeは削除できます。
# worktreeを削除
git worktree remove ../my-project-feature
# または、ディレクトリを手動削除後にクリーンアップ
rm -rf ../my-project-feature
git worktree prune
| コマンド | 説明 |
|---|---|
git worktree remove <パス> | worktreeを削除 |
git worktree prune | 存在しないworktreeの参照を削除 |
注意: worktreeを削除しても、ブランチ自体は削除されません。ブランチも削除したい場合は、別途git branch -dを実行してください。
よく使うオプション
| オプション | 説明 | 例 |
|---|---|---|
-b <ブランチ名> | 新しいブランチを作成 | git worktree add -b fix ../fix main |
-B <ブランチ名> | ブランチを強制的に作成/リセット | git worktree add -B fix ../fix main |
--detach | ブランチなしでコミットを直接チェックアウト | git worktree add --detach ../temp HEAD~3 |
-f / --force | 強制的に操作を実行 | git worktree remove -f ../path |
特定のコミットでworktreeを作成
過去のコミットを確認したい場合、--detachオプションが便利です。
# 3つ前のコミットでworktreeを作成
git worktree add --detach ../old-version HEAD~3
# 特定のタグでworktreeを作成
git worktree add --detach ../v1.0 v1.0.0
実践的な活用シーン
緊急のバグ修正と機能開発の並行作業
最もよくある使用シーンです。機能開発中に緊急のバグ修正依頼が来た場合を考えてみましょう。
# 現在featureブランチで開発中
# 緊急のバグ修正用にworktreeを作成
git worktree add -b hotfix ../my-project-hotfix main
# hotfixディレクトリでバグ修正
cd ../my-project-hotfix
# ... バグ修正作業 ...
git add .
git commit -m "緊急バグ修正"
git push origin hotfix
# 元の作業に戻る
cd ../my-project
# feature開発を継続
この方法なら、featureブランチの作業を中断せずにバグ修正ができます。stashを使う必要もありません。
コードレビュー中の作業
プルリクエストのレビューをしながら、自分の作業も続けたい場合に便利です。
# レビュー対象のブランチでworktreeを作成
git fetch origin
git worktree add ../review origin/feature-to-review
# レビュー用ディレクトリで確認
cd ../review
# コードを確認、テストを実行など
# レビュー完了後に削除
cd ../my-project
git worktree remove ../review
長時間のビルドやテスト実行中の作業
ビルドやテストの実行中に、別の作業を進めたい場合にも活用できます。
# テスト実行用のworktreeを作成
git worktree add ../test-runner main
# テストを実行(バックグラウンド)
cd ../test-runner
npm test &
# メインの作業ディレクトリで開発を継続
cd ../my-project
# ... 開発作業 ...
初心者が混乱しやすいポイント
worktreeとcloneの違い
似たような結果が得られるため混乱しがちですが、重要な違いがあります。
| 項目 | worktree | clone |
|---|---|---|
| リポジトリ | 1つを共有 | 完全に別のコピー |
| ディスク容量 | 少ない | 多い(.gitも複製) |
| 変更の反映 | 即時(同じ.git) | push/pullが必要 |
| 同じブランチ | 開けない | 開ける |
worktreeは1つのリポジトリを共有するため、あるworktreeで行ったコミットは他のworktreeからもすぐに見えます。cloneの場合は完全に独立したリポジトリなので、push/pullで同期する必要があります。
同じブランチを複数のworktreeで開けない
これはworktreeの重要な制約です。すでにチェックアウトされているブランチでworktreeを作成しようとするとエラーになります。
# mainがすでにチェックアウトされている状態で
git worktree add ../another-main main
# fatal: 'main' is already checked out at '/Users/user/my-project'
この制約がある理由は、同じブランチを複数の場所で編集すると、どちらの変更が正しいのか混乱が生じるためです。
対処法:
- 別のブランチ名でworktreeを作成する
--detachオプションで特定のコミットを直接チェックアウトする
# detachモードなら同じコミットを開ける
git worktree add --detach ../main-copy main
worktreeを削除してもブランチは残る
worktreeの削除はディレクトリの削除であり、ブランチの削除ではありません。
# worktreeを削除
git worktree remove ../my-project-feature
# ブランチはまだ存在する
git branch
# * main
# feature ← まだある
# ブランチも削除する場合は別途実行
git branch -d feature
worktreeを使う際の注意点
パスの指定に注意
worktreeのパスは、メインの作業ディレクトリの外に作成することをおすすめします。
# 推奨: 親ディレクトリに作成
git worktree add ../my-project-feature feature
# 非推奨: リポジトリ内に作成
git worktree add ./worktrees/feature feature
# .gitignoreに追加が必要になる
リポジトリ内に作成すると、そのディレクトリが追跡対象になってしまう可能性があります。
ロックされたworktree
worktreeが他のプロセスで使用中の場合、削除できないことがあります。
# ロックを確認
git worktree list --porcelain
# 強制削除
git worktree remove -f ../locked-worktree
定期的なクリーンアップ
不要になったworktreeは定期的に削除しましょう。手動でディレクトリを削除した場合は、pruneコマンドで参照を整理します。
# 存在しないworktreeの参照を削除
git worktree prune
# 詳細を表示しながらprune
git worktree prune --verbose
トラブルシューティング
"is already checked out"エラー
fatal: 'branch-name' is already checked out at '/path/to/worktree'
| 原因 | 対処 |
|---|---|
| ブランチが他のworktreeで使用中 | 別のブランチ名を使用するか、--detachを使う |
| 削除したworktreeの参照が残っている | git worktree pruneを実行 |
worktreeが見つからないエラー
# worktreeの状態を確認
git worktree list
# 参照をクリーンアップ
git worktree prune
worktreeでpushできない
worktree内でも通常通りgit pushできます。ただし、リモートの設定はメインリポジトリと共有されているため、特別な設定は不要です。
cd ../my-project-feature
git push origin feature
よく使うコマンド一覧
| 操作 | コマンド |
|---|---|
| worktreeを追加 | git worktree add <パス> <ブランチ> |
| 新規ブランチでworktreeを追加 | git worktree add -b <ブランチ> <パス> <ベース> |
| worktree一覧を表示 | git worktree list |
| worktreeを削除 | git worktree remove <パス> |
| 参照をクリーンアップ | git worktree prune |
| detachモードで追加 | git worktree add --detach <パス> <コミット> |
まとめ
Git worktreeは、複数のブランチを同時に作業できる便利なコマンドです。
| 特徴 | 説明 |
|---|---|
| 並行作業 | 複数のブランチを同時に開ける |
| リソース効率 | 1つの.gitを共有するためディスク容量を節約 |
| 切り替え不要 | ディレクトリを移動するだけでブランチ変更 |
| 即時反映 | 同じリポジトリを共有するためコミットが即反映 |
- worktreeは1つのリポジトリから複数の作業ディレクトリを作成する機能
git worktree addで追加、git worktree removeで削除- 同じブランチを複数のworktreeで開くことはできない
- worktreeを削除してもブランチは残る
- 緊急のバグ修正、コードレビュー、並行作業に便利
ブランチ切り替えの手間を減らし、効率的に作業を進めたい場合にぜひ活用してみてください。
編集部