はじめに
開発中にふと気づいたら、大量の task branch が誤った親ブランチから派生していたという経験はないでしょうか。
今回はその問題を解決するために Claude Code の Skill 機能 を活用し、安全な branch 救済フローを半自動化しました。 Skill の作成から実際のグローバル配置まで、一連の流れをまとめます。
今回の問題
発生した状況
プロジェクトでは以下のような branch 構成を意図していました。
main
└ dev/enhancements-2026-04-clean ← 正しい親
├ task-branch-A
├ task-branch-B
└ task-branch-Cしかし実際には、task branch が別の feature branch から派生してしまっていました。
develop
└ feature/enhancements-2026-04 ← 誤った親
├ task-branch-A
├ task-branch-B
└ task-branch-CPR base を変更したら大変なことに

PR の base branch を feature/enhancements-2026-04 から dev/enhancements-2026-04-clean へ変更したところ、
feature/enhancements-2026-04にしか存在しない大量のコミットが不要な差分として PR に出現する
という問題が発生しました。
task branch 本来の変更内容は数コミット程度なのに、PR を見ると無関係な変更が何十件も並んでいる状態です。
解決の方針
- 元の branch・PR には一切触れない(履歴保全・PR 保全)
- 正しい親から新しい clean branch を作成する
- task 独自コミットのみを移植する
この作業を毎回手動でやるのは煩雑で、ミスも起きやすい。しかも対象 branch が大量にある。
そこで Claude Code Skill として自動化することにしました。
Claude Code Skill とは
Claude Code には Skill という拡張機能があります。
簡単にいうと一連の流れや機能をskillとして登録しておくことで何度も同じ指示を送らずに作業を簡略かし、効率的に勧められます。
SKILL.md というファイルに「このスキルが何をするか」「いつ使うか」「どう実行するか」を記述しておくと、Claude がそれを読み込み、ユーザーの指示に応じて自律的に実行してくれます。
スキルの構成はシンプルです。
skill-name/
├── SKILL.md # 必須。YAML frontmatter + 手順を記述
├── README.md # 任意。使用ガイド
└── references/ # 任意。詳細リファレンス
└── edge-cases.mdSKILL.md の frontmatter には以下を記述します。
description がトリガー条件になるため、どのような言葉で呼び出すかを具体的に書くことが重要です。
Skill の設計
移植方式の選定
branch 救済には複数の方法が考えられます。
| 方法 | 問題点 |
|---|---|
git merge | merge commit が混入する |
git rebase | 元 branch の履歴を変更するリスクがある |
git format-patch + git am | patch 適用で予期しない差分が生じる可能性 |
| ファイルコピー | commit history が失われる |
git cherry-pick | commit message・順序を保持しつつ安全に移植できる |
今回の要件は「commit message 保持」「commit 順序保持」「元 branch 非破壊」を同時に満たす必要があるため、git cherry-pick 一択としました。
Skill 内で明示的に禁止事項として定義することで、Claude が別の方法を選択しないように制約しています。
安全設計の原則
Skill の実装で特に重視したのが安全性です。
禁止事項(絶対):
- git merge / git rebase / git reset --hard
- force push
- 元ブランチの変更
- コンフリクトの自動解消コンフリクトが発生した場合は即座に停止し、手動対応を促すだけにとどめます。自動解消による誤った変更の消失が最も避けたいリスクだからです。
実行フロー設計
① 事前チェック(uncommitted changes、branch 存在確認など)
② 正しい親 branch を git pull --ff-only で最新化
③ <old-branch>-clean を新規作成
④ 移植対象コミットを抽出・一覧表示
⑤ 「続行しますか?」の確認
⑥ git cherry-pick を1件ずつ順番に実施
⑦ push
⑧ PR 再作成用テンプレートを出力ステップ⑤の確認プロンプトは、Cherry-pick 対象を必ずユーザーが目視してから実行する設計にしています。
Skill 作成
ファイル構成
.claude/skills/branch-rescue/
├── SKILL.md
├── README.md
└── references/
└── edge-cases.mdSKILL.md の要点
トリガー条件(frontmatter description)には、日本語・英語の両方を含めました。
description: This skill should be used when the user asks to
"rescue a branch", "migrate a task branch to the correct parent",
"fix wrong parent branch", "cherry-pick commits to clean branch",
"branch 救済", "親ブランチ誤り修正", or needs to transplant
task branch commits from a wrong parent to the correct parent branch.実装のポイントとして、各フェーズに「失敗時は停止・理由を説明する」というガードを明示的に記述しています。Claude に曖昧な裁量を与えず、問題発生時の行動を一意に定義することが重要です。
実際には以下のプロンプトでskill作成登録を一気に行いました
新しい Claude Code Skill を作成してください。
目的:
GitHub の誤った親ブランチから派生してしまった task branch を、
正しい親ブランチへ安全に移植する作業を半自動化したい。
背景:
現在以下のような Git 構造になっている。
誤った構造:
develop
└ feature/enhancements-2026-04
├ task-branch-A
├ task-branch-B
└ task-branch-C
main
└ dev/enhancements-2026-04-clean
本来は task branch は
dev/enhancements-2026-04-clean
から派生すべきだった。
しかし既に大量の task branch と PR が存在する。
task branch の PR base を
feature/enhancements-2026-04
から
dev/enhancements-2026-04-clean
へ変更した結果、
feature/enhancements-2026-04 に存在し、
dev/enhancements-2026-04-clean に存在しない
不要な差分コミットが大量に PR に表示されている。
目的:
各 task branch の
「task 独自コミットのみ」
を安全に救済したい。
前提:
* task branch には対象タスクのコミットのみ存在する
* 他タスクコミット混在はない
* squash merge は使用していない
* 元 branch は既存 PR のため保持する
* clean branch を新規作成して救済する
---
## 1. 安全第一
以下は禁止:
* merge
* rebase
* force push
* reset
* reset --hard
* interactive rebase
* 元 branch の更新
* destructive operation
* git format-patch
* git am
* file copy による移植
* 手動差分適用
* reset を利用した履歴改変
必ず:
* 元 branch を変更しない
* 新 branch を作成して対応する
* commit message を保持
* commit 順序を保持
* squash 禁止
* conflict 時は停止
* commit 履歴を壊さない
* merge commit を作らない
重要:
本 Skill の branch 救済ロジックは
必ず git cherry-pick を使用して実装すること。
commit 移植方式は
git cherry-pick を唯一の正式実装方法とする。
禁止:
* git merge
* git rebase
* git format-patch
* git am
* file copy による移植
* patch 適用
* 手動差分適用
* reset による履歴改変
理由:
今回の要件は
「task branch 独自コミットのみ」
を保持しつつ、
* commit message 保持
* commit 順序保持
* 元 branch 非破壊
* PR 履歴維持
を満たす必要があるため。
---
## 2. 入力
入力値:
* old task branch 名
例:
task-branch-A
* correct parent branch 名
例:
dev/enhancements-2026-04-clean
* dry-run option(任意)
例:
--dry-run
* batch mode(任意)
例:
task-branch-A
task-branch-B
task-branch-C
---
## 3. 実施フロー
### ① 作業前チェック
以下を確認:
* Git repository 配下であること
* uncommitted changes がないこと
* branch が存在すること
* remote branch が存在すること
* detached HEAD ではないこと
問題がある場合は停止。
使用コマンド:
```bash
git rev-parse --is-inside-work-tree
git status --porcelain
git branch -a
git symbolic-ref --quiet HEAD
git ls-remote --heads origin <old-branch>
git ls-remote --heads origin <correct-parent>
```
エラー時:
理由を説明して停止。
---
### ② 正しい親ブランチ最新化
merge commit を絶対に作らないこと。
使用:
```bash
git fetch origin
git checkout <correct-parent>
git pull --ff-only origin <correct-parent>
```
必須:
* `--ff-only` を使用
* merge commit 作成禁止
---
### ③ clean branch 作成
命名:
```text
<old-branch>-clean
```
例:
```text
task-branch-A-clean
```
作成前に存在チェック:
```bash
git branch --list <new-clean-branch>
git branch -r --list origin/<new-clean-branch>
```
存在時:
停止。
例:
```text
ERROR:
Branch already exists:
task-branch-A-clean
```
作成:
```bash
git checkout -b <new-clean-branch>
```
---
### ④ old branch 独自コミット抽出
前提:
task branch には
対象 task のコミットのみ存在する。
merge commit を除外。
古い順(時系列順)で取得。
使用:
```bash
git log \
--reverse \
--no-merges \
--pretty=format:"%H|%s" \
<correct-parent>..<old-branch>
```
0件なら停止。
例:
```text
ERROR:
No commits found to migrate.
```
---
### ⑤ cherry-pick 候補表示
実行前に必ず一覧表示。
例:
```text
以下のコミットを移植します:
1.
abc1234
fix: validation 修正
2.
def5678
feat: modal 追加
3.
ghi9012
fix: API response 修正
```
---
### ⑥ 実行前確認
必ず確認:
```text
続行しますか? (yes/no)
```
yes の場合のみ続行。
no の場合:
停止。
---
### ⑦ cherry-pick 実施
必ず
git cherry-pick を使用。
古い順で
1件ずつ順番に実施。
使用:
```bash
git cherry-pick <commit>
```
必須:
* commit message 保持
* squash 禁止
* 順序変更禁止
* merge commit 禁止
成功例:
```text
✓ cherry-picked abc1234
✓ cherry-picked def5678
✓ cherry-picked ghi9012
```
---
### ⑧ conflict 時
自動継続禁止。
停止して以下を表示:
* conflict 発生 commit
* 原因説明
* 解決コマンド
表示例:
```text
CONFLICT DETECTED
commit:
abc1234
以下を実施してください:
```
```bash
git status
git add .
git cherry-pick --continue
```
または:
```bash
git cherry-pick --abort
```
禁止:
* 自動 continue
* 自動 abort
* 自動解決
---
### ⑨ push
成功時のみ実施。
使用:
```bash
git push origin <new-clean-branch>
```
成功例:
```text
✓ pushed:
origin/task-branch-A-clean
```
---
### ⑩ PR 作成用テンプレート生成
テンプレ:
```text
親ブランチ誤りにより PR を再作成しました。
旧PR:
<URL>
変更内容自体は同一で、
正しい親ブランチ
dev/enhancements-2026-04-clean
へ付け替えたものです。
```
---
## 4. Dry Run モード
Dry Run:
実行予定コマンドのみ表示。
repository state を変更しない。
禁止:
* branch 作成
* cherry-pick
* push
* checkout
* repository state 変更
例:
```text
Will execute:
git fetch origin
git checkout dev/enhancements-2026-04-clean
git pull --ff-only origin dev/enhancements-2026-04-clean
git checkout -b task-branch-A-clean
git cherry-pick abc123
git cherry-pick def456
git push origin task-branch-A-clean
```
---
## 5. Batch Mode
複数 branch 対応。
例:
task-branch-A
task-branch-B
task-branch-C
要件:
* branch ごとに独立実行
* 途中失敗しても次 branch 続行
* conflict branch はスキップ
* 成功 branch のみ push
* 最後に結果レポート表示
---
## 6. 最終結果レポート
最後に出力:
```text
SUCCESS
- task-branch-A-clean
- task-branch-B-clean
CONFLICT
- task-branch-C
PUSHED
- task-branch-A-clean
- task-branch-B-clean
MANUAL ACTION REQUIRED
- task-branch-C
```
---
## 7. Skill 作成フェーズ制約
重要:
以下は
「Skill 作成フェーズ」にのみ適用する。
Skill 実装中は、
実リポジトリを変更する Git 操作を実行しないこと。
禁止(Skill 作成フェーズのみ):
```text
git checkout
git pull
git cherry-pick
git push
git branch 作成
git commit
git merge
git rebase
git reset
その他 repository state を変更する操作
```
許可(read-only):
```text
git status
git branch
git branch -a
git log
git show
git diff
git rev-parse
git remote
git fetch --dry-run
```
重要:
git cherry-pick の禁止は
「Skill 作成フェーズのみ」。
Skill 実行時には、
抽出した commit を
git cherry-pick により
古い順で順番に移植すること。
Skill 作成フェーズ:
Git変更禁止
Skill 実行フェーズ:
Git操作許可
許可:
* checkout
* pull --ff-only
* cherry-pick
* push
---
## 8. 必須出力
Skill 作成後、
以下を必ず出力してください。
1. Skill のディレクトリ構成
2. 実装コード全文
3. 実行例
4. Dry Run 実行例
5. Batch 実行例
重要:
Skill の実装のみ行い、
実際の branch 救済処理は
ユーザーが Skill を実行した時のみ動作させること。3つの実行モード
単発モード
/branch-rescue <移植元ブランチ> <正しい親ブランチ>/branch-rescue task-branch-A dev/enhancements-2026-04-cleanDry Run モード
/branch-rescue task-branch-A dev/enhancements-2026-04-clean --dry-run実行予定のコマンドを表示するだけで、repository は一切変更しません。 初回や不安な場合はまずこちらで確認することを推奨しています。
Batch モード
/branch-rescue --batch dev/enhancements-2026-04-clean
task-branch-A
task-branch-B
task-branch-C複数 branch を一括処理します。コンフリクトが発生した branch はスキップして次に進み、最後に結果レポートを表示します。
===== Branch Rescue Report =====
SUCCESS
✓ task-branch-A-clean (3 commits)
✓ task-branch-B-clean (2 commits)
CONFLICT (手動対応が必要)
✗ task-branch-C
PUSHED
✓ origin/task-branch-A-clean
✓ origin/task-branch-B-clean
================================グローバル配置にした経緯
Skill ファイルをプロジェクト内に置くと消える問題
この Skill は feature/branch-rescue-skill という専用ブランチで作成しており、プロジェクトの main ブランチにはマージしていません。
最初はプロジェクト直下の .claude/skills/ に配置していました。
<project>/.claude/skills/branch-rescue/SKILL.mdしかしここに致命的な問題があります。
この Skill の実行フローには git checkout による branch 切り替えが含まれています。
① 現在のブランチ(feature/branch-rescue-skill)
↓ Skill が git checkout を実行
② dev/enhancements-2026-04-clean へ切り替わる
↓
③ SKILL.md が存在しない branch になる
↓
④ Skill ファイルが消える(git 管理下のため)feature/branch-rescue-skill ブランチにしか存在しない SKILL.md は、他のブランチに切り替えた瞬間に working tree から消えてしまいます。プロジェクト内の .claude/skills/ は git 管理下にあるため、この問題を避けられません。
~/.claude/skills/ は git 管理外
~/.claude/skills/ はホームディレクトリ直下にあり、どの git repository にも属していません。
そのためブランチ切り替えの影響を受けず、Skill の実行中を通じて常に SKILL.md が読み込める状態を保てます。
feature/branch-rescue-skill ─→ dev/enhancements-2026-04-clean
branch 切り替えが発生しても...
~/.claude/skills/branch-rescue/SKILL.md
← git 管理外なので常に存在する ✓これがグローバルへ配置した主な理由です。

