Git worktreeとは?実際の使い方を図式で分かりやすく解説

  • 2026.08.07
       
【Git Worktree】複数ディレクトリで並列作業する

Git worktreeとは、1つのGitリポジトリに複数の作業ディレクトリを関連付け、異なるブランチを同時に開けるGitの機能です。
作業中のブランチを切り替えずに、機能開発や緊急修正、コードレビューなどの作業を並列で進められます。

通常、1つの作業ディレクトリで別のブランチを確認するには、変更をcommitしたり、git stashで一時的に退避したりしてからブランチを切り替える必要があります。
Git worktreeを使えば、現在の作業状態を残したまま別の作業ディレクトリを追加できるため、切り替えの手間や操作ミスを減らせます。

この記事では、Git worktreeの仕組みから、新規・既存ブランチでの作成方法、確認・削除、removepruneの違い、よくあるエラーまで解説します。
あわせて、Claude CodeなどのAIエージェントを使った並列開発の方法も、実際のコマンド例とともに紹介します。

目次

Git worktreeとは

Git worktreeで共有されるGit管理情報とworktreeごとに分離されるHEAD・index・作業ファイル
Git worktreeで共有される情報と、worktreeごとに分離される情報の違い

Git worktreeでは、最初に作成されたメインworktreeに加えて、必要に応じてlinked worktreeを追加できます。
まずは、複数の作業ディレクトリがどのように管理されるのか、基本的な仕組みを確認しましょう。

Git worktreeの仕組み

git initgit cloneで最初に作成した作業ディレクトリは「メインworktree」と呼ばれます。
git worktree addで追加する作業ディレクトリは「linked worktree」と呼ばれ、メインworktreeとは別の場所に作成されます。

メインworktreeとlinked worktreeは、コミット履歴やGitオブジェクト、ブランチの情報といったリポジトリの情報を共有します。
一方、HEADやindex(ステージ状態)、作業中のファイルは、worktreeごとに独立して管理されます

そのため、linked worktreeのルートにある.gitは、通常のリポジトリにある.gitディレクトリとは異なります。
実体はディレクトリではなく、共通のGit管理領域を参照する1つのファイルです。

Git worktreeの管理構成
workspace/
├── my-project/            # メインworktree(main)
│   └── .git/              # 共通のGit管理領域(実体)
├── feature-login/         # linked worktree(feature/login)
│   └── .git               # 共通領域を参照するファイル
└── hotfix-critical/       # linked worktree(hotfix/critical-bug)
    └── .git               # 共通領域を参照するファイル

1つのworktreeでgit fetchを実行して取得したGitオブジェクトやリモート追跡情報は、共通領域に保存されるため、他のworktreeからも参照できます。
一方、依存ライブラリやビルド成果物、.envなどの環境設定は、worktreeごとに準備が必要な場合があります。この点については、後述の注意点で改めて説明します。

Git worktreeでできること

Git worktreeを使うと、次のような作業が可能になります。

複数ブランチを切り替えずに並行作業する
1つのworktreeで動作確認をしながら、別のworktreeで開発を続けられます。ブランチを切り替える回数そのものを減らせます

開発中の状態を残したまま緊急修正を行う
作業中のファイルをコミットやgit stashで退避せずに残したまま、別のworktreeで緊急修正に対応できます。修正が終われば、元の作業へすぐ戻れます

プルリクエストや別ブランチをレビューする
レビュー専用のworktreeを用意すれば、自分の作業環境を変更せずに他のブランチの内容を確認できます。動作を確認しながらコードを読み進められます。

AIエージェントごとに作業場所を分離する
Claude CodeなどのAIエージェントをworktreeごとに実行すれば、複数のエージェントが同じファイルを同時に書き換える事態を避けやすくなります。詳しい方法は後述します。

▼こちらもチェック▼
Gitとは?できることやGitに関する用語を解説 Gitとは?できることやGitに関する用語を解説

ブランチ・git clone・git stashとworktreeの違い

git stashを使ったブランチ切り替えとGit worktreeを使った並行作業の比較
通常のブランチ切り替えと比べた、Git worktreeによる並行作業のイメージ

