🌳

git worktree が便利だし Claude Code と相性が良い話

に公開

はじめに

開発中に別のブランチで作業したいが、現在の作業中の状態をstashするのが面倒だったり、レビューのためにブランチを切り替えるとコンテキストが失われるといった問題に遭遇することがある。

git worktree を使用することで、これらの問題を解決できます。結構前からある機能のわりに自分は使ってなかったのですが、 Claude Code との組み合わせの相性が良いため、自分の開発フローに取り入れることにしました。

従来の開発フローの問題点

通常のgit開発では、ブランチを切り替える度に以下の手順が必要でした:

  1. 作業中のファイルをstashまたはcommit
  2. ブランチを切り替え
  3. 別作業を完了させる
  4. 元のブランチに切り替え
  5. stashを復元

単純に面倒なところもありますし、場合によっては、dependenciesまわりが変わって build cache周りを削除しないといけないこともあります。

git worktreeが解決してくれること

git worktree を使えば次のようなことが可能になります。

  • 複数のブランチを同時に異なるディレクトリで作業可能
  • 作業中の差分をstashやcommitの必要なし
  • Claude Codeで複数プロジェクトを同時に開ける
  • レビュー用のブランチを一時的に簡単に作れる

複数の場所で git clone すれば良いと思う人もいるかもですが、 worktree を使った方が追加削除の運用がしやすいです。

git worktreeのコマンド

まず、git worktreeの基本的なコマンドを確認しましょう。

基本的なコマンド

# 既存のブランチからworktreeを作成
git worktree add <path> <branch-name>

# worktreeを削除(ディレクトリも削除される)
git worktree remove <path>

# worktreeの一覧を表示
git worktree list
# 1. 現在のプロジェクトでworktreeを作成
cd ~/my-project
git worktree add ../my-project-feature feature/new-feature

# 2. 作成したworktreeに移動して作業
cd ../my-project-feature
# ここで通常通りコーディング、コミット

# 3. 作業完了後、worktreeを削除
cd ~/my-project
git worktree remove ../my-project-feature

便利にしたやつ

基本コマンドだけだと少し使い勝手が悪いので、 Claude Code で便利コマンドを作ってもらって、 .zshrc に下記を追加しています。

## Git Worktree便利コマンド
## required: peco
## required: git

# Git worktree add - ブランチ名だけで新しいworktreeを追加
wta() {
  if [ $# -eq 0 ]; then
    echo "Usage: wta <branch-name>"
    return 1
  fi
  
  local branch_name="$1"
  local worktree_dir="$HOME/.worktrees/$branch_name"
  
  # worktreesディレクトリが存在しない場合は作成
  mkdir -p "$HOME/.worktrees"
  
  # worktreeを追加
  git worktree add "$worktree_dir" "$branch_name"
}

# Git worktree remove - pecoで選択してworktreeを削除
wtr() {
  local selected_worktree
  selected_worktree=$(git worktree list | grep -v "(bare)" | tail -n +2 | peco --prompt="Remove worktree> ")
  
  if [ -n "$selected_worktree" ]; then
    local worktree_path=$(echo "$selected_worktree" | awk '{print $1}')
    echo "Removing worktree: $worktree_path"
    git worktree remove "$worktree_path"
  fi
}

# Git worktree cd - pecoで選択してworktreeにcd
wtc() {
  local selected_worktree
  selected_worktree=$(git worktree list | grep -v "(bare)" | peco --prompt="Change to worktree> ")
  
  if [ -n "$selected_worktree" ]; then
    local worktree_path=$(echo "$selected_worktree" | awk '{print $1}')
    cd "$worktree_path"
  fi
}

# Git worktree list - worktreeの一覧を見やすく表示
wtl() {
  echo "=== Git Worktrees ==="
  git worktree list
}

各コマンドの説明

  • wta <branch-name>: 指定したブランチのworktreeを ~/.worktrees/ 配下に作成
  • wtr: pecoで選択式でworktreeを削除
  • wtc: pecoで選択式でworktreeディレクトリに移動
  • wtl: 現在のworktree一覧を表示

peco(ペコ)は、コマンドラインで選択式のインターフェースを提供するツールです。
peco を使用することで、↑↓キーで選択してEnterで決定できるため、直感的で操作ミスが少なくなります

# worktree一覧から選んで移動
$ wtc
> Change to worktree> 
  /home/user/.worktrees/feature/new-component [feature/new-component]
  /home/user/.worktrees/fix/bug-123 [fix/bug-123] 
  /home/user/.worktrees/hotfix/urgent-fix [hotfix/urgent-fix]

こんな感じで使えます

① Claude Codeで複数作業したい場合

# 1. 新しいブランチを作成
git branch "feature/new-component"

# 2. worktreeを作成
wta feature/new-component

# 3. Claude Codeでそのディレクトリを開く
wtc  # pecoで選択
claude .

# 別のClaude Codeウィンドウで開く
# 4. 別の作業も同時に進めたい場合
git branch "fix/bug-123"
wta fix/bug-123
wtc  # pecoで選択
claude .

これにより、複数のClaude Codeセッションで異なるブランチの作業を同時に行えます

② 作業中だけどレビューしたい場合

# 1. fetch
git fetch origin

# 2. レビュー用worktreeを作成
wta origin/feature/pr-branch

# 3. レビュー用ディレクトリに移動
wtc  # pecoで選択

# 4. レビュー完了後、worktreeを削除
wtr  # pecoで選択して削除

レビューのために作業中のブランチに影響を与えることがありません

まとめ

git worktreeを使うことで:

複数ブランチでの同時作業が可能
stash使わずにいける
Claude Codeとの相性がよい
レビュー時のコンテキストスイッチが不要

git worktree + 便利なコマンド + Claude Code の組み合わせにより、便利です。

Discussion