skip to content
The Way Software Development, LLC logoWay Software

Cleanup Local Git Branches

Published / 3 min read

last updated:

If you’ve been developing on a project for a while, you are probably aggregating an ungodly amount of git branches locally. Here is a one liner to cleanup your merged branches:

git branch --merged origin/master | grep -v 'master' | xargs git branch -d

If your trunk / target branch is different, you can modify the command as needed, replacing the occurrences of master with your target branch. Let’s step through the commands and see how they compose together.

List Merged Branches

Here we’re interested in local branches which have been merged into our production branch on the remote git repository.

git branch --merged origin/master
continuous-deployment
master
pg-migrate

continuous-deployment and pg-migrate are two feature branches that I still have locally even though they are now in production. master is my local copy of master, which I am happy to keep, which leads us into step 2, filtering out the branch(es) you want to keep.

Filter The Results

I want to keep my local copy of master. To do so, we can leverage grep with the -v flag to do an inverse match on master. We are saying to match on everything except master. By using the unix pipe operator (|) we can chain the two commands together. Briefly explained, a unix pipe takes the standard output (stdout) of one command and pipes it in as the standard input (stdin) of another. So we are executing grep -v 'master' against the output of:

continuous-deployment
master
pg-migrate

which gives the results:

continuous-deployment
pg-migrate

Everything but master. Perfect!

Delete The Branches

The final piece of the puzzle is to pipe these new results into xargs git branch -d. To delete a local git branch we can run

git branch -d <your-branch>

so this is the meat and potatoes of our final command. Since the stdout that we are currently working with is a list where each git branch is on a new line, we can use xargs to allow us to execute git branch -d for each item (branch) in that list. What this looks like under the hood is:

git branch -d continuous-deployment
git branch -d pg-migrate

Piecing It All Together

Putting all the pieces together and executing the one liner

git branch --merged origin/master | grep -v 'master' | xargs git branch -d

we get

Deleted branch continuous-deployment (was 86cfe6d).
Deleted branch pg-migrate-cleanup (was 433f4d6).

As you can see, each local branch was deleted - just what we were hoping for. Hopefully that will help keep your local repositories a little bit cleaner. This could also easily become a shell function for convenience’s sake but I’ll leave that as an exercise for the reader.