Git worktreeは、通常のブランチ運用やgit cloneと似た場面で使われることがありますが、それぞれ役割が異なります。
まずは3つの方法を比較します。

項目 通常のブランチ運用 git clone git worktree
役割 開発内容を分ける リポジトリを複製する 作業ディレクトリを増やす
作成されるもの ブランチ 独立したリポジトリ 共有リポジトリ配下の作業ディレクトリ
Git管理情報 1つの.gitを共有 クローンごとに独立した.gitを持つ Gitオブジェクトなどの共通管理情報を共有
ブランチ切り替え 都度切り替えが必要 クローンごとに個別に切り替え可能 worktreeごとに異なるブランチをチェックアウト可能
ディスク使用量 少ない クローンの数だけ増える 作業ファイル分で済むことが多い
向いている場面 通常の機能開発 完全に独立した環境が必要な場合 同じリポジトリで並行作業したい場合

1つのリポジトリには複数のブランチを作成できますが、通常の1つの作業ディレクトリ(worktree)で同時にチェックアウトできるブランチは1つだけです。
別のブランチを見るには、都度git checkoutでの切り替えが必要になります。

git cloneでリポジトリを複製すれば、クローンごとに異なるブランチをチェックアウトできます
ただし、それぞれのクローンは独立した.gitディレクトリを持つため、コミット履歴やGitオブジェクトは共有されません。クローンを増やすほどディスク容量も消費します。

Git worktreeを使うと、1つの共有リポジトリのまま、異なるworktreeで複数のブランチを同時にチェックアウトできます
Gitオブジェクトや履歴を共有するため、git cloneに比べてディスク使用量を抑えやすくなります。

git stashとの違いも整理しておきましょう。
git stashは、変更内容を一時的に退避してからブランチを切り替える方法です。作業ディレクトリは1つのままで、退避と復元(stash pop)を都度行います。

一方、worktreeは、現在の作業状態を残したまま、別の作業ディレクトリを追加する方法です。
短時間の切り替えにはgit stashが手軽ですが、並行作業を続けたい場合や、作業環境ごと維持したい場合はworktreeが向いています

Git worktreeの使い方

ここからは、実際にGit worktreeを操作してみましょう。
この記事では、次のディレクトリ構成を例として使用します。

今回使用するディレクトリ構成
workspace/
├── my-project/           # mainブランチ
├── feature-login/        # feature/loginブランチ
└── hotfix-critical/      # hotfix/critical-bugブランチ

リポジトリとworktreeの状態を確認する

まずは作業するリポジトリへ移動し、現在登録されているworktreeを確認します。

Bash
cd my-project
git worktree list

出力例は次のようになります。

git worktree listの出力例
/Users/example/workspace/my-project  a1b2c3d [main]

ロック状態や削除可能かどうかなど、より詳しい情報を確認したい場合は--verboseを付けます。

Bash
git worktree list --verbose

この時点では、メインworktreeのみが表示されます。
git worktree addで新しいブランチを作成するには基点となるコミットが必要なため、リポジトリの初回コミットがまだの場合は先に済ませておきましょう

新しいブランチとworktreeを同時に作成する

新しいブランチの作成とworktreeの作成を同時に行う場合は、git worktree add-bオプションを付けます。

Bash
git worktree add -b feature/login ../feature-login main

それぞれの意味は次のとおりです。

  • -b feature/login … 新しく作成するブランチ名
  • ../feature-login … worktreeの作成先ディレクトリ
  • main … 新しいブランチの作成元ブランチ

公式ドキュメントの構文では、オプションはパスより前に記載します。
作成元のブランチを省略した場合は、現在のHEADが基点になります。意図しないブランチを基点にしないよう、基点を明示したい場合はmainのようにブランチ名を書いておくと安全です。

git worktree addでfeature-loginブランチのworktreeを作成し、git worktree listで確認したWindows PowerShell画面
feature/loginブランチのworktreeを作成し、git worktree listで登録状態を確認した画面

既存のローカルブランチでworktreeを作成する

既に存在するブランチでworktreeを作成する場合は、-bオプションを付けずにブランチ名を指定します。

