← ClaudeAtlas

git-branch-cleanuplisted

Safely delete local git branches that are already merged, squash/rebase-merged, or whose remote was deleted, while protecting the current branch, the default branch, and any worktree-checked-out branch. Use when the user wants to clean up, prune, tidy, or delete "done"/merged/stale local branches, shrink a long `git branch` list, or remove branches after merging a PR.
magnusrodseth/dotfiles · ★ 0 · Code & Development · score 62
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 |