Now liveThe Skillselion MCP - thousands of ranked skills, loaded into your agent mid-task. No install.Get it →
brave avatar

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)
At a glance

clean-branches capabilities & compatibility

Capabilities
branch cleanup · git hygiene · merge detection
Works with
github
Use cases
devops
From the docs

What clean-branches says it does

Clean up local branches by checking their GitHub PR status and deleting those that have been merged.
SKILL.md
If ALL lines start with `-` (or output is empty), the branch has been squash-merged.
SKILL.md
Never auto-delete "No PR" or "Open PR" branches
SKILL.md
npx skills add https://github.com/brave/brave-core --skill clean-branches

Add your badge

Show developers this skill is listed on Skillselion. Paste this into your README.

Listed on Skillselion
Installs7
repo stars3.5k
Last updatedAugust 5, 2026
Repositorybrave/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

SKILL.mdMarkdownGitHub ↗

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,mergedAt

A 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 origin

7. 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.

This week in AI coding

Five minutes, every Monday - the tools, releases and tactics for developers.

unsubscribe anytime.