Created
January 23, 2026 19:22
-
-
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
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #!/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