もうgit stashは卒業!git worktree + wtp で実現する、ストレスゼロの並行開発
株式会社FLINTERSでフロント&バックエンドエンジニアをやっている者です!
いい加減、git worktreeを身近においておこうと思い書き留めました。✏️🗒️
本記事はFLINTERS BLOG Advent Calendar 2025の13日目の記事となります。
はじめに
開発者の皆さんなら、一度は「コンテキストスイッチ地獄」を経験したことがあるのではないでしょうか。新しい機能開発に没頭しているまさにその時、Slackに飛び込んでくる 「緊急バグ修正お願いします!」 の通知。
ここから始まる従来の手順は、思い出すだけでも気が滅入ります。
まず、中途半端な作業を git stash で退避。次に git switch でバグのあるブランチに移動し、修正作業に頭を切り替えます。
修正が終わったら、また元のブランチに戻り、git stash pop を実行。
しかし、複数の stash が溜まっていると 「どれが今の作業だっけ?」と混乱したり、うっかり違うブランチで復元してコンフリクトを起こしたり…。
待っているのは、「あれ、さっきまで何をしようとしてたんだっけ…?」という、失われた集中力。
この、日々の開発フローに潜む小さな「時間泥棒」を完全に排除し、失われた集中力を取り戻すための強力な手段があるとしたら、試してみたいと思いませんか?
1. そもそも git worktree とは?
git worktree は、Gitに標準で備わっている機能です。一言で言うと、1つのリポジトリから複数のワーキングディレクトリ(作業場所)を作成し、それぞれで異なるブランチを同時にチェックアウトできる仕組みです。
これにより、ブランチを切り替えるたびに作業ディレクトリの状態がまるごと変わってしまう、というこれまでの常識が覆されます。
ハンズオン:git worktree を試してみる
百聞は一見にしかず。実際に試してみましょう。現在のプロジェクト(myproject)で作業中に、ログイン機能のバグ修正が必要になったとします。
# .git/worktrees/hotfix/login-validation にワークツリーを作成し、
# 同名のブランチ(hotfix/login-validation)を作成してチェックアウト
git worktree add .git/worktrees/hotfix/login-validation -b hotfix/login-validation
このコマンド一つで、カレントディレクトリに .git/worktrees/hotfix/login-validation という新しいディレクトリが作成され、その中で hotfix/login-validation ブランチがチェックアウトされた状態になります。
ディレクトリ構造は以下のようになります。
myproject (現在地)
├── src/
├── package.json
└── .git/
└── worktrees/
└── hotfix/
└── login-validation/ <-- ここが新しい作業場所
現在のワークツリー一覧も確認してみましょう。
# 現在のワークツリー一覧を表示
git worktree list
/path/to/myproject aaaa111 [feature/new-dashboard]
/path/to/myproject/.git/worktrees/hotfix/login-validation bbbb222 [hotfix/login-validation]
メインの作業ディレクトリと、新しく作成したバグ修正用のディレクトリが、それぞれどのブランチを指しているかが一目でわかります。
git stash はもう必要ありません。機能開発は myproject ディレクトリで続けつつ、バグ修正が必要なときは、ターミナルで cd .git/worktrees/hotfix/login-validation と移動するだけで、完全に独立した環境で作業を開始できます。
作業が終わったら git worktree remove コマンドで後片付けも可能です。
git worktree は非常に強力ですが、この素のコマンドには、日常的に使うには少し面倒な「つらみ」が存在します。
2. 素の git worktree が抱える「3つのつらみ」
git worktreeは革命的ですが、そのまま使うといくつかの面倒な点に気づきます。多くの開発者が直面するであろう「3つのつらみ」を見ていきましょう。
3. 救世主 wtp 登場!
前述の「3つのつらみ」をすべて解決し、git worktree の真の力を解放してくれるのが wtp です。
wtpは、git worktreeを強力にラップするCLIツールです。セットアップの自動化、コマンドの簡略化、そしてワークフローの標準化によって、git worktreeの体験を劇的に向上させます。
3-1. インストール
Homebrewを使っているなら、インストールは一瞬です。
brew install satococoa/tap/wtp
その他のインストール方法は、公式のGitHubリポジトリで確認できます。
3-2. 設定ファイル (.wtp.yml) の準備
wtpの真価は、シンプルなYAML設定ファイルにあります。まず、プロジェクトのルートで以下のコマンドを実行し、設定ファイルの雛形を生成しましょう。
wtp init
次に、生成された .wtp.yml をNode.jsプロジェクト向けに編集します。
version: "1.0"
defaults:
# ワークツリーが作成されるベースディレクトリ
base_dir: ".git/worktrees"
hooks:
post_create:
# gitignoreされているファイルもメインのワークツリーからコピーできる
- type: copy
from: ".env" # コピー元はメインワークツリーからの相対パス
to: ".env" # コピー先は新しいワークツリーからの相対パス
# 新しいワークツリー内でコマンドを自動実行
- type: command
command: "npm install"
この設定の核心は post_create フックです。これにより、ワークツリー作成直後にコピー元の .env がコピー先に .env としてコピーされ、npm install が自動で実行されます。これで「環境構築が手作業」という最大のつらみが解消され、ゼロセットアップな開発体験が実現します。
さらに素晴らしいことに、feature/authのようなスラッシュを含むブランチ名を使うと、wtpは自動的に.git/worktrees/feature/authのようにサブディレクトリを作成してくれ、ワークツリーが自然と整理されます。
3-3. 驚くほど簡単なワークツリー作成 (wtp add)
wtpを使えば、ワークツリーの作成は驚くほどシンプルになります。
# 'hotfix/urgent-bug' というブランチを新たに作り、ワークツリーを作成
wtp add -b hotfix/urgent-bug
もうパスとブランチ名を冗長に記述する必要はありません。さらに重要なのは、コマンド完了時にはnpm install も .env ファイルの準備も完了しており、即座にコーディングを開始できる点です。
3-4. ワークツリー間の移動 (wtp cd)
ワークツリー間の移動も、もう面倒なパス入力は不要です。wtpには強力なナビゲーション機能が備わっています(タブ補完もサポート!)。
# 作成したワークツリーに一瞬で移動
wtp cd hotfix/urgent-bug
# メインのワークツリーに戻る
wtp cd @
3-5. ワークツリーの削除 (wtp remove)
後片付けも wtp ならワンコマンドです。
# ワークツリーとブランチを一度に削除
wtp remove --with-branch hotfix/urgent-bug
このコマンドは、ワークツリーのディレクトリと、それに関連付けられたGitブランチの両方を アトミック(一度に) 削除します。これにより、「後片付けが二度手間」問題は完全に解決され、リポジトリを常にクリーンな状態に保てます。
4. 発展編:AIコーディングアシスタントとのタッグ
git worktree + wtp のワークフローは、Claude CodeやCursorのようなAIコーディングアシスタントと組み合わせることで、その真価を最大限に発揮します。
AIアシスタントを使いこなす上での最大の課題は 「コンテキストの維持」 です。単一のディレクトリでブランチを切り替えると、AIはファイルの状態変化に混乱し、開発者はタスクの内容を何度も再説明する羽目になります。
git worktree + wtp のパラダイムは、この問題を完璧に解決します。各ワークツリーは完全に独立した環境を提供するため、以下のようなワークフローが実現できます。
まとめ
git worktreeによる物理的な環境分離と、wtpによる運用の自動化。この2つを組み合わせることで、これまで難しかったシームレスで高生産性な並行開発ワークフローが手に入ります。
- コンテキストスイッチの摩擦をゼロに
- フックによる自動化で、いつでも準備万端な「ゼロセットアップ環境」
- アトミックな後片付けで、クリーンなリポジトリ管理
日々の細かなコンテキストスイッチで失われている時間は、一体どれくらいあるでしょうか? wtpを試して、その時間を取り戻してみませんか?✌️
Discussion