git worktreeとは?作成・確認・削除方法をわかりやすく解説!

Gitを使って開発していると、あるブランチで作業している途中に、別のブランチを確認・修正したくなることがあります。

例えば、mainブランチで作業しているときに、featureブランチの動作を確認したり、別のメンバーから届いたプルリクエストをローカルで確認したりする場合です。

通常は、同じ作業ディレクトリで別のブランチを確認する場合、git switchなどでブランチを切り替える必要があります。また、作業中の変更内容によっては、事前にコミットしたりgit stashで一時退避したりしなければならないこともあります。

このようなときに便利なのが、git worktreeです。

git worktreeを使用すると、同じGitリポジトリから複数の作業ディレクトリを作成し、それぞれ異なるブランチを同時に開いて作業できます。

この記事では、git worktreeの基本的な意味から、ワークツリーの作成・確認・削除方法、git stashとの違いまで、わかりやすく解説します。

git worktreeとは?

git worktreeとは?

git worktreeとは、1つのGitリポジトリに複数の作業ディレクトリを作成し、それぞれで異なるブランチを同時に扱うための機能です。

通常は、1つのGitリポジトリの作業ディレクトリで、ブランチを切り替えながら作業します。

例えば、現在mainブランチで作業している場合、作業ディレクトリ(ここではprojectという名前とします)にはmainブランチのファイルが展開されており、次のようになります。

project/ ← 作業ディレクトリ
└─ mainブランチのファイル

ここからfeatureブランチへ切り替える場合は、git switch featureなどを実行する必要があります。git switch featureを実行すると、ディレクトリの状態は次のようになり、projectディレクトリの内容がfeatureブランチの状態に切り替わります。

project/
└─ featureブランチのファイル

一方、git worktreeを使用すると、git switchで現在のブランチを切り替えずに、別のブランチ用の作業ディレクトリを追加できます。

例えば、featureブランチ用のワークツリーを追加する場合は、次のようなコマンドを使用します。

git worktree add ../project-feature feature

すると、次のようにmainブランチ用とfeatureブランチ用の作業ディレクトリを同時に用意できます。

project/
└─ mainブランチのファイル

project-feature/
└─ featureブランチのファイル

さらに別のブランチ用のワークツリーを追加すれば、次のように複数の作業ディレクトリを並べて使用できます。

project/
└─ mainブランチのファイル

project-feature/
└─ featureブランチのファイル

project-bug/
└─ bugブランチのファイル

この場合、projectではmainブランチ、project-featureではfeatureブランチ、project-bugではbugブランチをそれぞれ扱えます。

つまり、git worktreeを使うと、git switchでブランチを何度も切り替えずに、複数のブランチを別々の作業ディレクトリで並行して扱うことができます。

git worktree addの詳しい使い方や、ワークツリーの確認・削除方法については、このあと順番に説明します。

git worktreeが便利な場面

git worktreeは、特に次のような場面で便利です。

  • 開発中の作業を残したまま、別のブランチを確認したい
  • 急な不具合修正のために別のブランチで作業したい
  • プルリクエストの内容をローカルで確認したい
  • 2つのブランチの動作を同時に比較したい
  • 別のブランチでテストやビルドを実行したい

例えば、featureブランチでログイン機能を開発している途中に、別のメンバーからプルリクエストが届いたとします。

通常であれば、現在の変更をコミットするか、git stashで一時退避してから、レビュー対象のブランチへ切り替える必要があります。

しかし、git worktreeを使用すれば、現在の作業ディレクトリをそのまま残した状態で、別のディレクトリにレビュー対象のブランチを用意できます。

git worktreeの使い方

ここからは、git worktreeの基本的な使い方を紹介します。

主に使用するコマンドは次のとおりです。

コマンド説明
git worktree add既存ブランチのワークツリーを作成する
git worktree add -b新規ブランチのワークツリーを作成する
git worktree listワークツリーの一覧を確認する
git worktree removeワークツリーを削除する
git worktree moveワークツリーを別の場所へ移動する
git worktree prune不要になったワークツリーの管理情報を削除する

それぞれ順番に説明します。

git worktree add:既存ブランチのワークツリーを作成する

新しいワークツリーを作成する場合は、git worktree addコマンドを使用します。

すでに存在するブランチを使用してワークツリーを作成する場合の基本構文は、次のとおりです。

git worktree add <作成先のパス> <ブランチ名>

例えば、featureブランチがすでに存在しており、現在のリポジトリが/home/user/projectにあるとします。featureブランチ用のワークツリーを/home/user/project-featureに作成する場合は、次のコマンドを実行します。

