git 操作が苦手な人へおすすめしたい git の使い方 ― git-worktree を使った複数ブランチ並行開発 ―

複数ブランチを並行して扱うとき、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 と似ていますが、決定的な違いは次の通りです。

項目cloneworktree
リポジトリ複製される共有される
ディスク容量多い少ない
ブランチの扱い自由各 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 を使うことで、複数ブランチの並行開発が驚くほど快適になります。
ぜひ日々の開発に取り入れてみてください。

コメント

タイトルとURLをコピーしました