Git Branch Cleaner
起点ブランチにマージ済みの作業ブランチを安全に一括削除する。
保護ブランチ
以下のブランチはいかなる場合も削除しない:
main,master,develop,development,staging,production- 起点ブランチ自身
- 現在チェックアウト中のブランチ(
git branch --show-currentの結果)
このリストに該当するブランチが削除対象に含まれていた場合は、処理を即座に中断してユーザーに報告する。削除は一切実行しない。
スコープの決定
$ARGUMENTS に渡された値でスコープを決定する:
$ARGUMENTS | スコープ |
|---|---|
空 / local | ローカルのみ |
remote | リモートのみ |
both | 両方 |
ワークフロー
Step 1: 現在の状態を確認する
現在のブランチとリモートの設定を確認する:
git branch --show-current
git remote
リモートが存在する場合は、マージ済み判定を正確にするために git fetch --prune の実行を提案する。未実施だと起点ブランチが古く、削除すべきブランチが検出されない(削除漏れ)可能性がある。ユーザーが同意した場合のみ実行する:
git fetch --prune
Step 2: 起点ブランチを決定する
ユーザーが起点ブランチを明示していない場合は、以下の順で自動検出を試みる:
git symbolic-ref refs/remotes/origin/HEAD 2>/dev/nullでデフォルトブランチを確認main→master→developの順にgit branch --listで存在確認
自動検出できた場合はその結果をユーザーに伝えてから続行する。 どれも見つからない場合は AskUserQuestion でユーザーに入力を求める。
Step 3: マージ済みブランチを検出する
スコープに応じて対象を取得し、冒頭の「保護ブランチ」リストに該当するものをすべて除外する。
ローカル(scope: local / both):
リモートがある場合は git fetch --prune 済みのリモート追跡ブランチを基準にすると正確:
git branch --merged origin/<base-branch> # リモートがある場合
git branch --merged <base-branch> # ローカルのみのリポジトリの場合
* 付きの現在のブランチと保護ブランチをリストから除外する。
リモート(scope: remote / both):
git branch -r --merged origin/<base-branch>
origin/HEAD や origin/<base-branch> を除外する。表示には origin/ プレフィックスを除いたブランチ名を使う。
削除対象が 0 件の場合は「削除すべきブランチはありません」と伝えて終了する。
Step 4: 削除対象をユーザーに提示して確認を取る
ブランチの削除は取り消しが難しいため、必ず実行前にユーザーの確認を取る。
以下の形式で一覧を提示する(スコープに応じてセクションを表示):
削除対象ブランチ(N件):
[ローカル]
- feature/add-login
- fix/typo-in-readme
[リモート]
- feature/add-login
- fix/api-timeout
起点ブランチ: main
スコープ: both
この内容で削除しますか?
Step 5: ブランチを削除する
確認を得たら、削除実行前に保護ブランチの二重チェックを行う。削除対象リストに保護ブランチが1件でも含まれていた場合は処理を即座に中断し、該当ブランチ名とともにユーザーに報告する。削除は一切実行しない。
二重チェックが通過した場合のみ、スコープに応じて削除を実行する。
ローカルブランチの削除(scope: local / both):
マージ済みであることが確認済みなので -d(安全削除)を使う。-D は使わない:
git branch -d <branch1> <branch2> ...
リモートブランチの削除(scope: remote / both):
部分失敗を正確に把握するため、1ブランチずつ実行して結果を逐次確認する:
git push origin --delete <branch1>
git push origin --delete <branch2>
...
Step 6: 完了を報告する
削除完了後にブランチ一覧を確認してから報告する(スコープに応じて実行):
git branch # ローカル確認(scope: local / both)
git branch -r # リモート確認(scope: remote / both)
削除結果を報告する:
✓ ブランチの削除が完了しました
[ローカル] 2件削除
- feature/add-login
- fix/typo-in-readme
[リモート] 2件削除
- feature/add-login
- fix/api-timeout
注意事項
- 強制削除は使わない:
-Dや--forceは使用しない。git branch --mergedで確認が取れたブランチのみ削除する - 現在のブランチ: チェックアウト中のブランチは削除対象から除外し、ユーザーに通知する
- リモート名: デフォルトで
originを使用する。git remoteの結果が複数ある場合またはoriginが存在しない場合は、ユーザーに使用するリモートを確認する - ネットワークエラー: リモート削除が失敗した場合はエラー内容を報告し、成功した分のみ完了として扱う