git worktreeをもっと便利に使うCLIツール `wtp` を作った
Claude Code で並行で複数の作業をすることが日常になってきており、 git worktree
が欠かせない最近です。
git worktree は便利なのですが、毎日何度も worktree
を作ったり消したりしているうちに以下が気になってきました。
- worktree add のコマンドがやや冗長で面倒
- ブランチ名を基に worktree を作る場合、ブランチ名を2度打つことになる
- 既存ブランチの場合: git worktree add .worktrees/hoge hoge
- 新規ブランチの場合: git worktree add -b hoge .worktrees/hoge
- ブランチ名を基に worktree を作る場合、ブランチ名を2度打つことになる
- 作成後に .env のコピーや npm install
をほぼ毎回手動でやるので自動的にやってほしい- Claude Code も必要なときにやってくれますが、ほぼ毎回必要なら AI
に任せない方が早い
- Claude Code も必要なときにやってくれますが、ほぼ毎回必要なら AI
- 作業完了後 worktree とブランチを別々に削除するのが面倒
簡単なシェルスクリプトでも要求は満たせそうですが、せっかくなのでちゃんと CLI
ツールとして作ろうと思って Claude Code と一緒に作ってみました。
主な機能
wtp add
git
worktreeだとパスとブランチ名を両方指定する必要がありますが、wtpはブランチ名だけでOKです。
# 新規ブランチと同時にworktree作成
wtp add -b feature/new-auth
# PRをレビュー (remote にあるブランチ)
wtp add fix/hogefuga
worktreeのパスは.wtp.yml
の設定に従って自動生成されます(デフォルトは../worktrees
)。リモートブランチの追跡も自動です。
post create hook
.wtp.yml
に post_create
を定義しておけば、worktree作成後に自動実行してくれます。
hooks:
post_create:
- type: copy
from: .env.example
to: .env
- type: command
command: "npm install"
.env のコピーや依存関係のインストールなど、いつもやることを自動化できます。
remove --with-branch
worktree
とブランチを別々に削除するのは面倒なので、まとめて削除できるようにしました。
# 通常のgit worktreeの場合
git worktree remove feature/done
git branch -d feature/done
wtpなら1コマンドで両方削除できます。
wtp remove feature/done --with-branch
マージされていないブランチは警告が出ます。
使用例
開発中に緊急修正が入った場合
# 作業中のfeatureはそのまま残して新しいworktreeを作成
wtp add -b hotfix/urgent-bug
# バグを修正してPRを出す
# ...
# 修正が完了したらworktreeとブランチをまとめて削除
wtp remove hotfix/urgent-bug --with-branch
# 元の作業に戻る
wtp cd feature/new-auth
PR レビュー
# レビュー依頼が来たら(リモートブランチが存在する場合)
wtp add feature/pr-123
# 実際にアプリケーションを動かしてレビュー
# ...
# レビューが終わったらworktreeを削除(リモートブランチは残る)
wtp remove feature/pr-123
その他の機能
wtp list
worktree一覧を見やすく表示。
% wtp list
PATH BRANCH STATUS HEAD
---- ------ ------ ----
@ main managed 99c30171
feature/add-auth feature/add-auth managed 99c30171
fix/123/hogefuga* fix/123/hogefuga managed 99c30171
wtp cd
シェル統合でタブ補完付きの worktree 移動。
# worktreeに移動
wtp cd feature/auth
# メインworktreeに戻る
wtp cd @
# タブ補完も使える
wtp cd <TAB>
設定ファイル(.wtp.yml)
プロジェクトごとに設定を定義できます。wtp init
で初期設定ファイルを生成:
wtp init
設定ファイルの全体像:
version: "1.0"
defaults:
base_dir: "../worktrees" # worktreeの作成場所
hooks:
post_create:
# ファイルコピー
- type: copy
from: ".env.example"
to: ".env"
# コマンド実行(環境変数も設定可能)
- type: command
command: "bundle install"
env:
RAILS_ENV: "development"
インストール
Homebrew
brew install satococoa/tap/wtp
Go install
go install github.com/satococoa/wtp/cmd/wtp@latest
シェル統合
Homebrew でインストールした場合:
- zsh:
補完ファイルが自動的に配置されます。FPATHが正しく設定されていれば追加設定は不要です - bash/fish:
補完ファイルは配置されますが、詳細な設定は各シェルのドキュメントを参照してください
手動でシェル統合を設定する場合(go install等でインストールした場合):
# zsh: ~/.zshrcに追加
eval "$(wtp completion zsh)"
# bash: ~/.bashrcに追加
eval "$(wtp completion bash)"
# fish: ~/.config/fish/config.fishに追加
wtp completion fish | source
なぜ Go を選んだか
言語選択も Claude Code と相談して決めました。Go を選んだ理由:
- シングルバイナリで配布できる (brew や go install で簡単にインストール)
- クロスプラットフォーム対応が容易
- 静的型付けでAIが書くコードの品質が安定しやすい
実際に開発してみて、 Go は Agentic Coding に向いていると感じました。
静的型付けですし、標準で fmt も lint
もついているので設定もあまり必要ないですし、golangci-lint, GoReleaser
を入れるだけで CI/CD もいい感じになりました。
まとめ
git worktree の面倒な部分を解消するツールを作りました。
同じような不満を持っている人がいれば使ってみてください。
GitHub: https://github.com/satococoa/wtp
Discussion