Bash
git worktree add ../develop develop

指定したブランチが別のworktreeで既にチェックアウトされている場合は、エラーになります。
同じブランチは、複数のworktreeで同時に使用できません。詳しいエラー内容と対処方法は後述します。

リモートブランチをレビュー用worktreeで開く

他のメンバーが作成したリモートブランチを、読み取りや動作確認のために確認したい場合は、まず最新の情報を取得します。

Bash
git fetch origin
git worktree add --detach ../review-login origin/feature/login

--detachを付けると、ブランチに関連付けずに特定のコミットをそのままチェックアウトできます。この状態は「detached HEAD(デタッチドヘッド)」と呼ばれ、その場でコミットしても、どのブランチにも属さない孤立したコミットになる点に注意が必要です。
動作確認だけが目的で、そのworktree上でコミットを作らない場合に向いています。

レビュー先で修正してコミットする場合は、リモートブランチを基点にローカルブランチを作成しておきましょう。

Bash
git worktree add -b review/feature-login ../review-login origin/feature/login

なお、リモート追跡ブランチであることを明示したい場合は、--trackを付けて次のように書くこともできます。

Bash
git worktree add --track -b review/feature-login ../review-login origin/feature/login

-bでリモート追跡ブランチを直接指定した場合、多くの環境では自動的に追跡設定が行われますが、–trackを付けておくと、追跡関係が確実に設定されます
作成後にgit pushやgit pullを行う際、追跡先を毎回指定する手間を省けます。

作成したworktreeで作業する

作成したworktreeは、通常のフォルダと同じように扱えます。
feature-loginへ移動し、現在のブランチと状態を確認してみましょう。

Bash
cd ../feature-login
git branch --show-current
git status

git branch --show-currentを実行すると、feature/loginが表示されます。
この状態になれば、あとは通常のブランチと同じように開発を進められます

VS Codeで開く場合は、次のコマンドが使えます。

Bash
code .

worktreeを削除する

作業が終わったら、不要になったworktreeを削除します。

Bash
git status
cd ../my-project
git worktree remove ../feature-login
git branch -d feature/login

この操作について、次の点を覚えておきましょう。

  • git worktree removeで削除されるのは、linked worktree(作業ディレクトリ側)
  • ブランチは自動では削除されない
  • ブランチも不要な場合は、worktreeを削除したあとにgit branch -dを実行する
  • 未コミットの変更や未追跡ファイルが残っているworktreeは、通常削除できない

削除できない場合は--force強制的に削除することもできますが、変更内容を失う可能性があるため、内容を確認せずに使うのは避けましょう

removeとpruneの違い

git worktree removegit worktree pruneは、どちらもworktreeの削除に関わるコマンドですが、役割が異なります。

項目 git worktree remove git worktree prune
用途 存在するlinked worktreeを安全に削除する 手動削除などで残った古い管理情報を整理する
対象 実際の作業ディレクトリとその管理情報 実体のないworktreeの管理情報のみ
通常の削除での使用 基本的にこちらを使う 通常は毎回実行しなくてよい

フォルダをファイルマネージャーなどから直接削除してしまった場合、Gitはその変更を認識できずgit worktree listに存在しない情報が残ることがあります。
その場合はpruneを実行して整理します。

Bash
git worktree prune
git worktree list

正常にremoveで削除できている場合は、pruneを毎回実行する必要はありません。

Git worktreeの主要コマンド・オプション一覧

ここまでに紹介したもの以外にも、Git worktreeにはいくつかのコマンドがあります。
使用頻度の高いものを中心に一覧で整理します。

コマンド 概要
git worktree add 新しいworktreeを作成する
git worktree list 登録されているworktreeを一覧表示する
git worktree remove 指定したworktreeを削除する
git worktree prune 実体のないworktreeの管理情報を整理する
git worktree move worktreeを別の場所へ移動する
git worktree lock worktreeを保護し、pruneや削除の対象から外す
git worktree unlock lockを解除する
git worktree repair worktreeの管理情報を修復する

