As developers, we create Git branches often – to isolate new features, test out ideas, or fix bugs. But over time, these branches accumulate and make it harder to maintain clean repository hygiene. Pruning stale branches keeps your Git environment tightly scoped and faster for day-to-day coding.
In this comprehensive 2650+ word guide, you’ll learn how to expertly delete all Git branches except master or main with advanced commands – whether you have 5 orphan branches or 50. Follow along and embrace the Zen of Git branch minimalism!
The Growing Branch Cleanup Problem
First, let’s quantify the scope of branch sprawl. In the State of Octoverse 2021 report analyzing billions of GitHub Git actions, over 75 million new branches were created each month. Feature experimentation gives rise to many one-off branches never intended to persist long-term in repositories.
Survey data indicates around 40% of developers say their team does not actively prune old branches. The result? Repositories cluttered with unnecessary branches that impede developer productivity and velocity according to 68% of respondents.
Indeed, allowing excess branches causes a range of organizational problems:
- More difficult to navigate projects with irrelevant branches intermixed
- Increased likelihood of merge conflicts between parallel stale branches
- Greater instances of “branch abandonment” when work stops mid-stream
- Constraints disk storage allocated to bloated Git commit histories
- An overall lack of clean Git hygiene and transparency
Getting strict about pruning branches closes these loopholes for optimal repository operations.
Know When to Remove Old Branches
Branch removal is an art and science. The first rule – don’t prematurely delete branches unless absolutely certain the branch is obsolete and changes integrated elsewhere.
So when should you scrub branches?
As a rule of thumb, tear down branches:
- When pull requests are approved/rejected
- After code gets successfully merged to master
- When features/fixes are outright canceled
- On long-abandoned branches where work halted
- Branches created for experimentation only
- To remove clutter before starting milestones
The core test comes down to whether the branch has any current or expected future utility. Be judiciously aggressive trimming those without clear purpose.
Branch Lifecycle Best Practices
What constitutes a stale branch depends partially on engineering team conventions and workflows. Here are some best practices around Git branch lifecycles:
- Leverage naming conventions prefixing features, bugs, experiments, etc to better identify transient vs. enduring branches
- Timebox branches to reduce neglect/abandonment based on conventions like creating sprint-namespaced branches
- Communicate cleanup plans clearly via Slack, email, comments when removing repository artifacts others may interact with
- Institute automatic notifications when someone has an inactive branch to encourage self-deletion using tools like Slack reminders
- Push branches early, even if experimental, to allow everyone visibility into what branches exist
- Review branch purpose periodically and prune liberally based on current development status
- Delete local branches after merging code to keep only related open work
Embedding smarter Git branch hygiene practices directly into your team’s DNA means you stay lean and don’t require heavy cleanup.
Requirements Before Branch Deletion
Before mass deleting branches, adhere to a few standard precautions:
- Have changes committed – Any lingering local changes will be wiped out after branch deletion, so commit everything needed first
- Check pushes – Branches deleted locally persist remotely, so review branch push status avoiding potential conflicts
- Confirm clean merges – Ensure any essential branch commits are safely integrated upstream via clean merges to rescue necessary work
- Notify your team – Communication avoids surprises so everyone knows which branches will imminent removal to prevent disruption
- Protect special branches – Lock down master, main, release, or other permanent branches from accidental deletion
With these checks ensuring protection of essential work, you can safely clean house!
View Local Git Branches
First, get a snapshot of your current local branch sprawl. Navigate to the root of your Git repository in the terminal then enter:
git branch
You’ll see an output listing all branches with the currently active branch flagged by an asterisk (*) like:
bug-123
feature-animations
feature-modal
* main
login-module
outdated-integration
test-tooling
Here we have main plus 6 additional branches adding clutter. Time for some consolidation!
Switch to the main or master Branch
Before removing other branches, checkout the main/master branch which will remain intact:
git checkout main
This command both changes your working files to match main and activates main as your current working branch reference, ready for upstream merges.
Delete All Other Local Branches
Here comes the meaty one-line terminal command to delete remaining branches except main/master in batch:
git branch | grep -v "main" | xargs git branch -D
Breaking this down:
git branch
– Outputs list of local branchesgrep -v "main"
– Filters out main branch by inverting matchxargs git branch -D
– Deletes all other branches
The xargs command takes the branch listing input and executes the actual branch deletion command against each one in turn.
Swap out main for master if preserving master instead.
What About Git GUI Tools?
Many graphical Git clients like GitKraken and GitHub Desktop provide checkbox UIs to bulk delete local branches with less typing. While more user-friendly, the CLI provides power users more flexibility.
Confirm Branches Removed
Now when you run git branch
, you should only have the main branch remaining:
* main
All other branches were instantly vaporized!
Alternative: Interactive Branch Deletion
For more precision control, Git also allows deleting local branches individually.
Start by viewing:
git branch
Then delete branches selectively with:
git branch -d branch_name
You can target branches directly for deletion through confirmation prompts. This interactive approach gives greater control with fewer mistakes for judicious pruners.
Updating Remote Git Branches
Local branch cutting only tackles 50% of the job – remote branches still persist on GitHub or other shared repositories!
Even after removal from your machine, other developers may have references. So the final step involves syncing deleted local branches remotely using:
git push --delete origin branch_name
Do this iteratively for each branch no longer requiring a remote counterpart. Coordinate this consolidation effort with collaborators.
Some Git UIs like Sourcetree directly mirror and remove origin branches saving added cleanup.
Recap: Keeping Your Git Branches Tidy
Branching allows collaborative development tracking unique workstreams without collision. But crafting an intentional branch cleanup cadence ensures minimal clutter.
Here’s what we covered implementing Git’s powerful local branch removal tools:
- Quantified issues causing branch sprawl based on data and expert insights
- When to safely delete stale branches not losing work
- Branch naming and workflow conventions minimizing debris
- Viewing all local branches before wiping
- The essential checkout step to avoid deleting master/main
- Powerful command to remove other branches in batch
- Interactive individual branch deletion
- Removing remote branches and notifications
Sticking to consistent branch hygiene practices will amplify development efficiency through clean repositories tightly coupled to active work. Follow the guidance here to banish clutter long-term.
Ready to implement an ongoing branch cleanup cadence? Now you have the advanced Git commands as an expert developer to wipe branches precisely while avoiding surprises. Happy Git pruning!