mcpField
W
worktree

worktree

github.com/jimweller開発45 回インストール
リポジトリ

worktree について

worktreeは、ブランチを並行して開発するためのGit worktree管理スキルです。作成、一覧表示、リベース、マージ、削除に対応し、操作前に安全条件を確認します。

主な機能

  1. 01新しいブランチ用のworktree作成
  2. 02Git worktreeの一覧表示
  3. 03ブランチをmainへマージ
  4. 04ブランチをmainへリベース
  5. 05マージ済みworktreeとブランチの削除
  6. 06変更前の安全条件チェック

活用シーン

  1. 01複数ブランチの並行開発
  2. 02機能ブランチを最新のmainへリベース
  3. 03worktreeのブランチをmainへマージ
  4. 04マージ済みworktreeの整理

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/jimweller/clanker-skills --skill worktree

インストール後、Claude Code で/worktreeを入力して読み込まれたか確認します。

詳細

STARTER_CHARACTER = 🎋

Git ワークツリー管理

ブランチを並行して開発するために、Git ワークツリーを管理します。ワークツリーは ~/.worktrees/<repo>/<branch> の下に配置されます。ブランチ名にスラッシュが含まれる場合、ディレクトリが入れ子になります(例:feature/foo は ~/.worktrees/<repo>/feature/foo になります)。

引数

ユーザーのメッセージから操作とブランチ名を抽出します。 第 1 引数は操作です。第 2 引数はブランチ名です(create、merge、rebase、remove では必須)。 操作が指定されていない場合は、list を既定値とします。

パスの特定

すべての操作では、dirname による計算ではなく、Git からパスを取得します。

PRIMARY=$(git worktree list --porcelain | awk '/^worktree / { print $2; exit }')
REPO_NAME=$(basename "$PRIMARY")
WORKTREE_DIR="$HOME/.worktrees/$REPO_NAME/<branch>"

PRIMARY は元のクローンです(git worktree list の最初の項目)。その他のワークツリーは ~/.worktrees/$REPO_NAME/ の下に配置されます。

操作

create

新しいブランチを作成し、~/.worktrees/<repo>/<branch> の下に新しいワークツリーを作成します。プライマリに .llmtmp/ が存在する場合はコピーします。tmux 内で実行している場合は、wt:<branch> という名前の新しい tmux ウィンドウを開きます。フォーカスは切り替わりません。

PRIMARY=$(git worktree list --porcelain | awk '/^worktree / { print $2; exit }')
REPO_NAME=$(basename "$PRIMARY")
WORKTREE_DIR="$HOME/.worktrees/$REPO_NAME/<branch>"

mkdir -p "$(dirname "$WORKTREE_DIR")"
git worktree add "$WORKTREE_DIR" -b <branch>

[ -d "$PRIMARY/.llmtmp" ] && cp -r "$PRIMARY/.llmtmp" "$WORKTREE_DIR/.llmtmp"

[ -n "$TMUX" ] && tmux new-window -d -n "wt:<branch>" -c "$WORKTREE_DIR"

作成後、ワークツリーのパスと、作成された場合は tmux ウィンドウ番号を報告します。

list

すべてのワークツリーを表示します。

git worktree list
merge

現在のワークツリーのブランチを main にマージします。フィーチャーワークツリーから実行してください。

事前確認:現在のブランチが main ではないことを確認します。main の場合は拒否します。

PRIMARY=$(git worktree list --porcelain | awk '/^worktree / { print $2; exit }')
BRANCH=$(git rev-parse --abbrev-ref HEAD)

git -C "$PRIMARY" fetch origin && git -C "$PRIMARY" pull
git -C "$PRIMARY" merge "$BRANCH"
git -C "$PRIMARY" push origin main

競合がある場合は、プッシュする前にユーザーによる解決を支援します。

rebase

ブランチを最新の main にリベースします。ブランチのワークツリー内から実行する必要があります。

事前確認:現在のブランチが <branch> と一致することを確認します。一致しない場合は拒否し、正しいワークツリーに切り替えるようユーザーに指示します。

git fetch origin
git rebase origin/main

競合がある場合は、ユーザーによる解決を支援します。リベースが正常に完了した後、ブランチが以前にプッシュされていた場合は強制プッシュが必要です(安全ルールに従い、明示的な許可がある場合に限ります)。

remove

ワークツリーを削除し、そのブランチを削除します。プライマリワークツリーから実行する必要があります。

事前確認:

  1. 現在のディレクトリがプライマリワークツリーであることを確認します(git rev-parse --show-toplevel の結果が $PRIMARY と一致すること)。一致しない場合は拒否します。
  2. git branch --merged を使って、そのブランチが main にマージ済みであることを確認します。未マージの場合は拒否し、先にマージするようユーザーに指示します。
PRIMARY=$(git worktree list --porcelain | awk '/^worktree / { print $2; exit }')
REPO_NAME=$(basename "$PRIMARY")
WORKTREE_DIR="$HOME/.worktrees/$REPO_NAME/<branch>"

git worktree remove "$WORKTREE_DIR"
git branch -d <branch>

PARENT="$(dirname "$WORKTREE_DIR")"
while [ "$PARENT" != "$HOME/.worktrees" ] && rmdir "$PARENT" 2>/dev/null; do
  PARENT="$(dirname "$PARENT")"
done

git branch -d が "not fully merged" で失敗した場合は、処理を中止し、先にマージするようユーザーに伝えます。git branch -D は絶対に使用しません。

rmdir のループは、スラッシュを含むブランチ名によって残された空の親ディレクトリをクリーンアップし、ブランチが残っていない場合はリポジトリごとのディレクトリを削除します。

安全ルール

  • ローカルでのみマージします。プルリクエストは作成しないでください。
  • remove の実行時にワークツリーにステージされていない変更やコミットされていない作業がある場合は、マージまたは強制削除についてユーザーに確認してください。
  • ワークツリーのブランチを手動で削除しないでください。git worktree remove のみを使用してください。
  • ワークツリーのディレクトリを手動で削除しないでください。必ず git worktree remove を使用してください。
  • ユーザーの明示的な許可なく強制プッシュしないでください。
  • パスは git worktree list --porcelain から取得します。パスをハードコードしないでください。

コメント