moveは、外付けディスクやネットワーク越しに置いたworktreeなど、参照先の場所が変わった場合に使います
lockunlockは、取り外し可能な媒体上のworktreeなど、常時マウントされない環境でpruneや削除を防ぎたい場合に使用します。repairは、worktreeやメインリポジトリのパスを移動したあとに、管理情報のつながりを修復したい場合に使用します。
いずれも通常の開発では頻繁に使うものではないため、必要になった際に公式ドキュメントを確認すれば十分です

lockを使う際は、--reasonで理由を添えておくと、あとで見返したときに何のためのロックか分かりやすくなります。

Bash
git worktree lock --reason "USBドライブ上のため一時的に利用不可" ../portable-work

あわせて、よく使うオプションも整理しておきます。

オプション 概要
-b 新しいブランチを作成しながらworktreeを追加する
–detach ブランチに関連付けずにコミットをチェックアウトする
–force 安全のための制限を無視して操作を実行する
–verbose 実行結果やlist表示の詳細情報を表示する

Git worktreeの活用シーン

開発中に緊急修正が入った場合

feature/loginブランチで作業している最中に、本番環境で不具合が見つかったとします。
この場合、origin/mainを基点にして、hotfix用のworktreeを作成します。

Bash
git fetch origin
git worktree add -b hotfix/critical-bug ../hotfix-critical origin/main

作成元を省略すると、現在作業中のfeature/loginブランチを基点にhotfixブランチが作られてしまう可能性があります。
緊急修正では、origin/mainのように基点を明示しておくことが大切です。

なお、hotfix用のworktreeでは、依存関係の再インストールやビルドが必要になる場合があります
筆者も緊急修正のためにworktreeを作ってすぐコードを直しにいったものの、依存関係のインストールを忘れていて、動作確認の段階で足止めを食った経験があります。急いでいる時ほど、まずnpm installなどのセットアップを済ませてから作業に入ることをおすすめします。

チームメンバーのコードを確認する場合

チームメンバーが作成したブランチを確認する方法は、前述のレビュー用worktreeでも紹介しました。
この活用シーンでのメリットは、自分が作業中のエディタや未コミットの変更を、そのまま残せる点です。

ブランチを切り替える方法では、確認前に自分の変更をコミットやgit stashで退避する必要があります。
worktreeであれば、その手間をかけずに、別のディレクトリでレビューを進められます

複数のタスクや異なるバージョンを確認する場合

複数のタスクを同時に進めたい場合も、worktreeが役立ちます。
例えば、ログイン機能の開発と管理画面の改善を並行して進めたい場合、それぞれに専用のworktreeを用意すれば、ブランチの切り替えなしに作業できます

過去のタグやコミットの内容を確認したい場合にも、同じ方法が使えます。

Bash
git worktree add --detach ../version-1 v1.0.0

--detachを付けているため、v1.0.0タグが指すコミットの状態を、ブランチに影響を与えずに確認できます

Claude CodeなどのAIエージェントでGit worktreeを使う方法

AIエージェントとworktreeの相性がよい理由

Claude CodeなどのAIエージェントを使った開発では、複数のセッションを同時に動かしたい場面があります。
worktreeを使うと、エージェントごとにファイルとブランチを分離できるため、同じファイルを複数のエージェントが同時に上書きするリスクを抑えられます

機能開発、バグ修正、テスト作成などを、別々のセッションで並行して進めることもできます。
ただし、worktreeで作業場所を分けても、それぞれの変更を最終的にmainへマージする際には、内容によってコンフリクトが発生する可能性があります。worktreeは競合そのものをなくす機能ではなく、作業中の干渉を防ぐための機能です

Claude Codeのworktree機能を使う

Claude Codeには、worktreeを使って独立したセッションを開始するオプションが用意されています。

Bash
claude --worktree feature-auth

短縮形の-wオプションでも同じ操作ができます。

Bash
claude -w feature-auth

このコマンドを実行すると、次のような場所にworktreeとセッションが作成されます。

  • 作成先:.claude/worktrees/feature-auth/
  • 作成されるブランチ名:worktree-feature-auth

Claude Codeで作成されるworktreeは、既定でリポジトリのデフォルトブランチ(origin/HEAD)を基点にします。
リモートが設定されていない場合やfetchに失敗した場合は、現在のローカルHEADが基点になります。

