
Clean Branches
- 7 installs
- 3.5k repo stars
- Updated August 5, 2026
- brave/brave-core
clean-branches is a Claude Code skill that deletes local branches whose PRs have been merged upstream by checking GitHub PR status and merge detection.
About
This skill cleans up local git branches by checking each branch's GitHub PR status and deleting those that have been merged. A developer uses it to prune branches after PRs land, including squash-merged ones that ancestry checks miss. It detects merges via direct ancestry, git cherry patch-equivalence, and gh PR status, then categorizes branches and asks for confirmation before deleting.
- Deletes local branches whose PRs have been merged upstream, including squash merges
- Detects merges three ways: direct ancestry, git cherry patch-equivalence, and GitHub PR status
- Categorizes branches and confirms with the user before deleting, never auto-deleting open or no-PR branches
Clean Branches by the numbers
- 7 all-time installs (skills.sh)
- Ranked #457 of 733 Git & Pull Requests skills by installs in the Skillselion catalog
- Data as of Aug 5, 2026 (Skillselion catalog sync)
clean-branches capabilities & compatibility
- Capabilities
- branch cleanup · git hygiene · merge detection
- Works with
- github
- Use cases
- devops
What clean-branches says it does
Clean up local branches by checking their GitHub PR status and deleting those that have been merged.
If ALL lines start with `-` (or output is empty), the branch has been squash-merged.
Never auto-delete "No PR" or "Open PR" branches
npx skills add https://github.com/brave/brave-core --skill clean-branchesAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 7 |
|---|---|
| repo stars | ★ 3.5k |
| Last updated | August 5, 2026 |
| Repository | brave/brave-core ↗ |
What it does
Delete local git branches whose PRs have merged upstream, detecting squash merges and confirming before deletion.
Who is it for?
Pruning local branches after PRs merge, including squash-merged branches that ancestry checks miss
Skip if: Deleting open, no-PR, or unmerged branches, which it never auto-deletes
When should I use this skill?
On triggers clean branches, delete merged branches, prune branches, branch cleanup
What you get
Merged local branches deleted after user confirmation, with stale remote tracking references pruned.
- deleted merged branches
- pruned remote tracking references
By the numbers
- 3 merge-detection methods
- 4 branch categories
Files
Clean Branches - Delete Merged Local Branches
Clean up local branches by checking their GitHub PR status and deleting those that have been merged.
Steps
1. Fetch and list branches — Fetch the latest remote state, then get all local branches except master:
git fetch origin master
git branch --format='%(refname:short)' | grep -v '^master$'Show the list to the user. If no branches exist besides master, report that and stop.
2. Check merge status for each branch — Use multiple methods to detect merges (including squash merges):
Method 1: Direct ancestry — Catches regular merges and fast-forwards:
git branch --merged origin/master --format='%(refname:short)'Method 2: Squash merge detection via `git cherry` — For branches not caught by method 1, check if all commits have equivalent patches in origin/master. A - prefix means the patch already exists upstream:
git cherry -v origin/master <branch>If ALL lines start with - (or output is empty), the branch has been squash-merged.
Method 3: GitHub PR status (if gh is authenticated) — For remaining branches:
# Check for merged PRs
gh pr list --head <branch> --state merged --json number,title,url
# Check for closed (not merged) PRs
gh pr list --head <branch> --state closed --json number,title,url,mergedAtA PR is "closed without merge" when it appears in the closed list but has an empty/null mergedAt field. If gh is not authenticated, skip this method.
Important: Always compare against origin/master (not local master) to detect merges even when local master is stale.
3. Categorize branches into these groups:
- Merged: Detected as merged by any method above → safe to delete
- Closed (not merged): PR was closed without merging → flag for user
decision
- No PR / Open PR: No PR found (and not detected as merged), or PR is
still open → skip
4. Display categorized list — Show the user a summary table with:
- Branch name
- Category (Merged / Closed / No PR / Open)
- PR number and title (if available)
- Detection method (ancestry / squash / PR status)
5. Confirm with user — Ask the user which branches to delete:
- Pre-select "Merged" branches for deletion
- Ask about "Closed (not merged)" branches individually
- Never auto-delete "No PR" or "Open PR" branches
6. Delete confirmed branches — If currently on a branch being deleted, switch to master first and fast-forward it:
git checkout master && git merge --ff-only origin/master
git branch -D <branch1> <branch2> ...After deleting, prune stale remote tracking references:
git remote prune origin7. Report results — Summarize:
- How many branches were deleted
- Which branches were kept and why
Related skills
FAQ
How does it catch squash merges?
It uses git cherry -v against origin/master; if all lines start with - (or output is empty), the branch has been squash-merged.
Does it auto-delete anything?
No. It pre-selects merged branches, asks about closed-not-merged branches individually, and never auto-deletes no-PR or open-PR branches.