git worktree add ../project-feature feature

このコマンドを実行すると、projectと同じ階層にproject-featureディレクトリが作成され、その中で既存のfeatureブランチがチェックアウトされます。

/home/user/
├─ project/          ← mainブランチ
└─ project-feature/  ← featureブランチ

featureブランチで作業したい場合は、作成したワークツリーへ移動します。

cd ../project-feature

もとのprojectディレクトリはそのまま残っているため、元のブランチでの作業を中断せずに、別のブランチで作業できます。

../project-feature..は「1つ上のディレクトリ」を表します。

git worktree add -b:新規ブランチのワークツリーを作成する

git worktreeでは、既存のブランチを使用するだけでなく、新しいブランチを作成しながらワークツリーを追加することもできます。

その場合は、-bオプションを使用します。

git worktree add -b <新しいブランチ名> <作成先のパス>

通常のgit worktree addでは「作成先のパス → ブランチ名」の順ですが、-bオプションを使って新しいブランチを作成する場合は「新しいブランチ名 → 作成先のパス」の順になるため注意しましょう。

例えば、現在のブランチをもとにfeatureという新しいブランチを作成し、../project-featureという別のディレクトリで作業する場合は、次のコマンドを実行します(ここでは、featureブランチがまだ存在していない場合を例に説明します)。

git worktree add -b feature ../project-feature

すると、以下の処理がまとめて行われます。

  • featureブランチが作成される
  • ../project-featureディレクトリが作成される
  • ../project-featureではfeatureブランチがチェックアウトされる

例えば、フォルダ構成は次のようになります。

/home/user/
├─ project/          ← 現在作業しているブランチ
└─ project-feature/  ← featureブランチ

あとは、作成したワークツリーへ移動すれば、新しいブランチで作業できます。

cd ../project-feature

この方法は、現在の作業を残したまま、別の新しい作業を並行して始めたい場合に便利です。

git worktree list:ワークツリーの一覧を確認する

現在作成されているワークツリーを確認する場合は、git worktree listコマンドを使用します。

git worktree list

例えば、次のように表示されます。

/home/user/project          a1b2c3d [main]
/home/user/project-feature  e4f5g6h [feature]

この結果から、それぞれのワークツリーのパス、現在のコミット、使用しているブランチを確認できます。

上記の例では、/home/user/projectmainブランチ、/home/user/project-featurefeatureブランチを使用していることがわかります。

すでに使用中のブランチは別のワークツリーで使えない

git worktreeでは、すでに別のワークツリーでチェックアウトされているブランチを、別のワークツリーで同時に使用することはできません。

例えば、featureブランチがすでに/home/user/project-featureで使用されている状態で、次のコマンドを実行します。この場合、featureブランチはすでに別のワークツリーで使用されているため、エラーになります。

git worktree add ../another-feature feature

これは、同じブランチを複数の作業ディレクトリで同時に編集してしまうことによる混乱を防ぐためです。基本的には、1つのブランチにつき1つのワークツリーで作業すると考えておくとわかりやすいでしょう。

git worktree remove:ワークツリーを削除する

作成したワークツリーが不要になった場合は、git worktree removeコマンドで削除できます。

基本構文は次のとおりです。

git worktree remove <ワークツリーのパス>

例えば、../project-featureを削除する場合は、次のコマンドを実行します。

git worktree remove ../project-feature

これで、project-featureのワークツリーが削除されます。

ワークツリー内にコミットしていない変更が残っている場合は、通常はそのまま削除できません。削除する前にgit statusなどで変更内容を確認しておきましょう。

なお、git worktree removeでワークツリーを削除しても、そのワークツリーで使用していたブランチ自体が自動的に削除されるわけではありません。

例えば、featureブランチを使用していたワークツリーを削除しても、featureブランチはGitリポジトリに残ります。

ブランチも不要な場合は、別途git branch -dなどで削除します。

git branch -d feature

git worktree move:ワークツリーを別の場所へ移動する

作成したワークツリーを別の場所へ移動したい場合は、git worktree moveコマンドを使用できます。

基本構文は次のとおりです。

git worktree move <移動元> <移動先>

例えば、../project-feature../work/featureへ移動する場合は、次のように実行します。

git worktree move ../project-feature ../work/feature

これにより、Gitが管理しているワークツリーの情報を保ったまま移動できます。なお、git worktree moveで移動できるのは追加したワークツリーであり、メインのワークツリーはこのコマンドでは移動できません。

単純にエクスプローラーやmvコマンドなどでディレクトリを移動するより、git worktree moveを使用する方が安全です。