別のターミナルで名前を変えて同じコマンドを実行すれば、複数のセッションを並行して開始できます
また、.claude/worktrees/以下はメインの作業ディレクトリから見ると未追跡ファイルとして表示されるため、.gitignoreに追加しておくとよいでしょう。
筆者も複数のClaude Codeセッションを同時に走らせる際にこの機能を使っていますが、それぞれが別のworktreeで動くため、ファイルの取り合いを気にせずセッション数を増やせる安心感は大きいと感じています。

.gitignoreへの追記例
.claude/worktrees/

.envなどのgitignore対象ファイルを引き継ぐ

worktreeは新しく用意される作業ディレクトリのため、.gitignoreで除外されている.envなどのファイルは、そのままでは含まれません。
Claude Codeでは、プロジェクトのルートに.worktreeincludeというファイルを用意しておくと、これらのファイルを新しいworktreeへ自動でコピーできます。

.worktreeincludeの記述例
.env
.env.local
config/secrets.local.json

.worktreeincludeについて、次の点を押さえておきましょう。

  • Claude Codeがworktreeを作成する際に使用するファイル
  • コピー対象になるのは、gitignoreの対象になっているファイルのみ
  • Gitで追跡されているファイルを重複コピーする機能ではない
  • node_modules.venv、ビルド成果物などは、必要に応じてworktreeごとに用意する

なお、git worktree addコマンドを直接使ってworktreeを作成する場合は、.worktreeincludeは自動的には適用されません。
この仕組みは、Claude Codeがworktreeを作成する場合に限られます

作業終了後に変更を統合する

AIエージェントによる作業が終わったら、次の流れで内容を確認してから統合しましょう。

  1. AIエージェントが変更した内容を確認する
  2. テストを実行する
  3. worktree側でコミットする
  4. main側でマージ、またはプルリクエストを作成する
  5. 不要になったworktreeを削除する

AIエージェントが生成した内容は、確認しないままマージせず、変更内容とテスト結果を必ず確認してから統合してください

▼こちらもチェック▼
【ハーネスエンジニアリングとは】AIエージェントで生産性を最大化する手法を解説 ハーネスエンジニアリングとは?AIエージェントで生産性を最大化する手法を解説

Git worktreeの注意点とよくあるエラー

Git worktreeを使う上でつまずきやすいポイントと、よくあるエラーへの対処法を整理しました。
まずは早見表で全体像をつかみ、詳しい内容は各項目で確認してください。

症状・エラー 原因 対処
worktreeが知らない間にprunable判定され、削除される worktreeを.gitディレクトリの中に作成した worktreeは.gitの外(隣のディレクトリなど)に作成する
同じブランチを別worktreeで指定するとエラーになる 同じブランチは複数のworktreeで同時にチェックアウトできない 別のブランチを使うか、不要な方をremoveする
git worktree removeが失敗する 未コミットの変更や未追跡ファイルが残っている git statusで確認し、コミット・stash・破棄のいずれかを行う
.envやnode_modulesが見当たらない Gitで追跡されていないファイルは新しいworktreeに含まれない 個別に用意するか、Claude Codeなら.worktreeincludeを使う
メインworktreeを削除できない メインworktreeはremoveの対象外 削除したい場合はリポジトリごと削除する
サブモジュールを含むリポジトリで不具合が出る 複数worktreeでのサブモジュールサポートは不完全 事前に公式ドキュメントで制限事項を確認する

worktreeの保存場所は.gitディレクトリの外にする

worktreeの作成先は、.gitディレクトリの外側に置くようにしましょう。
.gitディレクトリの中にworktreeを作成すると、Gitがその中身を不要な管理データと誤認し、git worktree pruneの対象(prunable)と判定して、意図せず削除してしまうことがあります

この記事のサンプルのように、../feature-loginのような形で、メインworktreeと同じ階層の「隣」に作成するのが安全です。
プロジェクトフォルダの中に入れ子で作成した場合も、エディタの検索結果に複数ブランチのファイルが混在するなど混乱の原因になるため、避けた方が無難です。

