Remove all your local git branches but keep master
Sometimes after a sprint, all the remaining branches are just taking up space.
Here's a small snippet to remove all your local branches in one go.
$ git branch | grep -v "master" | xargs git branch -D
Written by Adan Alvarado
Related protips
15 Responses
For an easier reuse you could also alias this useful snippet.
alias gbr="git branch | grep -v "master" | xargs git branch -D"
Sill question, maybe, but why not just work with 2, 3 or 4 if you really must branches? I can imagine large teams... very large teams - of maybe 15 - 30+ developers would have many branches to be reconciled, but this post states distinctly local work (so I assume, it's on one man's machine, or am I misinterpreting?)
Nevertheless, I'm interested in how different people code in their own ways. Personally I may have master, development, and if I really must, a "messing around" branch. And no more.
I'm aware that you may be referring to exactly the way I do it - are you? In that case, this would be to clean up your dev branches from local after checking out, is that right?
@skopp
Not a silly question at all. It is interesting to know how other people deal with complexity and how teams manage branches. I've worked on 2 different companies since I've used Git to manage development for projects. This guide over here: https://github.com/diaspora/diaspora/wiki/Git-Workflow it is essentially what we do.
In short, we create a develpment branch for every issue/bug we want to work on, and then merge into master. Most if not all the time, we simply forget or don't care to remove those development branches from our local repository, and thus can take up hard drive space. Also; it is useless to keep a 3 month old branch if it has been merged to master or no longer relevant.
There's a post from my friend here: https://coderwall.com/p/ssm_zg?i=7&p=1&q=author%3AEnriqueVidal&t[]=EnriqueVidal that lets you remove remote branches that have been merged to master, so you can keep things neat on the remote side as well.
Tl;dr version:
Sill question, maybe, but why not just work with 2, 3 or 4 if you really must branches?
This could work for a solo project, but on a 2+ man team, this would not work as well.
I can imagine large teams... very large teams - of maybe 15 - 30+ developers would have many branches to be reconciled, but this post states distinctly local work (so I assume, it's on one man's machine, or am I misinterpreting?
Not misenterpreting, rather we just have a different workflow, ( a branch per issue if you would like to think at it like that).
Nevertheless, I'm interested in how different people code in their own ways. Personally I may have master, development, and if I really must, a "messing around" branch. And no more.
In all of my 1 man projects I do it like that, if there's a team ( >1 ), I like to do the "diaspora" workflow I linked to.
I'm aware that you may be referring to exactly the way I do it - are you? In that case, this would be to clean up your dev branches from local after checking out, is that right?
I usually never need to clean up on my 1 man projects, on the others I do it around every 3 or 4 months.
Cheers!
@aalvarado thanks a ton for all that information - skimmed, but will def. give it all a thorough read a bit later!
If you have branches containing master
then this script won't delete those.
Instead you could use:
git branch | grep -ve " master$" | xargs git branch -D
This will remove branches named (e.g.) test-master
, master-test
.
@fiznool I was thinking of that myself today, thanks! I solved it with
ack -v "\s+master"
more than 1 branch can be added to the grep expression like "master\|develop\|current_branch"
Another super useful one is
git config --global alias.clean-branches "!git branch | grep -v master | xargs git branch -D"
I like having it be available as a git alias, it makes the workflow a little nicer, since you'll probably already be doing git things
I use
alias gbDA='git branch | egrep -v "(master|\*)" | xargs git branch -D'
Which deletes everything except master and the branch I am currently in, just in case.
this snippet will not remove the current branch.
It won't, but it will show an unsightly error message because it unsuccessfully tried to delete the current branch.
git branch | select-string -notmatch master | foreach {git branch -d ("$_").Trim() --force}
Thank you Adan Alvarado
I needed multiple branches excluded and found it somewhat difficult to actually do, but here's what finally worked for me:
1) Go find your actual global git config file and edit that. Trying to do it via command line was too hard with escaping and such
2) Make it look like this:
[alias]
trim = !git branch | grep -v -E 'master|main|development|integration|production' | xargs git branch -D
Should go without saying that each term after -E are the branches that WILL NOT be deleted.
Okay, easy, thanks.