Skip to content

Instantly share code, notes, and snippets.

@awilkening
Created January 23, 2026 19:22
Show Gist options
  • Select an option

  • Save awilkening/cab28463c57470ba1a48d8d724bd8fac to your computer and use it in GitHub Desktop.

Select an option

Save awilkening/cab28463c57470ba1a48d8d724bd8fac to your computer and use it in GitHub Desktop.
Script to clean up git branches by checking merge status and attempting rebase
#!/bin/bash
# Script to clean up git branches
# 1. First checks if branch is already merged into master (safe to delete)
# 2. Then checks if branch has any unique commits not in master
# 3. If rebase succeeds, attempts soft delete
# 4. If rebase fails, leaves branch for manual review
cd /Users/awilkening/Workspace/ucweb
# Ensure we start on master
git checkout master > /dev/null 2>&1
# Get all branches except master and staging
branches=$(git branch | grep -v '^\*' | grep -v 'master' | grep -v 'staging' | sed 's/^[[:space:]]*//')
deleted_merged=0
deleted_rebased=0
conflicts=0
skipped=0
no_unique_commits=0
for branch in $branches; do
echo -n "Processing $branch... "
# First check: Is this branch already merged into master?
if git branch --merged master | grep -q "^[[:space:]]*${branch}$"; then
if git branch -d "$branch" > /dev/null 2>&1; then
echo "✅ Already merged, deleted"
deleted_merged=$((deleted_merged + 1))
continue
fi
fi
# Second check: Does this branch have any unique commits not in master?
unique_commits=$(git log master.."$branch" --oneline 2>/dev/null | wc -l | tr -d ' ')
if [ "$unique_commits" = "0" ]; then
# No unique commits, safe to delete
if git branch -d "$branch" > /dev/null 2>&1; then
echo "✅ No unique commits, deleted"
deleted_merged=$((deleted_merged + 1))
continue
else
echo "⚠️ No unique commits but can't soft delete (may need -D)"
no_unique_commits=$((no_unique_commits + 1))
continue
fi
fi
# Third: Try to checkout and rebase
if ! git checkout -f "$branch" > /dev/null 2>&1; then
echo "⚠️ Could not checkout"
skipped=$((skipped + 1))
git checkout master > /dev/null 2>&1
continue
fi
# Try to rebase on master
if git rebase master > /dev/null 2>&1; then
# Go back to master
git checkout master > /dev/null 2>&1
# Attempt soft delete
if git branch -d "$branch" > /dev/null 2>&1; then
echo "✅ Rebased and deleted"
deleted_rebased=$((deleted_rebased + 1))
else
echo "⚠️ Rebased but not merged"
conflicts=$((conflicts + 1))
fi
else
echo "⚠️ Rebase conflicts"
git rebase --abort > /dev/null 2>&1
git checkout master > /dev/null 2>&1
conflicts=$((conflicts + 1))
fi
done
echo ""
echo "Summary:"
echo " Deleted (already merged): $deleted_merged"
echo " Deleted (rebased successfully): $deleted_rebased"
echo " Conflicts/Not merged: $conflicts"
echo " No unique commits (needs -D): $no_unique_commits"
echo " Could not checkout: $skipped"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment