Soft Delete Git Branch Workflow
Invocation behavior
When this skill is invoked without an explicit branch name, target the currently checked-out branch. Invocation of the skill is authorization to begin the workflow immediately: inspect the working tree and determine the current branch without asking which branch to delete.
Only ask the user how to proceed when:
- The working tree is dirty.
- The current branch is the default branch.
- Safe deletion fails and force deletion would require confirmation.
Do not ask the user to name or confirm the current branch before starting.
Steps:
Check for uncommitted changes
git status --porcelainIf the working tree is dirty, stop and ask the user how to proceed (commit, stash, or discard) before switching branches.
Get current branch name
git branch --show-currentIf already on the default branch, there is no branch to delete — stop and ask the user which branch they meant.
Determine the default branch
git symbolic-ref --short refs/remotes/origin/HEADThis returns e.g.
origin/main— the default branch is the part afterorigin/. If the ref is unset, fall back tomain.Check out the default branch
git checkout <default-branch>Pull latest changes
git pullSoft delete the previous branch
git branch -d <branch-name>If soft delete fails, check for a squash merge
git branch -dfails for branches merged via GitHub's "Squash and merge", because the branch tip is never an ancestor of the default branch. Check whether the branch's PR was actually merged:gh pr view <branch-name> --json state,mergedAt- If the PR state is
MERGED, confirm with the user, then delete withgit branch -D <branch-name>. - Otherwise, escalate to the user rather than force-deleting.
- If the PR state is
Notes:
- Uses lowercase
-dfor soft delete (safe delete that prevents deletion of unmerged branches) - Never use uppercase
-D(hard delete) except in the verified-squash-merge case above, and only after confirming with the user - The workflow ensures the default branch is up to date before attempting the delete