複数ブランチを並行して扱うとき、stash や clone を使った管理は意外と手間がかかります。
この記事では、まずその理由を整理し、次に git-worktree がどのように問題を解決するのかを説明します。
その後、最小限のコマンドで使えるデモを紹介し、最後に注意点(制約)をまとめます。
ブランチを並行で操作するときの困りごと
stash の場合
stash を使うと 1 つのディレクトリで作業できますが、未コミットの変更があるとブランチを切り替えられない ため、変更を stash で退避する必要があります。
stash が増えると、
- どの stash がどの作業だったか分からない
- 適用・削除の判断が面倒
といった管理コストが発生します。
clone の場合
clone はブランチごとにディレクトリを分けられるため、stash のような退避操作は不要です。
しかし clone は リポジトリ自体が複製されるため、
- 各 clone 間で変更を共有するには push や fetch などの同期操作が必要
- ディレクトリが増えて管理対象が増える
- ディスク容量を多く消費する
といった別の管理コストが発生します。
まとめ
stash と clone はそれぞれ利点があるものの、複数ブランチを並行して扱うには管理コストが大きくなりがちです。
並行作業を楽にする案:git-worktree
git-worktree を使うと、1 つのリポジトリから複数の作業ディレクトリ(ワーキングツリー)を作成できます。
clone と似ていますが、決定的な違いは次の通りです。
| 項目 | clone | worktree |
|---|---|---|
| リポジトリ | 複製される | 共有される |
| ディスク容量 | 多い | 少ない |
| ブランチの扱い | 自由 | 各 worktree に 1 ブランチが紐づく |
| 同一ブランチの複数チェックアウト | 可能 | 不可(技術的制約) |
worktree は 1 つのリポジトリを共有するため、どの worktree で作った commit も同じ履歴に積み上がります。
stash と clone の利点を組み合わせたような使い方ができ、複数ブランチの並行作業がぐっと楽になります。
実際に git-worktree を使ってみる
ここからは、ローカルリポジトリの作成から worktree の追加までを、最小限のコマンドで紹介します。
VS Code のターミナルを使う前提で進めます。はじめて worktree を使う方は【リポジトリの準備】から始めてください。
【リポジトリの準備】 作業用ディレクトリを作成し、VS Code で開く
mkdir sample-repo
cd sample-repo
code .
【リポジトリの準備】Git リポジトリを初期化
git init
【リポジトリの準備】適当なファイルを作って初期コミット
echo "hello" > app.txt
git add .
git commit -m "initial commit"
現在の worktree を確認
git worktree list
リポジトリやブランチの情報が表示されます。
表示結果
{パス}/sample-repo {ハッシュ値} [{main or master}]
feat ブランチを作成
git branch feat
feat ブランチ用の worktree を追加
git worktree add ../feat feat
作成した worktree を確認
git worktree list
feat ブランチの worktree が追加されています
{パス}/sample-repo {ハッシュ値} [{main or master}]
{パス}/feat {ハッシュ値} [feat]
作成した worktree を VS Code で開く
cd ../feat
code .
使い終わった worktree を削除
git worktree remove ../feat
git-worktree の注意点
さいごに、git-worktree を使ううえで知っておきたい制約を紹介します。
あわせて、わたし自身が実践している対処方法も書いておきます。
同じブランチを複数の worktree で checkout できない
worktree は「1 ブランチにつき 1 worktree」という仕様のため、同じブランチを複数の worktree で同時に使うことはできません。
わたしの対処方法:
複数の worktree で同じ内容を扱いたい場合は、対象のコミットから作業用のブランチを新しく切るようにしています。
こうすることで、実質的に「同じ状態のブランチを複数の worktree で扱う」ことができます。
worktree のディレクトリは手動で削除しない
エクスプローラーなどで手動削除すると、Git が内部で管理している worktree 情報と不整合が起きてしまいます。
必ず次のコマンドで削除します。
git worktree remove <path>
worktree のディレクトリを移動すると Git が認識できなくなる
worktree のパスは Git の内部に記録されているため、ディレクトリを手動で移動すると Git がその worktree を見失います。
わたしの対処方法:
誤って移動・削除してしまう事故を防ぐために、worktree 専用のディレクトリを 1 つ作り、その中で worktree を管理する という自分ルールを作っています。
こうしておくと、意図しない場所に worktree が散らばらず、安全に運用できます。
まとめ
- clone はリポジトリが複製され、同期が必要
- worktree は 1 リポジトリで複数ディレクトリを扱える
- VS Code と組み合わせると並行作業がとても楽
- 制約を理解すれば安全に使える
git-worktree を使うことで、複数ブランチの並行開発が驚くほど快適になります。
ぜひ日々の開発に取り入れてみてください。

コメント