同じブランチは複数のworktreeで使用できない

既にどこかのworktreeでチェックアウトされているブランチを、別のworktreeでも指定しようとすると、次のようなエラーが発生します。

同じブランチを指定した場合のエラー例
fatal: 'feature/login' is already checked out at '/path/to/feature-login'

この場合は、次の順番で対応します。

  1. git worktree listで、そのブランチを使用しているworktreeを確認する
  2. 使用していないなら、git worktree removeで削除する
  3. 同時に作業したい場合は、別のブランチを新しく作成する

--forceを使えばこの制限を回避できますが、意図せず同じブランチを複数の場所で操作してしまう原因にもなるため、通常の手順としてはおすすめしません

未コミットの変更があると削除できない

worktree内に未コミットの変更や未追跡ファイルが残っている場合、git worktree removeは通常失敗します。
まずgit statusで状態を確認し、コミットする、git stashで退避する、不要な変更を破棄するのいずれかを行ってから、あらためて削除しましょう

.envや依存ライブラリは自動で共有されない

Gitで追跡されていないファイルは、新しく作成したworktreeには含まれません
node_modules.venvなどは、通常worktreeごとに用意する必要があります。

また、複数のworktreeで開発サーバーを同時に起動する場合は、使用ポートなど、ローカルの設定が重複していないかにも注意しましょう

メインworktreeはremoveで削除できない

最初にgit cloneまたはgit initを実行した場所は、メインworktreeとして扱われます。
メインworktreeはgit worktree removeの対象にはならず、削除できません。

サブモジュールを含むリポジトリには制限がある

サブモジュールとは、別のGitリポジトリを、自分のリポジトリの中にサブディレクトリとして組み込む仕組みのことです。
Git公式ドキュメントでは、サブモジュールを含むリポジトリを複数のworktreeでチェックアウトする際のサポートは、完全ではないと説明されています。
サブモジュールを使っているリポジトリでworktreeを利用する場合は、事前に公式ドキュメントで制限事項を確認しておきましょう

Git worktreeに関するよくある質問

Git worktreeとgit cloneの違いは何ですか?

git cloneは、リポジトリ全体を複製し、Gitの管理情報も含めて独立したコピーを作成します。
一方、Git worktreeは、コミット履歴などのGit管理情報を共有したまま、作業ディレクトリだけを追加する機能です。

同じブランチで複数のworktreeを作れますか?

原則として作成できません。
既にどこかのworktreeでチェックアウトされているブランチを指定すると、エラーになります。同時に作業したい場合は、別のブランチを用意してください。

worktreeを削除するとブランチも削除されますか?

削除されません。
worktreeとブランチは別々に管理されているため、ブランチも不要な場合は、worktreeの削除後にgit branch -dで個別に削除する必要があります。

git worktree removeとpruneの違いは何ですか?

前述のとおり、removeは実在するworktreeを削除するコマンド、pruneは手動削除などで残った古い管理情報を整理するコマンドです。通常の削除にはremoveを使い、pruneは必要になったときだけ実行すれば十分です。

worktreeを作成すると.envやnode_modulesもコピーされますか?

通常はコピーされません。Gitで追跡されていないファイルは、新しいworktreeには含まれないためです。
Claude Codeを使っている場合は、.worktreeincludeファイルを用意しておくことで、.envなどgitignore対象のファイルを自動的に引き継げます。

まとめ

この記事では、Git worktreeの仕組みから使い方、注意点までを解説しました。

  • Git worktreeは、複数の作業ディレクトリを1つのリポジトリへ関連付ける機能
  • ブランチを切り替えずに、複数の作業を並行できる
  • 作成元のブランチやコミットを明示すると、意図しないブランチ作成を防ぎやすい
  • 通常の削除にはgit worktree removeを使い、古い管理情報の整理にはpruneを使う
  • Claude CodeなどのAIエージェントを使った並列開発にも活用できる
  • 作業後は、コミット、統合、worktreeの削除まで行う

まずは、自分のリポジトリで現在の状態を確認するところから始めてみましょう。

Bash
git worktree list

参考資料

     

AI・機械学習カテゴリの最新記事