git worktree prune:不要になったワークツリーの管理情報を削除する

ワークツリーのディレクトリをgit worktree removeを使用せず、手動で削除してしまうことがあります。

この場合、実際のディレクトリは存在しなくても、Git側にワークツリーの管理情報が残ることがあります。

そのような不要な管理情報を削除する場合は、git worktree pruneコマンドを使用します。

git worktree prune

通常は、ワークツリーを削除するときにgit worktree removeを使用していれば、頻繁に実行する必要はありません。

「ディレクトリを手動で削除してしまい、git worktree listに不要な情報が残っている」といった場合に使用すると覚えておくとよいでしょう。

git worktree pruneを実行しても、現在使用できるワークツリーの管理情報まで削除されるわけではありません。実際のディレクトリが存在しないなど、不要になった管理情報が削除の対象になります。なお、削除されたばかりのワークツリーの管理情報は、設定されている有効期限によってすぐには削除されない場合があります。

git worktreeとgit stashの違い

git worktreegit stashは、どちらも「現在の作業中に別のブランチを扱いたい」という場面で使われることがありますが、仕組みは異なります。

比較項目git worktreegit stash
主な目的複数の作業ディレクトリを作る現在の変更を一時退避する
現在の変更そのまま残しておけるスタッシュへ退避する
別ブランチの作業別ディレクトリで行うブランチを切り替えて行う
元の作業への復帰元のディレクトリへ戻るgit stash popなどで変更を戻す
向いている場面複数ブランチを並行して扱う一時的に作業を退避する

例えば、mainブランチで作業中に少しだけfeatureブランチを確認して、すぐに戻るのであればgit stashでも十分です。

一方、mainブランチで開発を続けたい、featureブランチでも修正やテストをしたい、両方のブランチを何度も確認したい、という場合は、git worktreeの方が便利です。

git stashは「現在の作業を一時的にしまっておく機能」、git worktreeは「別の作業場所をもう1つ用意する機能」と考えると違いを理解しやすいでしょう。

git cloneとgit worktreeの違い

複数の作業ディレクトリを作るだけであれば、同じリポジトリをもう一度git cloneする方法もあります。

例えば、次のように同じリポジトリを2つ用意することもできます。

project/
project-feature/

しかし、git cloneした場合、それぞれが独立したGitリポジトリになります。

一方、git worktreeで作成したワークツリーは、同じGitリポジトリに関連付けられています。

そのため、同じリポジトリの複数ブランチを並行して作業したいだけであれば、毎回リポジトリを複製する必要はありません。

比較項目git worktreegit clone
Gitリポジトリ同じリポジトリを共有する別のリポジトリとして複製する
主な用途同じリポジトリの複数ブランチを並行して扱うリポジトリそのものを複製する
作業ディレクトリ複数作成できるcloneごとに作成される

同じプロジェクト内で複数のブランチを同時に扱いたい場合は、git worktreeが便利です。

git worktreeを使うときの注意点

git worktreeは便利ですが、使うときはいくつか注意点があります。

  • どのワークツリーでどのブランチを使っているか確認する
    • ワークツリーが増えると、どのディレクトリでどのブランチを使用しているのかわかりにくくなることがあります。git worktree listを実行すると、ワークツリーとブランチの対応を確認できます。
  • 不要なワークツリーはgit worktree removeで削除する
    • ワークツリーのディレクトリを手動で削除すると、Git側に管理情報が残ることがあります。不要になったワークツリーは、基本的にgit worktree removeを使用して削除しましょう。
  • ワークツリーを削除してもブランチは残る
    • git worktree removeで削除されるのはワークツリーです。そこで使用していたブランチ自体は削除されません。ブランチも不要な場合は、git branch -dなどで別途削除する必要があります。

この3点を覚えておけば、初心者でも比較的安全にgit worktreeを利用できます。

本記事のまとめ

この記事では「git worktree」について、以下の内容を説明しました。

  • git worktreeは、1つのGitリポジトリに複数の作業ディレクトリを作成できる機能
  • 異なるブランチを別々のディレクトリで同時に扱える
  • git worktree addで作成し、git worktree listで一覧を確認できる
  • 不要になったワークツリーはgit worktree removeで削除する
  • 一時的な変更の退避にはgit stash、複数ブランチを並行して扱う場合はgit worktreeが便利

git worktreeを使うと、作業中のブランチをそのまま残しながら、別のブランチで確認や修正を行えます。

複数のブランチを行き来することが多い場合は、覚えておくと便利なGitの機能です。

お読みいただきありがとうございました。

スポンサーリンク