Git worktreeとは?複数ブランチを同時に作業する方法を初心者向けに解説

Git worktreeの基本的な使い方と実践的な活用方法を初心者向けに解説します。複数のブランチを同時に開いて並行作業できるworktreeコマンドで、ブランチ切り替えの手間を大幅に削減しましょう。

Git worktreeとは

Git worktreeは、1つのリポジトリから複数の作業ディレクトリを作成できるコマンドです。通常、ブランチを切り替えるにはgit checkoutgit switchを使いますが、worktreeを使うと複数のブランチを同時に別々のディレクトリで開いて作業できます。

たとえば、機能開発中に緊急のバグ修正が入った場合、通常は作業を中断してブランチを切り替える必要があります。worktreeを使えば、別のディレクトリでバグ修正用のブランチを開き、両方の作業を並行して進められます。

worktreeの仕組み

通常のブランチ切り替えとworktreeの違いを図で見てみましょう。

通常のブランチ切り替え

通常の方法では、1つの作業ディレクトリを切り替えながら使います。未コミットの変更がある場合、stashで退避するか、コミットしてから切り替える必要があります。

worktreeを使った並行作業

worktreeを使うと、1つの.gitディレクトリを共有しながら、複数の作業ディレクトリを持てます。それぞれのディレクトリは独立しているため、同時に異なるブランチで作業できます。

方法作業ディレクトリ同時作業切り替えの手間
通常のcheckout1つ不可毎回発生
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の違い

似たような結果が得られるため混乱しがちですが、重要な違いがあります。

項目worktreeclone
リポジトリ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を削除してもブランチは残る
  • 緊急のバグ修正、コードレビュー、並行作業に便利

ブランチ切り替えの手間を減らし、効率的に作業を進めたい場合にぜひ活用してみてください。

編集部

編集部