🌲

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
  • 作成後に .env のコピーや npm install
    をほぼ毎回手動でやるので自動的にやってほしい
    • Claude Code も必要なときにやってくれますが、ほぼ毎回必要なら AI
      に任せない方が早い
  • 作業完了後 worktree とブランチを別々に削除するのが面倒

簡単なシェルスクリプトでも要求は満たせそうですが、せっかくなのでちゃんと CLI
ツールとして作ろうと思って Claude Code と一緒に作ってみました。

https://github.com/satococoa/wtp

主な機能

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