skills/git-workflows/skills/delete-branch/SKILL.md
Use when deleting local or remote branches with safety checks for unmerged work.
npx skillsauth add dtsong/my-claude-setup git-delete-branchInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
--force.., shell metacharacters, or null bytes.--merged, --stale, --remote, --force accepted. Reject arbitrary strings.Delete local and/or remote branches with safety checks.
/git-delete-branch feat/old-feature # Delete local branch
/git-delete-branch feat/old-feature --remote # Also delete remote
/git-delete-branch --merged # Delete all merged branches
/git-delete-branch --stale # Delete branches with gone remotes
/git-delete-branch --force feat/unmerged # Force delete unmerged
BRANCH="$1"
# Cannot delete current branch
CURRENT=$(git branch --show-current)
if [ "$BRANCH" = "$CURRENT" ]; then
echo "Cannot delete current branch. Switch first:"
echo " /git-switch main"
exit 1
fi
# Check if branch exists
if ! git show-ref --verify --quiet "refs/heads/$BRANCH"; then
echo "Branch '$BRANCH' does not exist locally."
exit 1
fi
# Check if branch is merged
if ! git merge-base --is-ancestor "$BRANCH" main 2>/dev/null; then
echo "Warning: Branch is NOT fully merged into main."
echo "Commits that would be lost:"
git log main.."$BRANCH" --oneline
# Require --force for unmerged branches
if [ "$FORCE" != true ]; then
echo "Use --force to delete anyway."
exit 1
fi
fi
# Check for unpushed commits
UPSTREAM=$(git rev-parse --abbrev-ref "$BRANCH@{u}" 2>/dev/null)
if [ -n "$UPSTREAM" ]; then
UNPUSHED=$(git rev-list --count "$UPSTREAM..$BRANCH" 2>/dev/null || echo "0")
if [ "$UNPUSHED" -gt 0 ]; then
echo "Warning: Branch has $UNPUSHED unpushed commits."
fi
fi
# Safe delete (fails if not merged)
git branch -d "$BRANCH"
# Force delete (even if not merged)
git branch -D "$BRANCH"
if [ "$DELETE_REMOTE" = true ]; then
# Check if remote exists
if git show-ref --verify --quiet "refs/remotes/origin/$BRANCH"; then
git push origin --delete "$BRANCH"
echo "Deleted remote branch: origin/$BRANCH"
else
echo "No remote branch to delete."
fi
fi
Deleted branch: feat/old-feature
Branch was merged into main.
Local branch removed.
Remote branch: Not deleted (use --remote to delete)
Deleted branch: feat/old-feature
Local: Deleted
Remote: Deleted (origin/feat/old-feature)
Branch fully cleaned up.
Cannot delete: feat/wip-feature
This branch is NOT merged into main.
You would lose these commits:
abc1234 Work in progress
def5678 More changes
ghi9012 Almost done
Options:
/git-delete-branch --force feat/wip-feature # Delete anyway
/git-switch feat/wip-feature # Continue working
/git-merge-main # Merge main into it first
Finding branches merged into main...
Branches to delete:
fix/login-bug
feat/completed-feature
chore/old-cleanup
Delete these 3 branches? (y/n)
Deleted:
fix/login-bug
feat/completed-feature
chore/old-cleanup
Kept (current or protected):
main
develop
Finding stale branches (remote deleted)...
Stale branches:
feat/abandoned [origin: gone]
fix/obsolete [origin: gone]
Delete these 2 stale local branches? (y/n)
Deleted:
feat/abandoned
fix/obsolete
These branches cannot be deleted without explicit --force:
mainmasterdevelopproductionCannot delete protected branch: main
Use --force if you really mean it (not recommended).
# After PR is merged
/git-switch main
/git-pull
/git-delete-branch feat/merged-pr --remote
# Cleanup old branches
/git-branches --merged
/git-delete-branch --merged
# Clean stale tracking
/git-delete-branch --stale
/git-branches to see all branches and their status/git-switch to change to a different branch first/gh-pr-merge to clean up the merged branchdevelopment
Use when the council needs to surface organizational knowledge buried across multiple internal sources (wikis, design docs, ADRs, past tickets, postmortems, chat archives, code repos). Plans where to look, what to cross-reference, and how to synthesize findings into evidence the council can act on. Do not use for external market research (use competitive-analysis), library evaluation (use library-evaluation), or technology trend assessment (use technology-radar).
testing
Use to convert a Word .docx file to PDF and/or verify its page count. Triggers on: converting docx to pdf, rendering a document, checking how many pages a docx produces, or asserting a page-count constraint (e.g. a resume must stay 2 pages). Wraps LibreOffice headless conversion.
development
Security audit checklist for web applications. Use when reviewing, auditing, or hardening a web app's security posture. Covers rate limiting, auth headers, IP blocking, CORS, security middleware, input validation, file upload limits, ORM usage, and password hashing. Triggers on requests like "review security", "harden this app", "security audit", "check for vulnerabilities", or when building/reviewing API endpoints.
development
Interactive wizard to craft effective prompts using Claude Code best practices