Can you delete multiple branches in one command with Git?

Git

Git Problem Overview


I'd like to clean up my local repository, which has a ton of old branches: for example 3.2, 3.2.1, 3.2.2, etc.

I was hoping for a sneaky way to remove a lot of them at once. Since they mostly follow a dot release convention, I thought maybe there was a shortcut to say:

git branch -D 3.2.*

and kill all 3.2.x branches.

I tried that command and it, of course, didn't work.

Git Solutions


Solution 1 - Git

Not with that syntax. But you can do it like this:

git branch -D 3.2 3.2.1 3.2.2

Basically, git branch will delete multiple branch for you with a single invocation. Unfortunately it doesn't do branch name completion. Although, in bash, you can do:

git branch -D `git branch | grep -E '^3\.2\..*'`

Solution 2 - Git

You can use git branch --list to list the eligible branches, and use git branch -D/-d to remove the eligible branches.

One liner example:

git branch -d `git branch --list '3.2.*'`

Solution 3 - Git

Well, in the worst case, you could use:

git branch | grep '3\.2' | xargs git branch -D

Solution 4 - Git

git branch  | cut -c3- | egrep "^3.2" | xargs git branch -D
  ^                ^                ^         ^ 
  |                |                |         |--- create arguments
  |                |                |              from standard input
  |                |                |
  |                |                |---your regexp 
  |                |
  |                |--- skip asterisk 
  |--- list all 
       local
       branches

EDIT:

A safer version (suggested by Jakub Narębski and Jefromi), as git branch output is not meant to be used in scripting:

git for-each-ref --format="%(refname:short)" refs/heads/3.2\* | xargs git branch -D

... or the xargs-free:

git branch -D `git for-each-ref --format="%(refname:short)" refs/heads/3.2\*`

Solution 5 - Git

Recently, I was looking for solution of same problem, finally i found one answer and it is working very well:

  1. Open the terminal, or equivalent.
  2. Type in git branch | grep " pattern " for a preview of the branches that will be deleted.
  3. Type in git branch | grep " pattern " | xargs git branch -D

This solution is awesome and if you want full explanation of each command and how it is working, its given here.

Solution 6 - Git

Use

git for-each-ref --format='%(refname:short)' 'refs/heads/3.2.*' |
   xargs git branch -D

Solution 7 - Git

To delete multiple branches based on a specified pattern do the following:

Open the terminal, or equivalent and type in following commands:

git branch | grep "<pattern>" (preview of the branches based on pattern)

git branch | grep "<pattern>" | xargs git branch -D (replace the <pattern> with a regular expression to match your branch names)

Remove all 3.2.x branches, you need to type

git branch | grep "3.2" | xargs git branch -D

That's all!

You are good to go!

Solution 8 - Git

Maybe You will find this useful:

If You want to remove all branches that are not for example 'master', 'foo' and 'bar'

git branch -D `git branch | grep -vE 'master|foo|bar'`

grep -v 'something' is a matcher with inversion.

Solution 9 - Git

I put my initials and a dash (at-) as the first three characters of the branch name for this exact reason:

git branch -D `git branch --list 'at-*'`

Solution 10 - Git

Keep "develop" and delete all others in local

    git branch | grep -v "develop" | xargs git branch -D 

Solution 11 - Git

If you want to delete multiple branches for cleanup this will work

 git branch -d branch1 branch2 branch3

also if you want to reflect the deletion action to remote you can use this to push them

 git push origin --delete branch1 branch2 branch3

Solution 12 - Git

If you're not limited to using the git command prompt, then you can always run git gui and use the Branch->Delete menu item. Select all the branches you want to delete and let it rip.

Solution 13 - Git

If you really need clean all of your branches, try

git branch -d $(git branch)

It will delete all your local merged branches except the one you're currently checking in.

It's a good way to make your local clean

Solution 14 - Git

You can use git gui to delete multiple branches at once. From Command Prompt/Bash -> git gui -> Remote -> Delete branch ... -> select remote branches you want to remove -> Delete.

Solution 15 - Git

Powershell Solution:

If you're running windows, you can use PowerShell to remove multiple branches at once...

git branch -D ((git branch | Select-String -Pattern '^\s*3\.2\..*') | foreach{$_.ToString().Trim()})
//this will remove all branches starting with 3.2.

git branch -D ((git branch | Select-String -Pattern 'feature-*') | foreach{$_.ToString().Trim()})
// this will delete all branches that contains the word "feature-" as a substring.

You can also fine tune how the pattern matching should work using Powershell's Select-String command. Take a look at powershell docs.

Solution 16 - Git

I made a small function that might be useful based off of the answer provided by @gawi (above).

removeBranchesWithPrefix() {
  git for-each-ref --format="%(refname:short)" refs/heads/$1\* | xargs git branch -d
}

Add that to your .bash_profile and restart your terminal. Then you can call from command-line like this:

removeBranchesWithPrefix somePrefix

Note

I have it currently setup for a soft delete, which means it won't delete the branches unless they've already been merged. If you like to live on the edge, change -d to -D and it will delete everything with the prefix regardless!

Solution 17 - Git

For pure souls who use PowerShell here the small script

git branch -d $(git branch --list '3.2.*' | %{$_.Trim() })

Solution 18 - Git

You might like this little item... It pulls the list and asks for confirmation of each item before finally deleting all selections...

git branch -d `git for-each-ref --format="%(refname:short)" refs/heads/\* | while read -r line; do read -p "remove branch: $line (y/N)?" answer </dev/tty; case "$answer" in y|Y) echo "$line";; esac; done`

Use -D to force deletions (like usual).

For readability, here is that broken up line by line...

git branch -d `git for-each-ref --format="%(refname:short)" refs/heads/\* |
    while read -r line; do 
        read -p "remove branch: $line (y/N)?" answer </dev/tty;
        case "$answer" in y|Y) echo "$line";; 
        esac; 
    done`

here is the xargs approach...

git for-each-ref --format="%(refname:short)" refs/heads/\* |
while read -r line; do 
    read -p "remove branch: $line (y/N)?" answer </dev/tty;
    case "$answer" in 
        y|Y) echo "$line";; 
    esac; 
done | xargs git branch -D

finally, I like to have this in my .bashrc

alias gitselect='git for-each-ref --format="%(refname:short)" refs/heads/\* | while read -r line; do read -p "select branch: $line (y/N)?" answer </dev/tty; case "$answer" in y|Y) echo "$line";; esac; done'

That way I can just say

gitSelect | xargs git branch -D.

Solution 19 - Git

it works correctly for me:

git branch | xargs git branch -d

git branch | xargs git branch -D

delete all local branches

Solution 20 - Git

git branch -d branch1 branch2 branch3 already works, but will be faster with Git 2.31 (Q1 2021).
Before, when removing many branches and tags, the code used to do so one ref at a time.
There is another API it can use to delete multiple refs, and it makes quite a lot of performance difference when the refs are packed.

See commit 8198907 (20 Jan 2021) by Phil Hord (phord).
(Merged by Junio C Hamano -- gitster -- in commit f6ef8ba, 05 Feb 2021)

> ## 8198907795:use delete_refs when deleting tags or branches
> Acked-by: Elijah Newren
> Signed-off-by: Phil Hord

> 'git tag -d'(man) accepts one or more tag refs to delete, but each deletion is done by calling delete_ref on each argv.
> This is very slow when removing from packed refs.
> Use delete_refs instead so all the removals can be done inside a single transaction with a single update.
> > Do the same for 'git branch -d'(man).
> > Since delete_refs performs all the packed-refs delete operations inside a single transaction, if any of the deletes fail then all them will be skipped.
> In practice, none of them should fail since we verify the hash of each one before calling delete_refs, but some network error or odd permissions problem could have different results after this change.
> > Also, since the file-backed deletions are not performed in the same transaction, those could succeed even when the packed-refs transaction fails.
> > After deleting branches, remove the branch config only if the branch ref was removed and was not subsequently added back in.
> > A manual test deleting 24,000 tags took about 30 minutes using delete_ref.
> It takes about 5 seconds using delete_refs.

Solution 21 - Git

Here is a general solution:

git branch | grep "<pattern>" | xargs git branch -D

I would suggest running the following command line before executing the above for a preview of the branches that will be deleted.

git branch | grep "<pattern>"

In this case

git branch | grep "^3\.2\..*" | xargs git branch -D

Solution 22 - Git

Use the following command to remove all branches (checked out branch will not be deleted).

git branch | cut -d '*' -f 1 | tr -d " \t\r" | xargs git branch -d

Edit: I am using a Mac Os

Solution 23 - Git

If you have installed Git GUI, which is a default add-on for Windows, then it's the simplest. You can use ctrl to choose multiple branches and delete them with one click.

Solution 24 - Git

TL;DR

git branch -D $(git branch | grep '3\.2\..*')

Explanation

  1. git branch lists all the branches on your local system.
  2. grep '3\.2\..*' uses pattern matching to find all files in the current working directory starting with 3.2.. Using \ to escape . as it's a special character for grep.
  3. git branch | grep '3\.2\..*' will pass all the github branch names to the grep command which will then look for branch names starting with the string within the list supplied.
  4. $(git branch | grep '3\.2\..*') Anything enclosed within $() will run it as a separate shell command whose result can then be passed on to a separate command. In our case, we would want the list of files found to be deleted.
  5. git branch -D $(git branch | grep '3\.2\..*') This just does what is explained above in Point 4.

Solution 25 - Git

You can use this command: git branch -D $(printf "%s\n" $(git branch) | grep '3.2')

Solution 26 - Git

