Git worktreeの使い方|基本コマンド・削除・移動と並行開発・GUI連携を解説
Git worktreeは、1つのリポジトリで複数のブランチをそれぞれ別のディレクトリに同時チェックアウトできるGitの標準機能です(Git 2.5以降で導入)。ブランチを切り替えるたびの git stash や再ビルドが不要になり、機能開発を中断せずに緊急のバグ修正やレビューを並行して進められます。この記事では、add・list・remove などの基本コマンドから、ワークツリーの削除・移動、SourceTreeやFork、VS Code拡張、worktree-plus(wtp)を使ったGUI・ツール連携まで、実際の運用で必要になる操作を一通り解説します。
まとめ:Git worktreeの要点
- Git worktreeは1つのリポジトリに複数の作業ディレクトリを持たせるGit標準機能(Git 2.5以降)。ブランチ切り替えのたびのstashや再ビルドが不要になる。
- 追加は
git worktree add <パス> <ブランチ>、一覧はgit worktree list、削除はgit worktree remove、消し残しの整理はgit worktree prune。 - 機能開発を止めずに緊急バグ修正、レビュー用チェックアウト、複数ブランチの並行ビルドなど、同時に複数ブランチを触る場面で効く。
- 各ワークツリーは履歴とオブジェクトを共有するが、同じブランチを2つのワークツリーで同時にチェックアウトすることはできない。
- SourceTreeやFork、VS Code拡張、worktree-plus(wtp)などを併用すると、GUI・CLIから扱いやすくなる。
以下では、基本概念から基本コマンドの使い方、削除・移動の操作、並行開発の運用パターン、GUI・ツール連携までを順に解説します。
Git worktreeとは何か?その概要とメリットを初心者向けにわかりやすく丁寧に徹底解説
Git worktreeはGitの機能の一つで、1つのリポジトリに複数の作業ディレクトリ(ワークツリー)を持てるようにするものです。これにより、複数のブランチを同時に扱うことが可能になり、従来のブランチ切り替え作業による手間や制約を大幅に減らすことができます。Git worktreeを活用すると、例えばあるブランチでの開発作業を中断せずに、別のブランチでの並行作業やバグ修正ができるようになります。そのため、開発の効率化やミスの防止に大きく貢献するメリットがあります。まずはGit worktreeの基本概要と、その利点について詳しく見ていきましょう。
Git worktreeの概要とは?1つのリポジトリで複数の作業ディレクトリを扱える機能を解説
Git worktreeは、単一のGitリポジトリ内で複数のワークツリー(作業コピー)を扱えるようにする機能です。通常Gitでは1つのリポジトリにつき作業ディレクトリは1つですが、worktree機能を使うことで同じリポジトリから別のディレクトリに別のブランチを同時にチェックアウトすることが可能になります。Git 2.5以降で正式に導入されたこの機能により、開発者は複数のブランチを同時に作業できるようになりました。新しく追加された作業ディレクトリは「リンクされたワークツリー(linked worktree)」と呼ばれ、従来のメインの作業ディレクトリ(最初にリポジトリをクローンまたはinitした際にできるディレクトリ)は「メインワークツリー」と位置付けられます。それぞれのワークツリーはGit内部では同じリポジトリに紐づいており、履歴やオブジェクトは共有されていますが、作業中のブランチや作業ツリー(ワーキングツリー)の内容は独立して扱われます。
複数のワークツリーを用いた並行作業のイメージ:同時に複数ブランチを操作する概念をわかりやすく解説します
複数のワークツリーを使うと、開発者はまるで2つ以上のリポジトリを同時に扱っているかのように並行作業ができます。ただし実際にはリポジトリは1つであり、その中で複数のブランチを別々の作業フォルダにチェックアウトしているイメージです。例えば、mainブランチのコードベースを開いたまま、別のフォルダでfeature-xブランチを新しいワークツリーとしてチェックアウトすれば、二つのフォルダそれぞれで異なるブランチのコードを同時に閲覧・編集できます。IDEやエディタを2つ立ち上げて、それぞれのワークツリーのディレクトリを開けば、2つのブランチを同時進行でコーディングすることも可能です。このように、Git worktreeを活用すると1つのプロジェクト内で並行開発ができ、その操作感は複数のリポジトリを扱う場合とほとんど変わりません。
Git worktreeがもたらす主なメリット:ブランチ切り替えの短縮と作業効率化による開発スピード向上
Git worktreeを使う最大のメリットの一つは、ブランチ切り替えに伴う時間的ロスを大幅に削減できることです。従来はあるブランチで作業中に別ブランチに移る際、変更をstashしたり中途コミットしたり、一度開発環境を閉じたりする必要がありました。Worktreeを用いれば、別のワークツリー上で他のブランチを開くだけで良いため、現在の作業状態を中断する必要がありません。これによってコンテキストスイッチの負担が軽減され、ブランチ間の行き来が格段にスムーズになります。また、ビルドが必要なプロジェクトでも、ブランチを切り替えるたびに再コンパイルを待つといった無駄がなく、作業効率が向上します。それぞれのブランチを並行して進められるため、結果的に開発全体のスピードアップに繋がります。
リポジトリ複製やStash運用との比較:Git worktree使用時の利点を詳しく解説します
Git worktreeを使わない場合、開発者は複数ブランチの作業をするために二重にリポジトリをクローンしたり、あるいはstashで変更を退避しつつブランチを切り替えるといった方法を取っていました。リポジトリを複製する方法では、同じ履歴を持つフォルダが増えるためディスク容量を余計に消費し、複数のコピーに対してそれぞれgit pullで最新化する手間も発生します。これに対し、worktreeであればオブジェクトデータ(コミット履歴やファイル内容)は1つのリポジトリで共通化されるため重複なく効率的です。またstash運用では、ブランチを切り替えるたびに変更を一時保存・復元する必要があり、場合によってはstashのし忘れや適用ミスによるトラブルも起こりえます。Worktreeを使えばstashに頼る必要がなくなるため、こうしたリスクも減らせます。このように、Git worktreeは従来の複製・stashベースのワークフローに比べて、手間とリソースの両面でメリットが大きいと言えます。
Git worktreeが適するケース:並行開発やコードレビューなどで効果を発揮するシーンを紹介します
では、具体的にどのような場面でGit worktreeが役立つのでしょうか。典型的なのは並行開発のシーンです。複数の新機能を同時に開発したり、開発中のブランチとは別に緊急のバグ修正ブランチを素早く用意したりする場合、worktreeを使えば作業の切り替えがシームレスになります。また、他の開発者のブランチや過去のリリース用ブランチをチェックアウトしてコードレビューや動作検証を行う場面でも、既存の作業環境を崩さずに別ディレクトリで検証できるため効率的です。さらに、長期間かかるリファクタリングのブランチを分けて進めつつ、並行して通常の開発を継続するようなケースでも、それぞれの作業を独立したワークツリーで管理することでミスを防ぎやすくなります。このように、Git worktreeは複数のブランチを横断して作業する必要がある様々なケースで効果を発揮します。
Git worktreeで解決できる課題とは?複数ブランチ管理で生じる悩みを一挙に解決する方法を詳しく解説
前章でGit worktreeの概要とメリットを説明しましたが、この機能がどんな課題を解決するために生まれたのかを具体的に整理してみましょう。複数のブランチを扱う開発現場では、従来さまざまな悩みや非効率が存在していました。Git worktreeはそうした課題に対するソリューションとして導入された経緯があり、以下に挙げるような問題を一挙に解決してくれます。
1つの作業ツリーで複数ブランチを扱うときの問題点とその限界を解説
まず、Git worktreeがない環境では1つのワークツリー(作業コピー)で全てのブランチを切り替えながら作業する必要がありました。当然ですが、同時に2つのブランチをチェックアウトすることは通常できないため、並行作業をしたくても物理的に不可能です。開発者はあるブランチの作業を中断して別のブランチに切り替え、その後また元のブランチに戻る、といった手順を繰り返すことになります。この過程で、進行中の作業を退避させたり、頭の中で作業コンテキストを切り替えたりする負担が生じます。一度に1ブランチしか扱えないという制約は、開発スピードや柔軟性において大きな限界となっていました。
ブランチ切り替えのたびにコンテキストがリセットされる不便さが作業効率に与える影響
従来のブランチ運用では、ブランチを切り替えるたびに作業中のコンテキストがリセットされるという大きな不便がありました。例えば、ある機能Aのブランチで編集中だったファイルや開いていたディバッグセッションは、別ブランチBに切り替えた瞬間に一旦すべて閉じたり停止したりする必要があります。そしてブランチBでの作業を終えて再びAに戻るときには、またファイルを開き直し、作業途中の地点を思い出して復帰しなければなりません。このようなコンテキストスイッチには時間と集中力が奪われ、生産性を低下させる要因となっていました。特にビルドが必要なプロジェクトでは、ブランチ変更後に再ビルドや環境準備を毎回行う必要があり、その待ち時間も積み重なると無視できないロスになります。
複数リポジトリをクローンする場合のデメリット:ディスク容量増大や同期の手間の発生
一方、同じプロジェクトのリポジトリを別フォルダに複製して複数用意するという対応策も考えられますが、これには別のデメリットがあります。まず、リポジトリを複数クローンすれば、その分だけGitの履歴データやソースコードが重複するため、ディスク容量を余計に消費します。大規模なリポジトリであればあるほど、その負担は大きくなります。また、同じプロジェクトの複数コピーを扱う場合、それぞれのコピーでgit pullやgit fetchを行って最新状態を維持する同期の手間が発生します。あるコピーで行ったコミットを他方に反映するためにリモート経由でプッシュ・プルする必要があり、場合によってはコピー間でバージョンがずれて混乱する恐れもあります。複数クローン方式は簡単ですが、効率や管理面で課題が多い方法と言えます。
stashやWIPコミット多用の弊害:一時退避に頼る開発フローの限界とリスク
複数ブランチを1フォルダで切り替える開発者の中には、stash(一時保存)を多用することで何とかやりくりしていた人もいるでしょう。または「WIP」といった一時的なコミットを切ってブランチを移動するケースもあります。しかし、これらの方法には根本的な限界とリスクがあります。stashを頻繁に使うと、適用し忘れや競合によるトラブルが起きたり、stashリストに何層も変更を溜め込んで管理が煩雑になったりします。一時的なコミットで対応する方法も、不要な履歴が残ってしまい後でリポジトリをクリーンアップする手間が増えます。そもそも開発途中の作業を強制的に中断・退避しなければならない時点で効率が悪く、こうした手段に頼る開発フローには明確な非効率さが存在していました。
緊急バグ修正時に作業を中断・退避する際の煩雑さとミスの可能性について
特に深刻なのが、緊急のバグ修正が発生した場合です。開発者がある機能ブランチで作業の真っ最中に「本番障害を直さなければいけない」となったら、いったん今の作業を中断してリリース用ブランチやmainブランチに切り替える必要があります。このとき、未コミットの変更をstashしたり、作業途中でもやむなくコミットしたりといった処置が必要となり、その手順は非常に煩雑です。慌てている状況ではstashし忘れて変更を失う、あるいは一時コミットをそのまま誤ってプッシュしてしまう、といったミスの可能性も高まります。また、緊急対応後に元の作業に戻る際も、どこまで進めていたか文脈を思い出す手間が発生します。このように、緊急対応を挟むと従来の開発フローでは多大なロスとリスクが伴っていました。
別ブランチのコード参照やレビューのために複数ディレクトリが必要になるケースと従来の対処法
開発では、実装を比較検討するために他のブランチのコードを参照したいケースもよくあります。レビュー作業では、メインブランチのコードと比較しながらPRブランチの変更を確認するような場面もあるでしょう。しかし、Git worktreeがない場合、別ブランチのコードを見るには現在のブランチを切り替えるか、リポジトリをもう一つクローンしてそちらで開く必要がありました。前者ではいちいち作業中のブランチを離れることになり、後者では前述の通りディスクや同期の負担がかかります。そのため、開発者はWeb上のリポジトリ閲覧機能や外部の差分ツールを使って対応するなど、直接手元でコードを比較しづらい状況もありました。こうした点でも、従来の方法には不便さが残っていました。
Git worktreeを使う前に知っておきたい前提条件と事前準備:導入前の確認ポイントを詳しく解説
Git worktreeを本格的に活用する前に、いくつか確認しておきたい前提条件や準備事項があります。ツールを使い始める際には環境や知識の面で満たすべき条件があるため、事前にチェックしておきましょう。ここでは、Git worktreeを導入・使用するにあたっての必要な要件や準備ポイントを解説します。
Git worktreeが利用可能なGitバージョン:対応バージョンの確認とアップデート
まず第一に、Gitのバージョンが十分新しいことを確認しましょう。Git worktree機能はGit 2.5以降でサポートされています。したがって、お使いのGitが2.5未満の古いバージョンの場合、この機能は利用できません。現在のバージョンはgit --versionコマンドで確認できます。一般的には、Git worktreeを安定して使うためにはGit 2.5以上(可能であれば最新の安定版)へのアップデートが推奨されます。Gitのアップデート方法はOSによって異なりますが、例えばHomebrewを利用している場合はbrew upgrade git、Linuxではパッケージマネージャや公式サイトのインストーラを利用するなどして最新版を入手してください。バージョンを最新化することで、worktree関連の不具合修正や新機能にも対応できます。
事前準備①:現在のリポジトリ状態をクリーンに保ち安全に作業を始めるためのポイント
次に、Git worktreeを追加する前に現在のリポジトリの状態をクリーンに保つことが大切です。具体的には、作業中のブランチに未コミットの変更が残っていないか確認しましょう。可能であれば、今開いているブランチの変更は一度コミットするか、不要ならstashしてワークツリー外に退避させておくのが安全です。これは、後述するように同じブランチを複数のワークツリーでチェックアウトすることはできない制約があるため、ブランチを切り替えたり新規ワークツリーを作成する際に未コミットの変更があると作業がややこしくなる可能性があるからです。また、新しくブランチを切ってワークツリーを作成する場合にも、元になるブランチ(例えばmain)の状態が最新でクリーンであることが望ましいです。事前にgit pullでリモートの最新変更を取り込んでおく、テストが通る状態にしておく、など安全に作業を始められる状態に整えてからworktreeを追加しましょう。
事前準備②:新規ワークツリーの作成場所とディレクトリ名を事前に決めておく
Git worktreeを追加する際には、新しいワークツリー用にディレクトリのパスを指定する必要があります。そのため、どの場所にワークツリーを作成し、ディレクトリ名を何にするかを事前に考えておくとスムーズです。例えば、リポジトリの親ディレクトリ直下にブランチ名を冠したフォルダを作るケースが一般的です(git worktree add ../feature-x feature-x のように実行すると、一つ上の階層にfeature-xというフォルダが作成されます)。あるいは、プロジェクト用にworktreesというディレクトリを作り、その中に各ブランチ用のサブディレクトリを作成する方法もあります。重要なのは、フォルダ名からどのブランチの作業フォルダか分かるようにすることです。ブランチ名をそのままディレクトリ名に使えば分かりやすいでしょう。事前に自分なりの命名規則・配置場所を決めておくことで、複数のワークツリーを扱う際にも混乱を防ぎやすくなります。
事前準備③:ブランチ構成と運用ルールの整理(同時に扱うブランチの計画)
さらに、ワークツリーで同時に扱うブランチの構成についてあらかじめ整理しておくことも有用です。どのブランチを並行して開く必要があるのか、予め計画を立てておくと良いでしょう。例えば、「メイン開発用のブランチ」「緊急バグ修正用のブランチ」「コードレビュー用の一時ブランチ」など、自分が同時並行で作業したいブランチを洗い出しておきます。あまりに多くのブランチを一度に開きすぎると管理が煩雑になるため、常時開いておくブランチは必要最低限に絞るのがおすすめです。また、チーム開発の場合は、誰がどのブランチを担当し、それをworktreeで運用するかといったルールや情報共有も重要です。事前にブランチ運用の方針を決めておけば、ワークツリー利用時にもスムーズに共同作業が進められるでしょう。
前提知識:GitのブランチとHEADの仕組みを理解しておく重要性
Git worktreeを使いこなすには、GitのブランチとHEADに関する基本概念を理解しておくことも重要です。worktreeでは1つのリポジトリ内で複数のHEAD(各ワークツリーごとの参照先)が存在することになります。そのため、「HEADとは何か」「ブランチとは具体的に何を指しているのか」といったGitの基礎を押さえておく必要があります。具体的には、HEADが現在チェックアウトしているコミットを指す参照であること、ブランチは可動するポインタであり各コミット系列を指していること、などの知識です。これらを理解していれば、複数のワークツリーで異なるHEADやブランチを並行して扱う状況にも混乱しにくくなります。逆に基礎知識があいまいだと、複数ワークツリー運用で「今どのブランチがどこにチェックアウトされているのか」把握しづらくなるため、事前に基本をおさらいしておきましょう。
Git worktreeの基本コマンド(add / list / remove)と使い方を徹底解説
ここからは、Git worktree機能を実際に使うための基本的なコマンドについて解説します。Gitではgit worktreeというコマンド群が用意されており、サブコマンドとして新規ワークツリーを追加するadd、現在のワークツリー一覧を確認するlist、不要になったワークツリーを削除するremoveなどがあります。順を追って、これら主要コマンドの使い方と挙動を見ていきましょう。併せて、補助的なpruneやmoveといったコマンドについても紹介します。
git worktree addコマンド:新しいワークツリーを追加しブランチをチェックアウトする方法
ワークツリーを新規追加するコマンドがgit worktree addです。このコマンドで指定したパスに、新しい作業ディレクトリが作成され、指定したブランチ(またはコミット)がそのディレクトリにチェックアウトされます。基本的な使用方法は以下の通りです。
git worktree add <新しいワークツリーのパス> <チェックアウトするブランチ名またはコミット>
例えば、現在のリポジトリの親ディレクトリにfeature-xというフォルダを作り、新規ブランチfeature-xを作成してチェックアウトする場合は次のように実行します:
git worktree add ../feature-x -b feature-x
上記の-bオプションは「新しいブランチを作成する」指定で、この例では現在のHEADを元にfeature-xブランチを作った上で、それを../feature-xディレクトリにチェックアウトしています。既存のブランチを別フォルダにチェックアウトしたい場合は、-bオプションなしでブランチ名を指定します(例:git worktree add ../release-1.x release-1.x)。コマンド実行後、指定フォルダにそのブランチのワーキングツリーが展開され、独立した作業環境として利用できます。
注意: 既に他のワークツリーでチェックアウトされているブランチをgit worktree addで再び追加しようとするとエラーになります(同一ブランチの重複チェックアウトはできません)。その場合は別名のブランチを作るか、--detachオプションでHEADを切り離してチェックアウトする方法があります。
git worktree listコマンド:既存のワークツリー一覧を表示して状態を確認する方法
git worktree listコマンドを使うと、現在存在するワークツリーの一覧を確認できます。このコマンドを実行すると、各ワークツリーのパスとそのHEADが指しているブランチ名やコミットIDが表示されます。例えば、メインのワークツリーとfeature-xブランチ用に追加したワークツリーがある場合、git worktree listの出力は次のようになります(例):
/path/to/repo [main] /path/to/feature-x abc1234 [feature-x]
上記の例では、最初の行が元々のリポジトリ(メインワークツリー)で現在mainブランチをチェックアウトしていることを示しています。2行目は/path/to/feature-xというディレクトリにfeature-xブランチがチェックアウトされており、そのHEADがコミットabc1234を指していることを表しています(コミットIDの一部が表示されます)。-vオプション(verbose)を付けるともう少し詳細な情報が表示され、各ワークツリーのブランチやHEADのフルSHA1、ロック状態なども確認できます。git worktree listは、複数のワークツリーを運用している際にどのブランチがどのディレクトリにあるかを把握するのに便利なコマンドです。定期的にこの一覧をチェックし、不要なワークツリーが残っていないか確認することもできます。
git worktree removeコマンド:不要になったワークツリーを削除してリポジトリを整理する方法
git worktree removeコマンドは、不要になったワークツリーを削除するためのコマンドです。例えば、作業が完了したブランチ用のワークツリーを片付けたい場合に使用します。使い方はシンプルで、削除したいワークツリーのパスを指定して実行します(例:git worktree remove ../feature-x)。これにより、指定した作業ディレクトリがファイルシステム上から削除され、同時にGitの管理下からもそのワークツリーが取り除かれます。
注意: git worktree removeは、削除対象のワークツリーに未コミットの変更やマージされていないコミットが残っている場合、安全のため削除を拒否します。そのような場合には、変更をコミットするか別の場所に待避させてから再度実行してください(強制的に削除したい場合は-fオプションを付けますが、作業内容が失われないよう注意が必要です)。ワークツリーを削除しても、対応するブランチ自体(例えばfeature-xブランチ)はリポジトリに残りますので、ブランチを完全に消したい場合は別途git branch -d等でブランチ削除を行う必要があります。git worktree removeはあくまで作業ディレクトリの片付けコマンドであり、これを適切に使って不要なワークツリーを整理することで、リポジトリ環境をすっきり保つことができます。
git worktree pruneコマンド:削除済みワークツリーの残存情報をクリーンアップする方法
git worktree pruneコマンドは、Gitリポジトリ内に残っている不要なワークツリーの参照情報をクリーンアップするためのものです。通常、git worktree removeを使ってワークツリーを削除すれば内部情報も同時に整理されますが、何らかの理由でワークツリーのディレクトリを手動で削除してしまった場合などは、Gitの管理情報(.git/worktrees/ディレクトリ内の記録)が孤立して残ってしまいます。git worktree pruneを実行すると、そうした存在しないワークツリーへの参照がリポジトリから取り除かれます。
デフォルトでは、Gitのガベージコレクション(git gc)によって一定期間経過後に自動でこの整理が行われる設定になっていますが、明示的に整理したいときにはgit worktree pruneを使うと即座にクリーンアップできます。例えば、既に削除したはずのワークツリーがgit worktree listに表示されているような場合に、このコマンドを実行すると一覧から取り除かれます。-n(–dry-run)オプションを付ければ削除される対象の情報を表示するだけで実際の削除は行わないため、安全に確認してからクリーンアップすることも可能です。
その他の便利なサブコマンド:git worktree move/lock/unlockの用途と使い方を紹介
上記の主要コマンド以外にも、Git worktreeにはいくつか補助的なサブコマンドが用意されています。代表的なものを簡単に紹介します。
git worktree move <現在のパス> <新しいパス>: 既存のワークツリーのディレクトリを移動するコマンドです。ワークツリーを配置するディレクトリ構成を変更したい場合に、このコマンドでGit管理上のパスを更新しつつ物理的なフォルダ移動を行えます。手動でフォルダを動かすとGitがパスを認識できなくなるため、移動する際はmoveコマンドを使うのが安全です。git worktree lock <ワークツリーのパス>: 指定したワークツリーを「ロック」します。ロックされたワークツリーは、先述のpruneによる自動クリーンアップの対象外となります。例えばUSBメモリ上やネットワークドライブ上にワークツリーを作成して一時的に使うような場合、デバイスを外している間に勝手に参照が削除されないようロックしておく、といった用途があります。--reasonオプションでロックした理由をメモとして残すこともできます。git worktree unlock <ワークツリーのパス>:lockしたワークツリーのロックを解除します。ロック解除後は通常通りpruneの対象にも戻ります。
これらのコマンドは日常的に頻繁に使うものではありませんが、特定の状況下で役立つツールです。必要に応じて使い方を覚えておくと、より柔軟にworktree機能を活用できるでしょう。
Git worktreeの代表的なユースケース:並列開発や緊急バグ修正などへの活用法を詳しく紹介
続いて、Git worktreeが実際にどのようなシーンで役立つのか、具体的なユースケースを見てみましょう。並列開発や緊急対応など、現場でありがちな状況におけるworktree活用法を紹介します。自身の開発フローに当てはめながら読むことで、worktreeの効果的な使い方がよりイメージしやすくなるでしょう。
ユースケース①:複数の機能ブランチを同時に開発(並行開発による効率化)
あるプロジェクトで複数の新機能開発が重なっている状況を考えてみましょう。ユースケース①は複数の機能ブランチを同時並行で開発するケースです。例えば、開発者Aさんがfeature/loginブランチでログイン機能を実装している途中で、feature/paymentブランチでの決済機能にも着手する必要が出てきたとします。従来であれば、まずログイン機能の作業を一旦片付けるか中断し、ブランチを切り替えて決済機能に取り掛からざるを得ません。しかしGit worktreeを使えば、feature/login用とfeature/payment用にそれぞれ別々のワークツリーを用意し、二つのブランチを同時に開発することが可能です。
この方法なら、ログイン機能でコードを書きながら「決済機能側では既存コードをどう利用できるか?」と思ったときに、すぐ隣のエディタ(別ワークツリー)で決済ブランチのコードを確認できます。逆に決済側で作業中にログイン機能の実装を参照したくなっても、両方のコードを開いた状態で行き来できるので非常に効率的です。並行開発においてworktreeを活用することで、一つのブランチの進捗待ち時間に他の作業を進める、といった柔軟な働き方が実現できます。
ユースケース②:リリース緊急バグ修正と新機能開発を並行して進める(作業中断なしで対応)
ユースケース②は、緊急のバグ修正と新機能開発を並行して行うケースです。現場ではよく、「開発中に本番の不具合対応が飛び込んでくる」ことがあります。この場合、Git worktreeがないと開発中の作業を一旦中断してmainやリリースブランチに切り替え、修正を行った後に元のブランチに戻る、という流れになります。前述したように、これでは大きなタイムロスとミスのリスクが伴います。
しかしworktreeを使っていれば、例えば新機能の実装を進めているfeature/new-uiブランチはそのままに、新たなワークツリーでmainブランチ(もしくはリリース用ブランチ)をチェックアウトしてバグ修正に取り掛かることができます。修正が完了したらそのワークツリーからコミット・プッシュし、すぐに本番リリース対応を完了できます。その間、元のfeature/new-uiの作業フォルダは手付かずなので、緊急対応後にエディタを切り替えるだけですぐ開発作業に復帰できます。作業の中断や再設定が不要になるため、緊急対応時のストレスとミスの可能性が大幅に軽減されます。
ユースケース③:コードレビューやPull Request確認のため別ワークツリーでブランチを検証
ユースケース③は、コードレビューやPull Requestの検証を行うケースです。他の開発者が作成した機能ブランチを手元でチェックアウトして動作確認したい場合、worktreeが非常に有用です。通常なら自分の作業途中のブランチを切り替えるか、リポジトリを別途クローンして確認用に用意する必要がありますが、worktreeならそうした手間はいりません。
例えば、同僚から送られてきたプルリクエストのブランチfeature/refactor-apiを検証したい場合、次のように新しいワークツリーを追加します:
git worktree add ../review-refactor feature/refactor-api
これで../review-refactorディレクトリにそのブランチの作業コピーができるので、自分の環境でコードをビルドしたりテストを実行したりできます。レビュー対象のブランチを別フォルダで開き、メインの開発作業フォルダと並べて比較検討することも容易です。レビューが終わればそのワークツリーを削除するだけで元の環境に影響は残りません。Git worktreeを使うことで、レビュー作業と自分の開発作業を完全に独立した環境で行えるため、非常に効率的かつ安全です。
ユースケース④:過去バージョンの保守と最新開発を1つのリポジトリで並行管理
ユースケース④は、過去バージョンの保守と最新開発を並行して進めるケースです。プロダクトによっては、リリース済みの旧バージョン(例:v1.x系)を保守・アップデートしながら、新バージョン(v2.0開発)も同時進行で進めなければならないことがあります。このような状況でもGit worktreeが役立ちます。
例えば、リポジトリ内にrelease-1.xというブランチで旧バージョンのコードを管理しつつ、mainブランチでは次期バージョンの開発を行っているとします。worktreeを使えば、release-1.xブランチ用のワークツリーを別途用意して旧版の保守作業を進めつつ、mainブランチの作業フォルダでは新機能開発を続けることができます。旧バージョン向けのバグフィックスやパッチをその専用ワークツリー上で行いテストしながら、新版のコーディング環境は別に維持できるため、両者の作業を行ったり来たりする負担が大幅に減ります。一つのリポジトリで複数バージョンを並行管理する際にも、worktreeによって効率的に対応できるのです。
ユースケース⑤:大規模リファクタリング用のブランチと通常開発を両立(長期作業と短期作業の共存)
ユースケース⑤は、大規模リファクタリングと通常開発の両立です。長期間かかる大掛かりなリファクタリング作業を進めつつ、日常的な小規模開発やバグ修正も止められない、といったケースがこれに該当します。例えば、コードベース全体に影響するアーキテクチャの見直しをrefactor/architectureブランチで進めている一方で、通常の機能追加や改善はmainブランチ上で平行して行いたい場合です。
Git worktreeを使えば、refactor/architectureブランチ専用のワークツリーを作成し、そこで腰を据えてリファクタリング作業を進められます。同時に別のワークツリーではmainブランチを開いておき、日々発生する小さなタスクや緊急の修正に対応できます。リファクタリングブランチは大きな変更で一時的にビルドが壊れていても、その影響は別フォルダ内に留まるため、通常開発用のブランチには波及しません。逆に、通常開発のコミットをリファクタリングブランチにマージしたいときも、両方のブランチが手元にあるので容易にマージや比較が可能です。長期作業ブランチと短期作業ブランチの共存も、worktreeによってストレスなく実現できます。
ワークツリーの仕組みとディレクトリ構成:Git内部ではどのように管理されているのかを詳しく徹底解説
ここでは、Git worktree機能の内部的な仕組みやディレクトリ構成について解説します。複数のワークツリーを扱う際、Gitはリポジトリ内部でどのようにそれらを管理しているのでしょうか。内部構造を理解しておくと、worktreeの動作原理が明確になり、トラブルシューティングや高度な利用の際にも役立ちます。
ワークツリーの管理構造:メインリポジトリの.gitディレクトリとworktreesフォルダによる管理
Gitのリポジトリ(非ベア)の場合、.gitディレクトリの中でワークツリーの情報が管理されています。具体的には、.git/worktrees/というディレクトリが作成され、その下に各リンクされたワークツリーに対応するサブディレクトリが配置されます。例えば、feature-xというワークツリーを追加した場合、.git/worktrees/feature-x/ のようなフォルダができます(※実際のフォルダ名はワークツリーのパスから一意に決まる別名となる場合もあります)。このフォルダ内には、そのワークツリー固有のHEADやブランチ参照に関する情報ファイルが格納されます。
一方、コミット履歴やオブジェクト(Gitオブジェクト:ブロブやツリー、コミット)といったデータは、メインの.gitディレクトリ直下(objectsフォルダ等)に一元管理されています。つまり、複数のワークツリー間で履歴データは共有されており、worktreesフォルダ下には各ワークツリーの参照情報(何をチェックアウトしているか等)が保持されるイメージです。メインリポジトリの.gitがハブとなり、その中のworktreesフォルダ経由でリンクされたワークツリーたちを管理している構造と言えます。
追加ワークツリーの各ディレクトリに配置される.gitファイルの役割と内容
リンクされたワークツリー側(実際に作業する各ディレクトリ)には、通常のクローンとは異なり.gitディレクトリがまるごと存在するわけではありません。その代わりに、各ワークツリーディレクトリには特殊な.gitファイルが配置されます。このファイルの中身を開くと、例えば以下のようになっています:
gitdir: /path/to/main-project/.git/worktrees/feature-x
この記述が示す通り、そのワークツリーでのGit操作は、メインプロジェクトの.git/worktrees/feature-x配下にあるGit管理情報を参照するようになっています。簡単に言えば、リンクされたワークツリーの.gitファイルは「本当のGit管理ディレクトリは別の場所にあるよ」というポインタの役割を果たしています。これにより、各ワークツリーは自分専用の.gitディレクトリを持たずに済み、メインリポジトリと密接に連携した状態で動作します。開発者は普段通り各ワークツリーのフォルダ内でgit statusやgit commit等のコマンドを使えますが、裏ではこの.gitファイルが示す先(メインリポジトリ内)にGitの内部処理が委ねられているのです。
共有されるGitオブジェクト:すべてのワークツリー間で履歴データを共通利用
前述の構造から分かるように、複数のワークツリーは一つのリポジトリのオブジェクトデータを共有しています。すべてのコミット履歴やバージョン管理対象のファイル(Gitオブジェクト)は、メインの.gitディレクトリ内に格納され、一元管理されています。したがって、あるワークツリーで新たにコミットを作成すれば、そのコミットは即座に他のワークツリーの履歴にも共有されます(同じリポジトリですから当然です)。これは、複数クローン方式と比べて大きな利点です。オブジェクトが共通化されることで、重複した履歴やオブジェクトを持たずに済み、ディスク容量の節約にもなります。
例えば100MBのライブラリを含むリポジトリを2つクローンすると200MB使いますが、worktreeで2つのワークツリーを作っても実体は一つなので100MB+αで済むイメージです(実際にはワークツリーごとにワーキングツリーのファイルコピーは存在するため、ソースの作業コピー分は増えますが、履歴データは1セットです)。このように、Git worktreeでは内部でオブジェクトデータを共有することで、効率的に複数ブランチの作業環境を提供しています。
各ワークツリーごとのHEADとブランチ管理:それぞれ独立した参照を保持
複数ワークツリー環境では、各ワークツリーがそれぞれ独立したHEADを持っています。メインワークツリーは例えばmainブランチのHEADを指している一方、リンクされたワークツリーはfeature-xブランチのHEADを指している、といった具合に、別々のブランチを同時にチェックアウトできるのはこのためです。それぞれのワークツリーには独自のHEADファイル(現在のコミット参照)とindex(ステージングエリア)が割り当てられており、一方のワークツリーで行った変更やステージング作業が、他方のワークツリーに干渉することはありません。
例えば、リンクされたワークツリー上でfeature-xブランチにコミットを追加すれば、そのブランチの最新コミットが進みますが、同時にメインワークツリーで開いているmainブランチには何の影響もありません(mainブランチの履歴は変わらず、ワークツリーの内容もそのまま)。もちろん、git logなどで見る履歴データ自体は共有されていますから、あるワークツリーでのコミットはリポジトリ全体の履歴に反映され、他のワークツリーからも参照可能です。ただ、作業中のブランチやHEADの位置は各ワークツリーごとに独立しているため、同時に別ブランチの最新状態を保てるわけです。この仕組みにより、一つのリポジトリ内で複数のHEADが並立して存在できるようになっています。
同一ブランチの重複チェックアウトを防ぐ仕組み:一度に1ブランチのみ使用の制約
Git worktreeでは、同じブランチを同時に複数のワークツリーでチェックアウトすることはできません。これは内部的な仕組みとしてGitが安全のために課している制約です。具体的には、あるブランチが既にあるワークツリーのHEADとしてチェックアウトされている場合、別のワークツリーで同じブランチをgit worktree addしようとするとエラーが発生します。Gitはワークツリー管理情報の中で「どのブランチがどのワークツリーで使用中か」を記録しており、重複を防いでいます。
この制約により、例えば同じfeature-xブランチを2箇所で変更してコミット履歴が食い違ってしまう、といった矛盾状態が発生しないようになっています。通常、一つのブランチ上の作業は一箇所で行う前提になるため、worktreeでもそれを守る設計です。ただし、「同じブランチを別フォルダにコピーしてビルドだけ別途したい」などのニーズがある場合には、--detachオプションでHEADを切り離してチェックアウトする(ブランチ名ではなく特定のコミットとしてチェックアウトする)という回避策もあります。この場合、2つ目のワークツリーはブランチに紐付かない独立HEADとなるため、元ブランチへの影響なく内容を参照できます(変更してコミットしてもそれは分岐した別ブランチ扱いになります)。いずれにせよ、Git worktreeの仕組み上、1つのブランチは一度に1つのワークツリーで使用することが原則となっている点を覚えておきましょう。
Git worktreeを用いた実践的な運用パターン:複数ブランチを同時に扱うテクニックを詳しく解説
ここでは、Git worktreeを実際の開発フローに組み込むにあたっての実践的な運用パターンやコツを解説します。複数のワークツリーを扱う上でのベストプラクティスや、スムーズに運用するためのテクニックを確認しておきましょう。
複数ワークツリー運用の基本パターン:ブランチごとに作業フォルダを分けて管理
まず、複数ワークツリーを運用する際の基本方針として、ブランチごとに専用の作業フォルダ(ワークツリー)を用意することが挙げられます。従来は一つのフォルダで複数ブランチを切り替えていましたが、worktreeを活用する場合、例えば「メイン開発ブランチ用フォルダ」「機能Aブランチ用フォルダ」「機能Bブランチ用フォルダ」といった具合に、主要なブランチそれぞれに対応するディレクトリを作成します。こうすることで、ブランチを行き来する際に毎回チェックアウトし直す必要がなくなり、常に各ブランチの最新状態が各フォルダに保たれている形で作業できます。
運用イメージとしては、メインのクローンフォルダ(メインワークツリー)はmainブランチ専用とし、新たな開発トピックが生じるごとにgit worktree addで専用フォルダを増やす、という形です。そして作業が完了したブランチのワークツリーはgit worktree removeで片付け、常に必要なブランチのワークツリーだけを手元に残すようにします。ブランチ単位でディレクトリを分離するこの運用パターンが、worktreeのメリットを最大限享受できる基本の形となります。
複数ブランチ間の変更取り込みを円滑にする方法:マージやリベース操作のポイント
複数ワークツリーを使っていると、別ブランチ間で変更を取り込む(マージやリベースする)操作も容易になります。同一リポジトリ内で複数ブランチが同時に存在しているため、あるブランチでの変更を別のブランチに反映させたい場合に、ローカルで直接マージやリベースが可能です。
例えば、feature-Aブランチ(ワークツリーA)で修正した内容をmainブランチ(ワークツリーB)に取り込みたいとします。この場合、ワークツリーBのディレクトリでgit merge feature-Aと実行すれば、feature-A側の最新コミットをすぐにマージできます。両ブランチのデータはローカルに揃っているので、リモートにプッシュしてから別フォルダでプルするといった手順は不要です。同様に、リベース操作も簡単で、feature-Aのワークツリー上でgit rebase mainと実行すれば、最新のmainブランチ上に自分のコミットを乗せ換えることができます(mainブランチが手元に最新である前提)。複数ワークツリーを併用すると、こうしたブランチ間の統合作業を行う際にも両方のブランチを並行して開いて状況を確認しながら進められるため、コンフリクトの解消なども落ち着いて行えます。
ワークツリーの命名規則とディレクトリ整理:作業フォルダを混同しないベストプラクティス
複数のワークツリーを扱う際に大事なのが、各ワークツリーの命名規則やディレクトリ構成を明確にしておくことです。前述したように、ワークツリー用のフォルダ名は基本的にブランチ名を付けると分かりやすく混同が起きにくくなります。例えば、feature/login-uiブランチ用のワークツリーはフォルダ名もfeature-login-uiとする、といった具合です。フォルダ名にブランチ名がそのまま入っていれば、一目でどの作業フォルダか判別できます。
また、ディレクトリの配置も統一しておくとよいでしょう。プロジェクト直下にworktrees用ディレクトリを作りその配下にすべて置く、あるいはリポジトリの親ディレクトリにブランチごとのフォルダを作る、といった方法がありますが、いずれにせよ自分やチーム内でルールを決めて統一しておくことが重要です。さらに、ターミナルで作業する際にはプロンプトにカレントディレクトリ名やGitブランチ名が表示されるよう設定しておくと、今どのワークツリーにいるのかが把握しやすくなります(例えばbash/git-promptやZshテーマでブランチ名表示を有効にするなど)。こうしたベストプラクティスを取り入れることで、複数ワークツリーを扱っていても作業フォルダを取り違えるミスを防ぎ、効率的に運用できます。
長期ブランチ用ワークツリーと短期作業ワークツリーの使い分け戦略
運用上、長期間存在させるワークツリーと一時的な目的のワークツリーを区別して使い分ける戦略も有効です。例えば、常に開いておくメイン開発ブランチや重要なサブブランチ用のワークツリーは固定で維持し、それ以外の一時的な作業(短期的な機能実装やレビュー用など)は必要に応じてワークツリーを追加・削除するようにします。
具体的には、mainやdevelopといった中核ブランチのワークツリーは常設し、それらは常に最新の状態に追従させておきます(定期的にgit pullして更新)。一方で、数日の作業で終わるような機能ブランチやレビュー用ブランチは、その期間だけワークツリーを作成して作業し、完了したらgit worktree removeで削除します。こうすることで、常に必要最低限のワークツリーだけが存在する状態を保て、管理が煩雑になりにくくなります。長期用と短期用を明確に分けて運用することで、ワークツリーが増えすぎて把握できなくなる事態を避けられるでしょう。
不要になったワークツリーのクリーンアップ:定期的な削除とpruneによるメンテナンス
最後に、不要になったワークツリーの定期的なクリーンアップも大切です。開発が一段落したブランチのワークツリーや、もう使わなくなった一時フォルダは放置せず積極的に削除しましょう。git worktree listで現在のワークツリーを確認し、目的を終えたものがあればgit worktree removeで片付けます。これによりディスク上の余計なファイルを減らし、他のメンバーが見てもどのワークツリーが現役なのか分かりやすくなります。
また、前述したgit worktree pruneコマンドも、手動でフォルダを削除してしまった場合などには活用しましょう。定期的にgit worktree prune --dry-runで孤立した参照がないかチェックし、問題なければ実行してクリーンに保つといった運用もおすすめです。Gitのガベージコレクション設定によって自動クリーンアップもされますが、開発サイクルの節目(スプリント終了時など)に確認しておくと安心です。こうしたメンテナンス習慣を取り入れることで、複数ワークツリー運用による環境の肥大化や混乱を防ぎ、常に快適な開発環境を維持できます。
Git worktree利用時によくあるハマりどころ・注意点とその対策方法を詳しく丁寧に解説
便利なGit worktreeですが、使い始めの頃につまずきやすいハマりどころや注意すべきポイントもいくつか存在します。ここでは、worktree運用時によく直面する問題と、その対策・回避方法について解説します。事前に把握しておけば、トラブルに遭遇した際も落ち着いて対処できるでしょう。
同じブランチを複数ワークツリーでチェックアウトできない制約とその対処方法
まず最初によくある疑問が、「同じブランチを二箇所でチェックアウトしたい」というものです。例えば、mainブランチのコピーを別フォルダに作っておいて2箇所で編集したら便利では?と考えるかもしれません。しかし前述の通り、Git worktreeでは一つのブランチは同時に複数ワークツリーでチェックアウトできない制約があります。そのため、git worktree addで既に使用中のブランチを指定すると以下のようなエラーが出ます:
fatal: 'main' is already checked out at '/path/to/repo'
このメッセージに戸惑うかもしれませんが、対策としては同じブランチ名を避けることが基本です。本当に同内容のブランチを複製したい場合は、mainから別名のブランチ(例:main-copy)を作成してチェックアウトするか、--detachオプションでHEADを切り離してチェックアウトする方法があります。--detachを使うとブランチに紐付かない状態でワークツリーを作れるため、実質的に「同じブランチ内容の作業コピー」を2つ持つことが可能です(ただしコミットしても元のブランチには反映されない点に注意)。基本的には、同一ブランチで2重編集する状況は避けるのが無難なので、worktree運用ではこの制約を前提にブランチ計画を立てましょう。
ワークツリーを手動削除した際に残る参照情報:pruneコマンドによる後処理
誤ってワークツリーのフォルダを手動で削除してしまった場合の対処も覚えておきましょう。通常、ワークツリーはgit worktree removeで削除すべきですが、うっかりエクスプローラやターミナルでフォルダごと削除してしまうケースがあります。この場合、実体のフォルダは消えてもGitの管理情報にはそのワークツリーの記録が残っているため、git worktree listを実行すると「存在しないはずのワークツリー」が一覧に表示され続けます。
このままだと紛らわしいので、対策としてgit worktree pruneコマンドで不要な参照をクリーンアップします。git worktree pruneを実行すると、Gitが検知した孤立ワークツリー情報(ワークツリーフォルダが無いのに残っている情報)を削除してくれます。何も起きない場合はgit worktree prune --expire 0のように--expireオプションで期限を現在に設定すると即時にチェックが行われます。予防策として、ワークツリーを削除するときは手動ではなく必ずgit worktree removeを使う習慣をつけるのが安全です。もし手動削除してしまった場合でも、pruneで後処理すればリポジトリ情報を整理できますので、慌てず対処しましょう。
複数ワークツリー作業時の混乱防止:作業ディレクトリ取り違えを防ぐ工夫
複数のワークツリーで同時に作業していると、どのディレクトリで何をしているか混乱する恐れがあります。例えば、ターミナルで間違ったワークツリーに移動したままコマンドを実行してしまったり、エディタで開いているウィンドウを取り違えて別ブランチのコードを編集してしまったり、といったミスが起こりがちです。これを防ぐにはいくつか工夫が有効です。
まず、前述したようにフォルダ名をブランチ名にしておくことで視認性を高めましょう。パスを見れば今どのブランチか分かる状態にしておくだけでもミスは減ります。次に、シェルのプロンプトに現在のディレクトリ名やGitブランチ名を表示する設定にすると、ターミナル操作時に確認ができます。例えば、~/repo-feature-login (feature-login) のようにプロンプトに表示されれば一目瞭然です。また、IDEやテキストエディタで複数プロジェクトを開く場合、ウィンドウのテーマカラーを変える、ウィンドウタイトルにフォルダ名を表示する等の設定も有効でしょう(エディタによってはワークスペース名が表示されますので、それをブランチ名にするなど)。
要は、常に自分がどのワークツリー上で作業しているか意識できる環境作りが大切です。ちょっとした工夫でヒューマンエラーは大きく減らせますので、複数ワークツリー運用時には是非取り入れてください。
ビルドや依存ファイルの重複:複数フォルダ間で環境を共有しないことによる注意点
Git worktreeではワークツリーごとに作業コピーが独立しているため、ビルド成果物や依存ファイルの共有ができない点にも注意が必要です。例えば、プロジェクトで大量の依存ライブラリ(node_modulesやvendorディレクトリなど)を持っている場合、各ワークツリーごとにそれらをインストールする必要があります。これは、一つのワークツリーにインストールした依存ファイルが他のワークツリーのフォルダには存在しないためです。同様に、コンパイル生成物(build/フォルダや中間ファイル)は各フォルダで別々に作られるため、複数の作業フォルダ間でビルド成果物が重複する可能性があります。
この結果、ディスク容量やビルド時間にある程度の増加が見込まれます。大規模プロジェクトでは、2つのワークツリーでそれぞれビルドを行うと単純にビルド時間が二倍かかる、といったこともありえます。ただし、これは言い換えれば「2つの異なるブランチを別々にビルドしている」状況なので、必要経費とも言えます。対策として、もしビルド出力や依存物を共有したい場合は、ビルド設定を工夫して共通の出力先を使う、あるいはキャッシュを使い回すなど高度な方法も考えられますが、一般的には各ワークツリーは完全に独立した環境として割り切って運用するのがシンプルでトラブルも少ないでしょう。この点を踏まえ、必要以上に同時開いておくワークツリーを増やしすぎないなどの調整をすると良いかもしれません。
一部ツールでの非対応:Git GUIクライアントがワークツリーを認識しない場合の対策
Git worktreeはGitのコマンドライン上では問題なく扱えますが、一部のGUIクライアントやIDEでは完全にサポートされていない場合があります。例えば、古いバージョンのGitクライアントはworktreeの概念を知らず、追加したワークツリーを認識できなかったり、.gitがファイルであることに対応できずエラーを出すケースがあります。エディタによっては、一つのプロジェクトしか開けない前提で動いているため、複数のワークツリーからなる状況をUI上で表現できないこともあります。
対策としては、まず可能であれば使用しているツールやIDEを最新バージョンにアップデートしてみてください。近年の開発ツールはGit worktreeへの対応が進んでおり、例えばVSCodeやIntelliJ系IDE、Forkなどは複数フォルダを開く運用に対応しています。それでも上手く認識しない場合は、各ワークツリーを個別のリポジトリとしてツールに登録する方法があります。GUIクライアントのリポジトリリストにそれぞれのワークツリーフォルダを追加すれば、別々のプロジェクトとして扱える場合があります。また最終手段として、特定の操作(例えばワークツリーの追加/削除)はコマンドラインで行い、普段のコミットやプッシュはGUIで行う、といった併用も検討できます。
要は、ツール側の対応状況によって多少運用に工夫が必要になる場合もあるということです。幸い、worktree機能は徐々に普及してきていますので、新しめの開発ツールを使っている限り大きな問題はないでしょう。もしツール非対応による不便さが目立つ場合は、開発環境を見直すことも選択肢に入れてみてください。
GUIツールやエディタでのGit worktree活用法:VSCodeやForkで効率化する方法を詳しく紹介
ここまで主にコマンドラインでのGit worktree操作について述べてきましたが、実際の開発ではGUIツールやエディタを使っている方も多いでしょう。そこで、代表的な開発ツールにおけるworktreeの活用方法や注意点について紹介します。
VSCodeでのGit worktree活用:複数フォルダを開いてブランチを同時に編集する方法
Visual Studio Code (VSCode)はGitとの親和性が高く、worktreeを使った並行作業にも比較的向いています。VSCodeでGit worktreeを活用する場合、基本的には複数のフォルダ(ワークツリー)を同時に開く形で操作します。具体的な方法としては、VSCodeの「新しいウィンドウ」で別ワークツリーのフォルダを開くか、もしくは「複数フォルダーのワークスペース」にそれぞれのフォルダを追加する方法があります。
例えば、mainブランチのフォルダを既にVSCodeで開いている状態で、コマンドパレットから「Add Folder to Workspace」(フォルダをワークスペースに追加)を実行し、feature-xブランチのワークツリーフォルダを追加することができます。すると、VSCodeのエクスプローラーには2つのフォルダが表示され、それぞれ独立したGitリポジトリとして認識されます。ソース管理ビュー(Source Control)でもリポジトリが複数表示され、main用とfeature-x用でコミットやプッシュを個別に操作できます。
VSCodeではこのように1つのウィンドウ内で複数のリポジトリを扱えるため、worktreeで作成したフォルダを同時に開いて並行編集・比較することが容易です。また、ウィンドウを分けて開く場合は、ウィンドウごとにテーマカラーを変えるなどして見分けやすくする工夫も考えられます(拡張機能でワークスペースごとに色を変えることも可能です)。VSCodeのGit拡張はworktreeによる複数ブランチ作業にも対応していますので、特別な設定をしなくても概ね快適に利用できるでしょう。
Gitクライアントツール「Fork」でのワークツリー対応:複数チェックアウトの手順
Forkは人気のGit GUIクライアントですが、Git worktreeにも対応した便利な使い方が可能です。Forkでは、基本的に各ワークツリーのフォルダを個別のリポジトリとして認識させて利用します。例えば、Forkのリポジトリマネージャにおいて「Open」を選択し、作成済みのワークツリーフォルダ(例:feature-xフォルダ)を開くと、Fork上でそれを一つのリポジトリとして扱うことができます。
Forkは内部的にGitの挙動を利用しているため、ワークツリーの.gitファイル(ポインタ)も正しく解釈し、そのフォルダに対応するブランチやコミット履歴を表示してくれます。こうして、Fork上でmainブランチのリポジトリ画面と、feature-xブランチのリポジトリ画面を別々のウィンドウまたはタブで開いておけば、GUI上で二つのブランチの履歴や差分を見比べたり、それぞれでコミット操作を行ったりできます。
Forkの場合、特に特別な設定をしなくてもworktreeフォルダを開くだけで対応可能ですが、念のためFork自体を最新版にアップデートしておくと安心です。Forkが正式にworktreeをサポートする旨のドキュメントも公開されており、複数チェックアウトの状況でも安定して動作するよう設計されています。GUIならではの洗練されたUIでworktree環境を管理できるので、CLI操作に不慣れな方でもForkを使えば複数ブランチの並行作業を視覚的に把握しながら進められるでしょう。
その他のGit GUI(SourceTreeやTower等)におけるworktreeサポート状況
Fork以外のGit GUIクライアントでも、最近はGit worktreeへの対応が進んできています。例えばSourceTree(Atlassian社のGitクライアント)では、worktree自体を管理する明示的な機能はありませんが、個別のワークツリーフォルダを新しいリポジトリとして追加することで実質的に利用可能です。ただし、SourceTreeはバージョンによっては.gitファイルを持つフォルダを認識できない場合も報告されており、その場合は手動でそのフォルダ内のGit情報を読み込ませる必要があるかもしれません(最新バージョンでは改善されている可能性があります)。
Tower(Mac/Linux向けGUI)やGitKrakenなどについても、明示的なUIサポートは限定的ですが、同様に各ワークツリーを独立したリポジトリとして開くことで対応できます。これらのツールはGitコマンドをラップして動作しているため、基本的にはworktreeフォルダ内でのGit操作も問題なく動作するはずです。とはいえ、一部の操作(例えば新規worktreeの追加/削除)はGUI上からは行えずコマンドラインを併用する必要がある場合もあるので、その点は留意してください。
総じて、GUIツールごとのworktree対応状況はまちまちですが、最新のツールは概ね問題なく扱えるか、あるいは工夫次第で利用可能です。もし普段使っているGUIで不明点があれば、公式ドキュメントやユーザーコミュニティで「worktree」関連の情報を調べてみると良いでしょう。
IDE環境(IntelliJやEclipse)で複数ワークツリーを扱う際のポイント
IDE(統合開発環境)でGit worktreeを扱う場合も基本的な考え方はGUIクライアントと同じで、各ワークツリーを別プロジェクトとして開く形になります。例えば、IntelliJ IDEA系のIDEでは、プロジェクトウィンドウを複数開くことができますので、worktreeごとに新規ウィンドウでプロジェクトを開けばOKです。mainブランチ用のフォルダを一つのプロジェクトとして開き、feature-xブランチ用フォルダを別ウィンドウのプロジェクトとして開く、といった具合です。IntelliJはGitリポジトリの検出に対応しているため、.gitファイルを持つフォルダでも問題なくGit連携機能が働くでしょう。
Eclipseの場合はワークスペースの概念がありますが、一つのワークスペースに複数プロジェクトをインポートできるため、それぞれのworktreeフォルダを独立したプロジェクトとして導入すれば並行作業が可能です。Visual StudioやXcodeなどでも、ソリューション/ワークスペースを分けて開くことで対応できます。IDE上では、各プロジェクトがそれぞれ別のGitブランチ(リポジトリ)を参照していることになるため、IDEのコード補完やリファクタリング機能もブランチごとに独立して働く利点があります。
注意点として、IDEはエディタ以上にメモリやCPUリソースを消費するため、あまり多くのワークツリーを同時に開くと開発マシンに負荷がかかる可能性があります。必要な分だけ同時に開くよう心がけ、使わないプロジェクトウィンドウは閉じるなどの運用でバランスを取ると良いでしょう。
エディタでのワークツリー管理上の注意:コンテキスト切替やファイル保存時に起こりうる問題に留意
エディタ上で複数のワークツリーを扱う際には、ファイル編集や保存に関する注意点もあります。例えば、同じファイル名・パス(ただしディレクトリルートは異なる)が複数ブランチで存在している場合、うっかり別ブランチ側のウィンドウで編集してしまう、といったことが起こり得ます(前述のディレクトリ取り違えの問題です)。特に両方のブランチで似たコードを書いていると、どちらを編集していたか混乱しやすくなるため、編集中のファイルのパスをよく確認するようにしましょう。
また、エディタによってはファイル保存時にバックグラウンドでフォーマッターやリンターが走り、自動でコードを変更するものがあります。この設定が各ワークツリーで異なっていると、意図しない差分が生じる可能性があります。理想的には、全てのワークツリーで統一したエディタ設定を適用するか、ワークスペースごとに設定を分離できるエディタであればブランチに応じて適切に設定しましょう。VSCodeではワークスペース単位で設定ファイルを置くことができますし、IntelliJ系でもプロジェクトごとに設定プロファイルを持てます。
最後に、複数のワークツリーで同じファイルを編集している場合、どちらかの変更を他方に反映させたいケースもありますが、その際はGitのマージやcherry-pickを使うのが安全です。エディタ上でコピペしてしまうとミスにつながることもあるため、バージョン管理ツールとしてのGitに任せる方がよいでしょう。要するに、エディタ利用時にも基本的な注意を払い、混乱や競合を避ける工夫をしておくことが大事ということです。
Git worktreeをさらに便利にするエイリアス・ツールの紹介(wtpやスクリプト活用)
最後に、Git worktree機能をさらに便利に活用するための工夫として、エイリアスの活用やサードパーティーツールについて紹介します。手作業の繰り返しを減らし、より快適にworktree運用を行うためのアイデアです。
Gitコマンドエイリアスで作業効率化:git worktree操作を短縮する便利な設定
Gitのエイリアス(alias)機能を使えば、worktree関連のコマンド入力を簡略化して作業効率を上げることができます。Gitのエイリアスは~/.gitconfig等に設定を追記することで、自分独自のサブコマンドのように扱える機能です。例えば、よく使うgit worktree addやlist、removeに短い別名をつけてみましょう。
[alias] wta = worktree add wtl = worktree list wtr = worktree remove
上記の設定をGit設定ファイルに追加すると、git wta と打つだけでgit worktree addと同じ動作をするようになります。同様にgit wtlで一覧表示、git wtrで削除が可能です。これにより、ターミナルでの入力が短縮され日常的な操作が楽になります。
さらに応用として、エイリアスでは簡単なシェルスクリプト的な動作も定義できます。例えば、あるワークツリーから別のワークツリーへ最新変更をプルするようなカスタムエイリアスを作ることも可能です(Stack Overflow上ではwtpというエイリアスで、親ディレクトリの別ワークツリーに対してgit pullする関数を定義する例があります)。このように、エイリアスを活用すれば自分のワークフローに合わせた便利コマンドを作り出せます。Git worktree運用に慣れてきたら、是非エイリアス設定を見直してみましょう。
wtp:Git worktree操作を簡素化するサードパーティ製CLIツールの特徴
Git worktreeの操作をさらに洗練するために、wtp(Worktree Plusの略)というサードパーティ製のCLIツールも存在します。wtpはGitの外部ツールですが、Git worktreeコマンドをラップしてより使いやすくしたインターフェースを提供します。例えば、通常git worktree addではパスとブランチ名を両方指定する必要がありますが、wtpではブランチ名だけ指定すれば自動的に適切なパスにディレクトリを作成してくれる、といった具合です。
wtpの主な特徴として、
- 簡潔なコマンド体系:
wtp add -b ブランチ名のように必要最低限の情報で新規ワークツリー作成ができます。 - 自動ブランチ追跡: リモートブランチが存在する場合は自動で
--track付きでチェックアウトするなど、Git本来の挙動を賢く補助します。 - プロジェクト固有の設定: 特定のディレクトリ配下にworktreeをまとめる、初回に特定のスクリプトを実行するといったプロジェクトごとのフックも設定可能です。
- 便利コマンドの提供: 既存worktreeへの移動や削除なども
wtpコマンド一つで完結するよう設計されています。
例えばGitHubの有志が公開しているwtpツール(satococoa氏によるもの)は、Go言語で実装されており高速に動作します。導入すれば、単にGit worktreeの便利ラッパーとしてだけでなく、複数worktreeの包括的な管理ツールとして役立つでしょう。
wtpが提供する主な機能:ブランチ作成からワークツリー追加までの自動化
wtpツールには、具体的にどのような機能があるのでしょうか。主なものをいくつか挙げてみます。
- 新規ブランチ+ワークツリー一括作成: 通常、ローカルに存在しないリモートブランチをチェックアウトするには
git fetch後にgit worktree addで--track -bを指定…といった手順が必要ですが、wtpではwtp add ブランチ名だけでそれらを自動で行います。リモートに同名ブランチがあれば追跡設定付きで新規ブランチを作り、対応するワークツリーを作成してくれます。 - 作業ディレクトリの自動命名/配置: wtpは設定ファイルでワークツリーの配置ディレクトリを指定でき、ブランチ名から自動生成したパスにワークツリーを作ります。例えば
branch-nameという名前なら~/worktrees/branch-nameのように自動でフォルダを作る、といった具合です。毎回パスを考える手間が省けます。 - 複数ワークツリーの一覧・ナビゲーション:
wtp listコマンドで現在のワークツリーをわかりやすく表示したり、wtp switch ブランチ名で該当ワークツリーのディレクトリに移動するといったナビゲーション機能も提供されます。 - クリーンアップやロック操作:
wtp pruneで不要ワークツリーの整理をしたり、wtp lock/unlockでworktreeをロック状態にする機能もあります。Git本来の機能をラップしつつ、短いコマンドで実行できるようになっています。
要するに、wtpはGit worktree周りの一連の作業(ブランチ作成からフォルダ準備、一覧管理、削除など)を自動化・簡略化することで、開発者がコマンド入力や手作業に煩わされずコーディングに集中できるよう支援してくれるツールなのです。
自作スクリプト活用例:複数ワークツリーの作成・削除を一括管理するツール
wtpのような既製ツールを使わなくても、ちょっとした自作スクリプトでworktree運用を便利にすることも可能です。例えばシェルスクリプトで、指定したブランチ名のワークツリーをまとめて作成するツールを作ってみましょう。以下は簡単な擬似コード例です。
#!/bin/bash BRANCH=$1 BASE_DIR=~/worktrees # ワークツリーを配置するベースディレクトリ
git fetch origin $BRANCH && git worktree add -b $BRANCH $BASE_DIR/$BRANCH origin/$BRANCH
このスクリプトをnew-wt.shとして保存し、実行可能にすれば、./new-wt.sh feature-xのように実行するだけでfeature-xブランチの最新をフェッチしてワークツリー追加まで自動で行ってくれます。他にも、例えば既存の全ワークツリーをループしてアップデート(git pull)するスクリプトや、特定のパターンのブランチのワークツリーを一括削除するスクリプトなど、アイデア次第で様々な自動化が可能です。
自作スクリプトの利点は、自分のプロジェクト特有のルールや運用に合わせて柔軟にカスタマイズできる点です。チーム内で共通のスクリプトを用意しておけば、メンバー全員が統一された方法でworktreeを扱えるというメリットもあります。ただし、スクリプトの内容が正しく動作することを十分確認してから実運用するようにしてください(誤って不要なデータを消さないように注意)。このように、ちょっとしたスクリプトで作業を自動化することもWorktree活用の幅を広げる一手段と言えます。
補助ツール利用時の注意点:公式Git機能との互換性とアップデートへの対応
エイリアスや外部ツールを導入する際には、いくつか注意すべき点もあります。まず、これらはGitの公式機能を拡張・自動化するものであり、Git本体のバージョンアップに伴う挙動変化に注意が必要です。Gitの新バージョンでworktree周りの仕様が変わった場合、エイリアスやスクリプトが意図しない動作をする可能性があります。定期的にそれらの設定やコードを見直し、互換性を確認しましょう。
また、チーム開発の場合、自分だけが特別なエイリアスやツールを使っていると、他のメンバーとの間でオペレーションに差異が生まれることもあります。ドキュメントにツールの利用法を明記する、チーム全体で導入して共通化する、といった対応をすると良いでしょう。特にwtpのようなサードパーティツールを使う場合は、プロジェクトREADMEに導入方法やバージョンを記載しておくと親切です。
さらに、外部ツール自体のアップデートにも注意が必要です。wtpであればGitHub上で更新が行われるでしょうし、自作スクリプトであればGitの挙動変化に追従してメンテナンスする必要があります。これらを怠ると、思わぬタイミングでツールが使えなくなったり誤動作したりするリスクがあります。
要するに、公式機能にない便利さを享受する代わりに、それらを適切に管理する責任も発生するということです。適切にメンテナンスしつつこれらのエイリアス・ツールを活用すれば、Git worktreeライフが一層快適になるでしょう。
Git worktreeに関するよくある質問
Git worktreeを削除するには?
不要になったワークツリーは git worktree remove <パス> で削除します。作業ディレクトリごと取り除かれ、メインリポジトリの履歴やほかのワークツリーには影響しません。エクスプローラーなどで手動でフォルダを消してしまった場合は管理情報だけが残るため、git worktree prune で不要になった参照を掃除します。未コミットの変更が残っていて削除を拒否されるときは、変更を退避または破棄したうえで --force を付けて実行します。
ワークツリーを別の場所へ移動するには?
ディレクトリの移動には git worktree move <現在のパス> <移動先のパス> を使います。エクスプローラーで手動で移動すると、メインリポジトリ側の管理情報(.git/worktrees 配下の記録)とパスがズレてワークツリーが壊れるため、必ずこのコマンド経由で移動します。
SourceTreeやFork、EclipseはGit worktreeに対応していますか?
GUIクライアントごとに対応状況が異なります。専用のUIからワークツリーを一覧・切り替えできるものもあれば、UIが限定的でターミナルからの git worktree コマンド併用が現実的なものもあります。手元のツールでの対応可否や操作方法は、各ツールの公式ドキュメントで最新情報を確認してください。VS CodeやForkでの具体的な使い方は本文の「GUIツールやエディタでのGit worktree活用法」で解説しています。
worktree-plus(wtp)とは何ですか?
worktree-plus(wtp)は、git worktree の操作を短いコマンドでまとめて扱えるようにするサードパーティ製の補助ツールです。ワークツリーの追加・一覧・切り替え・削除の手間を減らせます。チームで使う場合は、プロジェクトのREADMEに導入方法とバージョンを記載しておくと、メンバー間で運用を統一しやすくなります。
ブランチを指定せずにワークツリーを作れますか?
作れます。git worktree add --detach <パス> を使うと、ブランチに紐づかない detached HEAD の状態でワークツリーを追加できます。特定のコミットやタグの内容を一時的に取り出して確認したいときに便利で、新しいブランチを作らずに済みます。その内容から作業を続けたい場合は、その場で新規ブランチを切ってコミットします。