Git worktree:コンテキストスイッチという「死」からの脱却
君たちが毎日行っている `git checkout`。あの数秒間の待ち時間、あるいはビルドキャッシュの無効化による数分間のロスを「仕方がない」と受け入れているなら、君のエンジニアとしてのキャリアはそこで止まっている。
大規模なモノレポや、複雑な依存関係を持つプロジェクトにおいて、ブランチを切り替えるたびに発生する `node_modules` の再インストール、`target` ディレクトリの再構築、あるいはIDEのインデックス再作成。これらは単なる無駄ではない。君の思考のフローを分断する「コンテキストスイッチという名の生産性の殺人」だ。
今回は、Gitの隠された奥義 `git worktree` を用いて、この非効率を物理的に撲滅する方法を伝授する。
—
1. `git worktree` の本質:物理的な並列化
`git worktree` は、単なる「別のディレクトリへのチェックアウト」ではない。`.git` ディレクトリを共有しつつ、ワーキングツリーだけを分離する仕組みだ。これにより、1つのGitリポジトリを、あたかも複数の独立したプロジェクトのように並列運用できる。
基本のコマンド(だが、これだけでは甘い)
現在のディレクトリとは別に、feature-x用の作業場を作る
git worktree add ../feature-x feature-x
これで `../feature-x` に移動すれば、即座にそのブランチで作業を開始できる。コンテキストの切り替え時間は、`cd` コマンドの実行時間のみ。0秒だ。
—
2. 極限の自動化:`wt-init` スクリプトによる環境構築の瞬間化
手動で `worktree` を作成するのはスマートではない。私はプロジェクトごとに、以下のスクリプトを `bin/` に置いている。これを叩けば、必要なディレクトリ構造とビルドキャッシュのリンクが瞬時に完成する。
!/bin/bash
wt-init.sh: 高速作業環境生成スクリプト
BRANCH_NAME=$1
TARGET_DIR=”../${BRANCH_NAME}”
if [ -z “$BRANCH_NAME” ]; then
echo “Usage: wt-init
exit 1
fi
1. worktreeの作成
git worktree add “$TARGET_DIR” “$BRANCH_NAME”
2. 依存関係の共有(シンボリックリンクの最適化)
ビルドキャッシュを共有することで、ディスク容量と時間を節約する
ln -s “$(pwd)/node_modules” “$TARGET_DIR/node_modules”
echo “🚀 Worktree initialized at $TARGET_DIR”
ここがエキスパートの知見: 依存ライブラリ(`node_modules`や`vendor`)をシンボリックリンクで共有する際は注意が必要だ。npmやpipが「別の場所から来た」と誤認しないよう、環境変数を制御するか、ビルドツール側でルートディレクトリを固定する設定が必要になる。これを突破できる者だけが、真の並列開発を享受できる。
—
3. メモリとストレージの最適化ハック
`worktree` を多用すると、`.git` ディレクトリ内のデータが肥大化する可能性がある。しかし、Gitには `git-reference` という秘密兵器がある。
もし、ローカルに複数のクローンを保有しているなら、`–reference` オプションを使用して、リポジトリのオブジェクトストアを共有せよ。これにより、物理ストレージの消費を最小限に抑えつつ、キャッシュのヒット率を最大化できる。
さらに、CI/CDパイプラインにおいては、`git worktree` を活用して 「ビルド専用コンテナ」と「テスト実行用コンテナ」で同じレポジトリをマウントし、ワーキングツリーを分離して並列実行させる 構成を組むべきだ。これにより、CIの実行時間は劇的に短縮される。
—
4. チーム開発における「規律」
`worktree` を使いこなすチームには、独自の規律が必要だ。
- 命名規則の徹底: `worktree` は `../` に展開されることが多いため、ディレクトリ名が衝突しないよう `feature/`, `hotfix/`, `exp/` といったネームスペースを運用ルールに組み込むこと。
- 不要なツリーの掃除: 終わった作業場を放置するな。`git worktree prune` を定期的に実行し、死んだパスをクリーンアップする自動化タスクを `pre-push` フック等に仕込んでおけ。
—
結論:ツールに支配されるな、ツールを使い倒せ
`git checkout` で悩んでいる時間は、君が本来コードを書くべき「創造的な時間」を食いつぶしている。`git worktree` は、単なる便利機能ではない。並列的な思考を、そのまま物理的な開発環境へ投影するための最強のツールだ。
君の今の作業プロセスに、この「並列性」を導入しろ。そして、ビルドが完了するのを眺める無駄な時間を捨て、常に動くコードを複数のコンテキストで同時に管理する、次世代のエンジニアへと進化せよ。
次回の記事では、`worktree` と `fzf` を組み合わせた、秒速コンテキストスイッチ・ランチャーの構築法について深掘りする。期待して待っていてくれ。