If you had all the branches to delete in a text file (branches-to-del.txt) (one branch per line), then you could do this to delete all such branches from the remote (origin): xargs -a branches-to-del.txt git push --delete origin

Solution 27 - Git

My specific case was not addressed, so I'm making a new answer...

Scenario:

  • Freshly cloned repo
  • No local branches created
  • Many remote branches (over 100 in my case)
  • I want to delete all the feature branches, feature/myfeature , from the remote

This is the command that I got to work:

git branch  -a | cut -c3- | grep 'origin\/feature' | sed 's/remotes\/origin\///' | xargs git push origin --delete

Thanks to @gwai for putting me on the right track.

Solution 28 - Git

I you're on windows, you can use powershell to do this:

 git branch | grep 'feature/*' |% { git branch -D $_.trim() }

replace feature/* with any pattern you like.

Solution 29 - Git

I just cleaned up a large set of obsolete local/remote branches today.

Below is how I did it:

1. list all branch names to a text file:

git branch -a >> BranchNames.txt

2. append the branches I want to delete to command "git branch -D -r":

git branch -D -r origin/dirA/branch01 origin/dirB/branch02 origin/dirC/branch03 (... append whatever branch names)

3. execute the cmd

And this one works so much faster and reliable than "git push origin --delete".

This may not be the most smart way as listed in other answers, but this one is pretty straight forward, and easy to use.

Solution 30 - Git

If you are using Fish shell, you can leverage the string functions:

git branch -d (git branch -l "<your pattern>" | string trim)

This is not much different from the Powershell options in some of the other answers.

Solution 31 - Git

#deleting branch names  started with 202008*   Tested on centos7

git branch | grep $202008 | xargs git branch -D

you can try

git branch | grep $3.2. | xargs git branch -D

Solution 32 - Git

It can possible to delete all of your existing branches by using the below commands. Note that: exempt *master branch.

git branch | xargs git branch -D

After deleting all of your branches. you can able to see an error notification below. enter image description here.

Solution 33 - Git

As in Git all the branches are nothing by references to the git repo, why don't you just delete the branches going to .git/ref and then if anything is left out which is not interesting in the repository will automatically be garbage collected so you don't need to bother.

Solution 34 - Git

git branch -D <branchName>

Solution 35 - Git

You can remove all the branches removing all the unnecessary refs:

rm .git/refs/heads/3.2.*

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionDougView Question on Stackoverflow
Solution 1 - GitslebetmanView Answer on Stackoverflow
Solution 2 - Git50shadesofbaeView Answer on Stackoverflow
Solution 3 - GitCarl NorumView Answer on Stackoverflow
Solution 4 - GitgawiView Answer on Stackoverflow
Solution 5 - GitK J GorView Answer on Stackoverflow
Solution 6 - GitJakub NarębskiView Answer on Stackoverflow
Solution 7 - GitAnkit JindalView Answer on Stackoverflow
Solution 8 - GitAdrianView Answer on Stackoverflow
Solution 9 - GitAlan TweedieView Answer on Stackoverflow
Solution 10 - GitDanielView Answer on Stackoverflow
Solution 11 - GitmcvkrView Answer on Stackoverflow
Solution 12 - GitEfpophisView Answer on Stackoverflow
Solution 13 - GitYulinView Answer on Stackoverflow
Solution 14 - GitTerry TruongView Answer on Stackoverflow
Solution 15 - GitImtiaz Shakil SiddiqueView Answer on Stackoverflow
Solution 16 - GitLoganView Answer on Stackoverflow
Solution 17 - GitcodevisionView Answer on Stackoverflow
Solution 18 - GitChaos CrafterView Answer on Stackoverflow
Solution 19 - GitvelastiquiView Answer on Stackoverflow
Solution 20 - GitVonCView Answer on Stackoverflow
Solution 21 - GitFrancis BaconView Answer on Stackoverflow
Solution 22 - GitILYAS_KerbalView Answer on Stackoverflow
Solution 23 - GitpeizView Answer on Stackoverflow
Solution 24 - GitSaurish KarView Answer on Stackoverflow
Solution 25 - GitHieu DangView Answer on Stackoverflow
Solution 26 - Gitcode4kixView Answer on Stackoverflow
Solution 27 - GitDavid RousselView Answer on Stackoverflow
Solution 28 - GitMo ValipourView Answer on Stackoverflow
Solution 29 - GitRainCastView Answer on Stackoverflow
Solution 30 - GitmdiinView Answer on Stackoverflow
Solution 31 - GitUmut SurmeliView Answer on Stackoverflow
Solution 32 - GitShofiqView Answer on Stackoverflow
Solution 33 - GitDebajitView Answer on Stackoverflow
Solution 34 - GitAakash PahujaView Answer on Stackoverflow
Solution 35 - GitArtur OwczarekView Answer on Stackoverflow