配置場所の比較
| 配置場所 | git 管理 | branch 切り替えの影響 | スコープ |
|---|---|---|---|
<project>/.claude/skills/ | あり | 受ける(ファイルが消える) | プロジェクト内のみ |
~/.claude/skills/ | なし | 受けない | 全プロジェクト共通 |
branch 操作を伴う Skill は ~/.claude/skills/ へのグローバル配置が必須と言えます。
使用の流れ
新しいセッションを開始
Skill はセッション開始時に読み込まれます。そのため、Skill を追加した後は新しいセッションで開く必要があります。
セッション開始後、system が利用可能な Skill として branch-rescue を認識していれば準備完了です。
実行前の状態確認
git status # クリーンな状態であることuncommitted changes があると Skill が停止するため、事前に確認しておくと安心です。
実行コマンド例
/branch-rescue fix/enhancements-2026-04-DX2022-4942-S0502 dev/enhancements-2026-04-cleanまたは自然言語でも呼び出せます。
fix/enhancements-2026-04-DX2022-4942-S0502 を dev/enhancements-2026-04-clean へ救済して実行時の確認プロンプト
Skill は cherry-pick 前に必ず移植対象コミットを表示し、確認を求めます。
以下のコミットを移植します:
1. abc1234 | fix: S0502 validation 修正
2. def5678 | feat: S0502 modal 追加
合計: 2 commits
old branch: fix/enhancements-2026-04-DX2022-4942-S0502
correct parent: dev/enhancements-2026-04-clean
new branch: fix/enhancements-2026-04-DX2022-4942-S0502-clean
続行しますか? (yes/no):yes を入力すると cherry-pick が開始されます。
完了後
fix/enhancements-2026-04-DX2022-4942-S0502-cleanが作成され push されます- PR 再作成用のテンプレート文章が出力されます
親ブランチ誤りにより PR を再作成しました。
旧PR: https://github.com/.../pull/XXXX
変更内容自体は同一で、正しい親ブランチ
dev/enhancements-2026-04-clean
へ付け替えたものです。Skill 作成で得た知見
Claude Code Skill を書く際のコツ
1. 禁止事項を明示する
「何をするか」だけでなく「何をしてはいけないか」を明示的に書くことで、Claude が予期しない方法を選択するのを防げます。
2. 失敗時の挙動を定義する
「エラーが発生した場合は停止して理由を説明する」というパターンを各ステップに含めることで、壊れた状態で処理が続くことを防ぎます。
3. 確認ステップを挟む
破壊的操作の前には必ず確認プロンプトを入れます。自動化と安全性のバランスが重要です。
4. Dry Run モードを用意する
初めて使うときや不安なときに、変更なしで実行内容を確認できる Dry Run モードは非常に有効です。
Skill とプロジェクト専用スクリプトの違い
bash スクリプトで同じことをすることも考えましたが、Skill には以下のメリットがあります。
- 自然言語でのトリガー:コマンド名を覚えなくても「rescue」「救済」などで呼び出せる
- 柔軟な解釈:引数の順序が違っても Claude が意図を汲んで実行できる
- コンテキスト保持:会話の文脈に応じて適切に判断できる
一方、ビット単位で確実な実行が求められる場合はスクリプトの方が向いています。用途に合わせて使い分けるのがベストです。
まとめ
| 項目 | 内容 |
|---|---|
| 問題 | 誤った親ブランチから派生した大量の task branch |
| 解決方針 | git cherry-pick による安全なコミット移植 |
| 実装 | Claude Code Skill branch-rescue |
| 配置 | ~/.claude/skills/ によるグローバル利用 |
| モード | 単発 / Dry Run / Batch の3種類 |
Skill を一度作っておくと、同じような問題が別のプロジェクトで発生したときにも再利用できます。
またこのSkillで通常30分〜1時間かかる作業が5分で終わるようになりました。
やはりこの機能便利だなぁと思います。のでぜひ他のタスクにもSkillを取り入れてみてください。
ここまで読んでいただき、ありがとうございます。もしこの記事の技術や考え方に少しでも興味を持っていただけたら、ネクストのエンジニアと気軽に話してみませんか。
- 選考ではありません
- 履歴書不要
- 技術の話が中心
- 所要時間30分程度
- オンラインOK