squash マージ済みのブランチ / worktree を安全に消す判定手順
用済みの作業ブランチや git worktree を、未取り込みの作業を失わずに消すための判定手順。squash マージは祖先関係を切るため git branch --merged / --contains / origin/main..HEAD はすべて「未マージ」と誤報する。さらにローカルの origin/main ref が古いと内容 diff でも答えを間違える。この2つの誤りを潰し、2点diffと3点diffの切り分け・同一題名コミットによる決定打・削除後の read-back まで含めて確定させる。AI エージェントに投げる際の注意(調査と削除を混ぜない)付き。
約7,700トークンの節約 (API料金換算で約12円分)。 要件定義・技術調査・試行錯誤ぶんのトークンがまるごと不要になります。※ 出品者申告とレビューに基づく推定値。モデル・タスク内容により変動します。
この巻物について
「squash マージ済みのブランチ / worktree を安全に消す判定手順」は、開発プロセスカテゴリのAI指示書(MDファイル)です。用済みの作業ブランチや git worktree を、未取り込みの作業を失わずに消すための判定手順。squash マージは祖先関係を切るため git branch --merged / --contains / origin/main..HEAD はすべて「未マージ」と誤報する。さらにローカルの origin/main ref が古いと内容 diff でも答えを間違える。この2つの誤りを潰し、2点diffと3点diffの切り分け・同一題名コミットによる決定打・削除後の read-back まで含めて確定させる。AI エージェントに投げる際の注意(調査と削除を混ぜない)付き。この巻物をAIに読み込ませると、ゼロから設計・調査する場合に比べて 約7,700トークン(API料金換算で約12円)・86%のトークンを節約できます。
- カテゴリ
- 開発プロセス
- 対応AI
- claude-code、cursor、codex-cli
- ライセンス
- 商用利用可 (再販不可)
- 価格
- 無料
- ゼロから開発時
- 約9,000トークン
- この巻物使用時
- 約1,300トークン
- 節約量
- 約7,700トークン (約12円)
- 更新日
- 2026-09-25
使い方 (AIに渡す3つの方法)
いちばん簡単なのはワンライナー。Claude Code のターミナルに貼るだけです。
claude "https://makimono-md.vercel.app/api/v1/files/squash-worktree/raw を読み込んで、この指示書どおりに実装して"
中身
squash マージ済みのブランチ / worktree を安全に消す判定手順
これは何の指示書か
「用済みの作業ブランチや git worktree を消したい。でも未取り込みの作業を失いたくない」 という場面で、SHA ベースの判定を使うと必ず誤る。その誤りの型を2つ潰し、内容ベースで 確定させるための手順。AI エージェントにそのまま読ませて実行させられる粒度で書いてある。
前提
- リポジトリは squash マージ(GitHub の "Squash and merge" 等)を使っている。
- 掃除したいのは、過去に作った作業ブランチと、それに紐づく
git worktree。
なぜ SHA 判定が壊れるのか(2つの独立した原因)
原因1: squash は祖先関係を切る。 squash マージは変更を新しい1コミットにまとめて main に載せる。元ブランチ先端の SHA は main の祖先に一度も現れない。したがって次はすべて「未マージ」と誤って報告する:
git branch --merged # 出てこない
git branch --contains <sha> # main を含まない
git log origin/main..HEAD # 着地済みなのに件数が残り続ける
原因2: ローカルの origin/main ref が古い。
origin/main はリモート追跡 ref であって、リモートの現在地ではない。git fetch するまで
数日前のコミットを指したままになる。内容 diff という正しい判定法を使っていても、比較対象が
古ければ答えは間違う。
この2つは重なる。実例として、ある作業ブランチを「未取り込み1件」と判定して残したが、 fetch して内容 diff を取り直したら差分ゼロ=完全に着地済み、と結論が反転した。
手順
1. まず fetch する(これを飛ばすと以降が全部無効)
git fetch origin main --prune
fetch のみ。pull / merge はしない(作業ツリーを動かさないため)。
fetch 後の位置を必ず出力して、古い ref で判定していないことを示す:
git log --oneline -1 origin/main
2. 対象ブランチが触ったファイルを確定する
git show --stat --oneline <branch-sha>
ここで出たファイル一覧が、以降の diff の対象。ファイルを絞るのが重要で、 リポジトリ全体を diff すると main 側の無関係な前進が混ざって読めなくなる。
3. 内容 diff で着地を判定する
git diff origin/main <branch-sha> -- <手順2のファイル群>
- 差分が空 → 内容は完全に取り込まれている。消して安全。
- 差分がある → まだ終わりではない。手順4へ。
4. 差分が出た時の切り分け(ここを飛ばすと消せるものを残す)
差分が出ても未着地とは限らない。merge-base 以降に main 側が独自に足した分が 逆向きの差分として出るため。2点 diff と3点 diff を見比べて切り分ける:
git diff origin/main <branch-sha> -- <files> # 2点: 今の main と ブランチ の差
git diff origin/main...<branch-sha> -- <files> # 3点: merge-base からブランチが足した差
判定の要点は 「ブランチ側が足した行が、今の main に在るか」 の一点。
- 2点 diff が 削除行だけ(
-のみで+が無い)→ それは「main にしか無い行」= main が後から足した分。ブランチの内容は欠けていない。着地済み。 - 2点 diff に 追加行がある(
+がある)→ ブランチ側にしか無い変更が残っている。未着地。消さない。
5. 決定打を1つ取る(推奨)
ブランチが新規追加したファイルを1つ選び、main 側の履歴を引く:
git log --oneline origin/main -- <そのブランチが新規追加したファイル>
squash 着地していれば、元ブランチのコミットと同一の題名を持つコミットが main 側に出る
(多くのホスティングは題名末尾に (#<PR番号>) を自動付与する)。これは祖先関係に依らない
直接証拠になる。
6. 消す前に「何を失うか」を列挙する
git -C <worktree> status --short
追跡外ファイル(??)が残っていることがある。中身を見てから消す:
head -20 <そのファイル>
git log --oneline --all -- <そのファイル> # 履歴に一度も無ければ使い捨て
一時的な指示書・生成ログなら破棄してよい。判断できないものが1つでもあれば消さない。
7. 削除を実行する
git worktree remove --force <worktree のパス> # 追跡外ファイルがあると --force が要る
git branch -D <ブランチ名>
--force が必要になるのは手順6で確認した追跡外ファイルがあるため。確認せずに --force を
付けない(それが手順6の存在理由)。
リモートブランチ(git push origin --delete)は残すのが既定。ローカルを消しても
リモートが在れば復元できる。外向き操作でもあるので、消すなら人の承認を取る。
8. 削除できたことを read-back で確かめる
コマンドの exit code を成功の証拠にしない。状態を読み戻す:
git worktree list # 対象が消えていること
ls -d <worktree のパス> # "No such file or directory" になること
git branch --list '<ブランチ名>' # 空行になること
AI エージェントに投げる時の注意
- 調査と削除を同じ指示で混ぜない。まず読み取り専用で判定させ、結論を受け取ってから 削除を別途実行する。判定を誤ったまま削除まで走られると取り返しがつかない。
- 「
origin/main..HEADが N 件だから未マージ」という結論が返ってきたら、それは根拠として 無効と指摘して手順1から取り直させる。エージェントは SHA ベースの判定に流れやすい。 - Windows 環境ではファイル比較が改行コードで化ける。
diff --strip-trailing-crを使う。
失敗の型(このどれかに当てはまったら手順を戻る)
| 症状 | 原因 | 戻る手順 |
|---|---|---|
| 着地済みなのに「未マージ」 | SHA 判定を使った / fetch していない | 1 |
| diff に差分が出て判断がつかない | 2点と3点を見比べていない | 4 |
| 消したら追跡外ファイルが消えた | 事前に中身を見ていない | 6 |
| 「消えたはず」が消えていない | exit code を証拠にした | 8 |
よくある質問
+「squash マージ済みのブランチ / worktree を安全に消す判定手順」とは何ですか?
用済みの作業ブランチや git worktree を、未取り込みの作業を失わずに消すための判定手順。squash マージは祖先関係を切るため git branch --merged / --contains / origin/main..HEAD はすべて「未マージ」と誤報する。さらにローカルの origin/main ref が古いと内容 diff でも答えを間違える。この2つの誤りを潰し、2点diffと3点diffの切り分け・同一題名コミットによる決定打・削除後の read-back まで含めて確定させる。AI エージェントに投げる際の注意(調査と削除を混ぜない)付き。
+どれくらいトークン(費用)を節約できますか?
ゼロから開発すると約9,000トークンかかりますが、この巻物を使えば約1,300トークンで済みます。差し引き約7,700トークン(API料金換算で約12円)・86%の節約です。
+どうやって使いますか?
無料です。MDファイルを Claude Code などのAIに読み込ませるだけ。ワンライナーをターミナルに貼れば実装が始まります。要件定義や技術調査を省いて実装だけにトークンを使えます。
+どのAIツールに対応していますか?
claude-code、cursor、codex-cli に対応しています。
+商用利用できますか?
ライセンスは「商用利用可 (再販不可)」です。
🤝 自分でAIを動かすのは、まだ不安…という方へ
この巻物の内容を、AIを使うプロに丸ごと任せることもできます。姉妹サービスAI代行堂なら「LINEで頼むだけで、仕事が完成」。
関連する巻物
スマホ(Remote Control)から即相談できる Claude Code タブを VS Code に毎朝自動で用意する
自作VS Code拡張で公式Claude Codeのコマンド(editor.openLast/newConversation/renameSessionTab)を叩き、名前付きタブをN本自動補充。夜間はWM_CLOSE→再起動で毎朝揃える。--bg/ターミナル経路・タブ0でのnewConversation・SendKeys再読み込みが失敗する実測付き
夜間ジョブ異常を通知で終わらせず自動修復→AI修理PR→人へ引き渡す閉ループ
監視の『検知して通知』の後段に、決定的Playbook→AIコーダーの隔離worktree修理PR→持ち越し→人への3要素引き渡し、を足す実装指示書。argvで指示を渡すな等の実測の落とし穴つき
ドキュメント駆動開発プロセス CLAUDE.md — 作るものを固めてから書かせる
「AIが暴走して意図と違うものを作る」を根絶する開発プロセス指示書。UI仕様→機能設計→実装の順をAIに強制し、1ファイルごとに承認ゲートを挟む。受託開発・チーム開発向け。
この巻物、誰かのトークンも救えます
𝕏 で節約レシートをシェア