Clean up your Git branches

Featured image for sharing metadata for article


I follow the Git Flow practice for my branches, both personally and professionally, making heavy use of feature branches. This branch structure means that I will have aptly named feature branches, such as feature/404-page or feature/readme_screenshot.

However, I've recently found that I'm running into having quite a few branches stored locally, such as:

$ git branch

This means that whenever I'm trying to use my tab completion, I have a load of options to scroll through, which is a less than ideal user experience as it increases the number of characters needed to type before a branch can be autocompleted. To this end, I've recently been looking at how to clean up the number of branches I have.

Each time I've DuckDuckGo'd the commands, the last time of which made me think I should document it somewhere that I can easily browse to in future. And in the light of wanting to document my blogumentation for everyone to consume, I've rolled it into a blog post.

Removing Local Checked-Out Branches

Credit to StackOverflow, we can use the following pipeline to delete any merged branches, except the current branch, and the master and develop branches:

$ git branch --merged | egrep -v "(^\*|master|develop)" | xargs git branch -d
# ^ list all the branches that have been merged
#                      ^ except from our current branch (`*`)
#                      ^ and `master` and `develop`
#                                                         ^ and then delete them all

This can obviously be updated to reflect the branching scheme you use, and whether there are any other branches you don't want to have deleted.

I'd also advise running git branch --merged on its own, before running the full command, in order to just check that you're not going to delete something you didn't mean to! This is important, as you won't be able to undo any branch deletions!

Removing Branches from Remotes

So now that we've deleted all the local branches, we're done, right? Not quite.

Git, being decentralised in nature, downloads the full state of a remote repository, meaning that any branch stored in the remote will also be stored locally. This means, that when you run the following command, you should see roughly the same number of branches, but with remotes/origin/ prepended:

$ git branch -a
* article/clean-up-branches
  remotes/origin/HEAD -> origin/master

Luckily this is a bit easier to do, and doesn't require remembering the full pipeline:

$ git remote prune origin
 * [pruned] origin/article/openssl_cert_extraction
 * [pruned] origin/article/verbose-commits
 * [pruned] origin/feature/separate_builder_image

Auto-pruning branches

As per the following tweet, we can also set Git to auto prune our remotes, too:

$ git config remote.origin.prune true

This can also be set globally:

# via the CLI
$ git config --global remote.origin.prune true
# or in your Git config
$ cat ~/.gitconfig
[remote "origin"]
	prune = true

Written by Jamie Tanna's profile image Jamie Tanna on , and last updated on .

Content for this article is shared under the terms of the Creative Commons Attribution Non Commercial Share Alike 4.0 International, and code is shared under the Apache License 2.0.

#blogumentation #git.

This post was filed under articles.

Interactions with this post

Interactions with this post

Below you can find the interactions that this page has had using WebMention.

Have you written a response to this post? Let me know the URL:

Do you not have a website set up with WebMention capabilities? You can use Comment Parade.