git-branch-cleanuplisted
Install: claude install-skill magnusrodseth/dotfiles
# git-branch-cleanup
Remove finished local branches without risking unmerged work. The hard part is
that `git branch --merged` only sees branches reachable from the default branch —
it MISSES squash- and rebase-merged PRs (the common GitHub workflow). This skill
layers three signals and only auto-deletes the provably-safe set.
## Quick start
```bash
bash scripts/cleanup-branches.sh --fetch # delete safe-merged, list the rest
bash scripts/cleanup-branches.sh --dry-run # classify only, delete nothing
bash scripts/cleanup-branches.sh --fetch --force # also -D the PR-merged / gone set
```
The script classifies every local branch into four buckets, deletes the **merged**
bucket with safe `git branch -d`, and prints the rest. Present its output to the
user; only re-run with `--force` after they confirm the squash-merged / gone set.
## What it protects (never deleted)
- The **current** branch and the **default** branch (`origin/HEAD`, else main/master/develop)
- Any branch **checked out in a worktree** (git refuses these anyway; the script skips them)
## Classification
| Bucket | Signal | Action |
|--------|--------|--------|
| Merged | `git for-each-ref --merged=<default>` (ancestor of default) | auto `git branch -d` (safe) |
| PR-merged | `gh pr list --state merged` head matches branch | list; `-D` only with `--force` |
| Gone | upstream tracking shows `[gone]` (remote branch deleted) | list; `-D` only with `--force` |
| Active | none of the above | KEPT |