Labsco
brave logo

clean-branches

โœ“ Officialโ˜… 3,392

by brave ยท part of brave/brave-core

Delete local branches whose PRs have been merged upstream. Checks GitHub PR

๐Ÿ”ฅ๐Ÿ”ฅโœ“ VerifiedFreeQuick setup
๐Ÿ”’ Repo-maintenance skill. It exists to help maintain brave/brave-core itself โ€” it's only useful if you contribute code to that project.

This is the playbook your agent receives when the skill activates โ€” you don't need to read it to use the skill, but it's here to audit before installing.

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.

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

  1. 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
  2. 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)
  3. 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
  4. 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
  1. Report results โ€” Summarize:
    • How many branches were deleted
    • Which branches were kept and why