How do I delete a Git branch locally and remotely?

Created 05.01.2010 01:12
Viewed 8.79M times
17935 votes

I want to delete a branch both locally and remotely.

Failed Attempts to Delete a Remote Branch

$ git branch -d remotes/origin/bugfix
error: branch 'remotes/origin/bugfix' not found.

$ git branch -d origin/bugfix
error: branch 'origin/bugfix' not found.

$ git branch -rd origin/bugfix
Deleted remote branch origin/bugfix (was 2a14ef7).

$ git push
Everything up-to-date

$ git pull

* [new branch] bugfix -> origin/bugfix
Already up-to-date.

What should I do differently to successfully delete the remotes/origin/bugfix branch both locally and remotely?

Moderator note: If you intend to answer this question, do note that there are already 40 answers posted. Will your new answer add any substantial value? by Robert Harvey, 11.06.2014 16:10
Note: for Git 2.5+ (Q2 2015), the exact message will be "deleted remote-tracking branch": see… by VonC, 25.05.2015 14:57
You may be interested in this script which simplifies the difference between deleting a local branch AND a remote one: by Mig, 12.09.2019 10:11
@RobertHarvey only 39 now by Adam, 28.11.2019 18:57
@Adam: 81. 42 answers were deleted for various reasons. The public's unexplained obsession with a particular topic is one of life's greatest mysteries. by Robert Harvey, 30.11.2019 15:21
Skip the first few answers and just jump down to the best one: To delete a git branch, there are actually 3 different branches to delete! This answer makes that fact clear. by Gabriel Staples, 03.04.2020 20:37
@GabrielStaples Without context, your comment is confusing. Are the "best" rated answers wrong somehow? by Nathan, 19.06.2020 04:32
@Nathan, no, they're not wrong, but they don't teach what you don't know you don't know, whereas the one I link to makes this critical unknown unknown become a known unknown and then a known known. I didn't know you had a 1) local branch, 2) locally-stored remote-tracking branch, and 3) remote branch until I read that answer. Prior to that I thought there was only a local branch and remote branch. The locally-stored remote-tracking branch was an unknown unknown. Making it go from that to a known known is what makes that answer the best. by Gabriel Staples, 18.11.2020 23:06
I wanted to add a note that one cannot delete a branch on which one is currently working upon. I have made this rookie mistake so thought if this could help. :) by cRAN, 09.02.2021 14:28
Show remaining 4 comments
Answers 39

Executive Summary

$ git push -d <remote_name> <branch_name>
$ git branch -d <branch_name>

Note that in most cases the remote name is origin. In such a case you'll have to use the command like so.

$ git push -d origin <branch_name>

Delete Local Branch

To delete the local branch use one of the following:

$ git branch -d branch_name
$ git branch -D branch_name

Note: The -d option is an alias for --delete, which only deletes the branch if it has already been fully merged in its upstream branch. You could also use -D, which is an alias for --delete --force, which deletes the branch "irrespective of its merged status." [Source: man git-branch]
Also note that git branch -d branch_name will fail if you are currently in the branch you want to remove. The message starts with error: Cannot delete the branch 'branch_name'. If so, first switch to some other branch, for example: git checkout main.

Delete Remote Branch [Updated on 8-Sep-2017]

As of Git v1.7.0, you can delete a remote branch using

$ git push <remote_name> --delete <branch_name>

which might be easier to remember than

$ git push <remote_name> :<branch_name>

which was added in Git v1.5.0 "to delete a remote branch or a tag."

Starting on Git v2.8.0 you can also use git push with the -d option as an alias for --delete.

Therefore, the version of Git you have installed will dictate whether you need to use the easier or harder syntax.

Delete Remote Branch [Original Answer from 5-Jan-2010]

From Chapter 3 of Pro Git by Scott Chacon:

Deleting Remote Branches

Suppose you’re done with a remote branch — say, you and your collaborators are finished with a feature and have merged it into your remote’s main branch (or whatever branch your stable code-line is in). You can delete a remote branch using the rather obtuse syntax git push [remotename] :[branch]. If you want to delete your server-fix branch from the server, you run the following:

$ git push origin :serverfix
 - [deleted]         serverfix

Boom. No more branches on your server. You may want to dog-ear this page, because you’ll need that command, and you’ll likely forget the syntax. A way to remember this command is by recalling the git push [remotename] [localbranch]:[remotebranch] syntax that we went over a bit earlier. If you leave off the [localbranch] portion, then you’re basically saying, “Take nothing on my side and make it be [remotebranch].”

I issued git push origin: bugfix and it worked beautifully. Scott Chacon was right—I will want to dog ear that page (or virtually dog ear by answering this on Stack Overflow).

Then you should execute this on other machines

# Fetch changes from all remotes and locally delete 
# remote deleted branches/tags etc
# --prune will do the job :-;
git fetch --all --prune

to propagate changes.

05.01.2010 01:13
Don't forget to do a git fetch --all --prune on other machines after deleting the remote branch on the server. ||| After deleting the local branch with git branch -d and deleting the remote branch with git push origin --delete other machines may still have "obsolete tracking branches" (to see them do git branch -a). To get rid of these do git fetch --all --prune. by Trevor Boyd Smith, 27.05.2015 16:51
in addition to @TrevorBoydSmith's git branch -a to view all branches, you can also use git branch -r to view remote branches only. see also git remote show origin - source:‌​ml by Sandra, 09.09.2015 09:53
I had to run git branch -D Branch_Name to get rid of the local branch by Kolob Canyon, 10.03.2016 01:32
@KolobCanyon You only have to use -D if the branch has not been merged into another branch. by BTRUE, 05.04.2016 16:27
The question was "What do I need to do differently to successfully delete the remotes/origin/bugfix branch both locally and on GitHub?" After running the commands in your updated answer, the local branch is still present. It would be nice if the accepted answer was a complete answer. Its absolutely amazing at how difficult Git makes simple tasks... by jww, 07.06.2016 02:15
Really appreciate the executive summary at the beginning. I'll add that I also had to change the second command to -D to confirm I wanted to delete while there were unmerged changes. by Jordan Gray, 04.01.2017 15:33
I am getting error: Cannot delete the branch '19_jan_improvements_post_v1' which you are currently on. when I am trying to delete a local branch, which I am working on that branch. I am not able to checkout to a different branch also, because I have to merge some files and so it gives this error - error: you need to resolve your current index first. What to do if I just don't care about merging those files and anyway want to get rid of the local branch. by Sandeepan Nath, 19.01.2017 10:00
Doesn't work if you in the branch. Need to to do a git checkout master or whatever to get out of the branch prior. by Kelly, 16.05.2017 03:08
To better understand the git push origin :<branch_name> syntax, go to… by Alex, 16.08.2017 14:27
Note that the -d as an alias for --delete also works with the push call. So git push origin -d <branch_name> works too by Sheldon, 24.08.2017 12:13
Why do I need to specify remote when pushing? by Alex78191, 19.09.2017 00:46
@Alex78191 Because you may not want to push your branch to all your remotes. However I use this alias when I want to push all my branch to all my remotes. by Philip Rego, 26.10.2017 20:38
@Sheldon Which git version are you using? For me (git 2.7.4) -d is not working for push. by luator, 01.12.2017 14:57
@luator I am using 2.8.1, and my apologies, -d as an alias for --delete was added in 2.8.0, see here:… by Sheldon, 01.12.2017 16:53
You can use source tree tool as well if you don't want to remember git commands. by user1101733, 22.02.2018 14:42
Only $ git push <remote_name> :<branch_name> worked for me. by Christophe Roussy, 22.05.2018 14:44
The --delete might be easier to remember, but it's too late if you already understand the push remote :deadbr, plus the cute thing about the latter is that it also works for tags. by Alois Mahdal, 09.07.2018 21:52
In the executive summary you have git push --delete <remote_name> <branch_name> but in the first "Delete Remote Branch Update" section you have git push <remote_name> --delete <branch_name>. i.e. The parameters are in a different order. Can I suggest making these the same to avoid confusion please. by Caltor, 29.11.2018 11:28
I ran the first line of the executive summary and the second wasn't "needed"(?). The branch is gone both locally and remotely. by Daniel Springer, 27.12.2018 15:28
@DanielSpringer That shouldn't be the case. It will delete the remote branch origin/mybranch in your repo and on the server, but it won't delete any local tracking branches (mybranch). by Timmmm, 24.01.2019 17:01
@Timmmm either I ran it before and forgot, or... I don’t know :P by Daniel Springer, 24.01.2019 17:17
Note that this can fail with ! [remote rejected] <branch_name> (refusing to delete the current branch: refs/heads/<branch_name>) error: failed to push some refs to '<org_name>/<project_name>.git' if you have set this branch in Github as your default branch. If you have, go to your project in Github -> "Settings" -> "Branches" and then change your Default Branch to another. Then repeating your command to delete the branch will work. by stwr667, 14.02.2019 08:08
This answer shows how to delete a branch on a specific remote. For consistency, the prune step should also be limited to that specific remote. Drop the --all option and specify the remote: git fetch --prune <remote_name>. by Robin A. Meade, 20.09.2019 20:45
This can be piped into other commands like grep to filter out branches you do not want to delete git branch --merged | grep -v "\$BRANCHNAME\b" | xargs git branch -d by Andy Macleod, 06.05.2020 10:45
I just wanted to remove an entry from the git remote -v list (I correct: 2 entries, namely the upstream ones) and came across this post. Well my solution is to remove the remote branch from .git/config editing this file. I added them by accident with git remote add .. by Timo, 21.11.2020 10:50
If the repository is deleted and you need to delete the local branch tracking the remote branch, use git branch -d -r <remote>/<branch> by Dror Bar, 28.01.2021 14:00
Is it necessary to push changes after deleting a remote branch? by a.ak, 02.03.2021 13:06
Show remaining 22 comments

Matthew's answer is great for removing remote branches and I also appreciate the explanation, but to make a simple distinction between the two commands:

To remove a local branch from your machine:

git branch -d {the_local_branch} (use -D instead to force deleting the branch without checking merged status)

To remove a remote branch from the server:

git push origin --delete {the_remote_branch}

Reference: Git: Delete a branch (local or remote)

12.06.2012 14:51
@megido well -D force deletes, -d gives you a warning if it's not already merged in. by TankorSmash, 06.11.2014 19:04
If your local branch is not merge with master and ran 'git branch -d your_branch then you will error like error: The branch 'your_branch' is not fully merged. If you are sure you want to delete it, run 'git branch -D your_branch'. by geeks, 31.10.2015 12:59
I would suggest using -d instead of -D because it is safer. If -d fails due to unmerged commits then you need to assess that and if it is definitely OK to remove then use -D. by rooby, 02.02.2016 03:47
Others with repository clones where remote branches have been removed should run git remote prune <name> (e.g. git remote prune origin) in order to locally remove stale branches that no longer exist in the remote. by code_dredd, 18.04.2016 23:07
If your branch in your fork (not always origin), use the proper repository. e.g. git push myRepo :mrbranchtodelete by Dhanuka777, 19.05.2016 00:53
I would like to add that -d gives a warning if it isn't merged in with the current HEAD. If you need clarity I recommend this command git branch -a --merged origin/master It will list any branches, both local and remote; that have been merged into master. Additional information here by Eric, 10.02.2017 13:10
@Eric-Brotto For your answer to be complete, you need to add the git fetch -p command to fetch changes on other machines by SebMa, 22.03.2020 20:54
> well -D force deletes, -d gives you a warning if it's not already merged in. \n\n Pretty bad naming if you ask me. Should be -df or -d --force. by Charming Robot, 05.07.2020 13:45
If the repository is deleted and you need to delete the local branch tracking the remote branch, use git branch -d -r <remote>/<branch> by Dror Bar, 28.01.2021 14:00
Show remaining 4 comments

The short answers

If you want more detailed explanations of the following commands, then see the long answers in the next section.

Deleting a remote branch

git push origin --delete <branch>  # Git version 1.7.0 or newer
git push origin -d <branch>        # Shorter version (Git 1.7.0 or newer)
git push origin :<branch>          # Git versions older than 1.7.0

Deleting a local branch

git branch --delete <branch>
git branch -d <branch> # Shorter version
git branch -D <branch> # Force-delete un-merged branches

Deleting a local remote-tracking branch

git branch --delete --remotes <remote>/<branch>
git branch -dr <remote>/<branch> # Shorter

git fetch <remote> --prune # Delete multiple obsolete remote-tracking branches
git fetch <remote> -p      # Shorter

The long answer: there are three different branches to delete!

When you're dealing with deleting branches both locally and remotely, keep in mind that there are three different branches involved:

  1. The local branch X.
  2. The remote origin branch X.
  3. The local remote-tracking branch origin/X that tracks the remote branch X.

Visualization of three branches

The original poster used:

git branch -rd origin/bugfix

Which only deleted his local remote-tracking branch origin/bugfix, and not the actual remote branch bugfix on origin.

Diagram 2

To delete that actual remote branch, you need

git push origin --delete bugfix

Diagram 3

Additional details

The following sections describe additional details to consider when deleting your remote and remote-tracking branches.

Pushing to delete remote branches also removes remote-tracking branches

Note that deleting the remote branch X from the command line using a git push will also remove the local remote-tracking branch origin/X, so it is not necessary to prune the obsolete remote-tracking branch with git fetch --prune or git fetch -p. However, it wouldn't hurt if you did it anyway.

You can verify that the remote-tracking branch origin/X was also deleted by running the following:

# View just remote-tracking branches
git branch --remotes
git branch -r

# View both strictly local as well as remote-tracking branches
git branch --all
git branch -a

Pruning the obsolete local remote-tracking branch origin/X

If you didn't delete your remote branch X from the command line (like above), then your local repository will still contain (a now obsolete) remote-tracking branch origin/X. This can happen if you deleted a remote branch directly through GitHub's web interface, for example.

A typical way to remove these obsolete remote-tracking branches (since Git version 1.6.6) is to simply run git fetch with the --prune or shorter -p. Note that this removes all obsolete local remote-tracking branches for any remote branches that no longer exist on the remote:

git fetch origin --prune
git fetch origin -p # Shorter

Here is the relevant quote from the 1.6.6 release notes (emphasis mine):

"git fetch" learned --all and --multipleoptions, to run fetch from many repositories, and --prune option to remove remote tracking branches that went stale. These make "git remote update" and "git remote prune" less necessary (there is no plan to remove "remote update" nor "remote prune", though).

Alternative to above automatic pruning for obsolete remote-tracking branches

Alternatively, instead of pruning your obsolete local remote-tracking branches through git fetch -p, you can avoid making the extra network operation by just manually removing the branch(es) with the --remote or -r flags:

git branch --delete --remotes origin/X
git branch -dr origin/X # Shorter

See Also

30.05.2014 18:32
From your illustration, I can see there are local clone repo and remote origin repo. So there are at least two physical branches. Where is the third branch to delete? Is the third branch only a pointer pointing to a commit in the local clone repo? by huggie, 18.02.2016 02:00
@huggie that's pretty much correct. Branches in Git are just bookmarks attached to commits. So in my graphs above, there are X and origin/X bookmarks in the local clone (2 branches), and then there is X on the remote (making 3 branches). by User, 23.02.2016 07:33
+1 for the remote tracking branch. This branch is what causes issues when you clone someone else's branch. It keeps on tracking your commits and asking you if you want to push to that person's branch. by Kermit_ice_tea, 21.06.2017 19:48
For the sake of future readers: What @Kermit_ice_tea is talking about above is a local branch (as described in this answer), not a remote-tracking branch. When a local branch has an "upstream branch" configured for it, it will by default pull from and push to that remote branch. A local branch that has an "upstream branch" set on it is referred to as a "tracking branch", so it's easy to confuse with remote-tracking branches due to the similar terminology. by David P, 05.03.2020 11:21
I've read all the answers down to here and this is for sure the best answer I've read so far!--(and probably the best one on this page, period). This is especially true because it's the only answer which states this REALLY IMPORTANT fact that I never knew before: "there are 3 different branches to delete!" I had no idea! This all makes so much more sense now, and it sheds so much light on all the other answers here now too. Thanks! by Gabriel Staples, 03.04.2020 20:35
What happens if you run git fetch --prune, withOUT specifying the remote branch? Does it prune all remotes? by Gabriel Staples, 05.01.2021 00:08
It should be noted that running git push origin --delete <branch>, as far as I can tell, ALSO deletes the locally-stored remote-tracking branch named origin/branch. So, to delete the remote branch AND locally-stored remote-tracking branch in one command, just use git push origin --delete <branch>. Then, you just need to delete the local branch with git branch -D branch. That covers the deletion of all 3 branches with only 2 commands. by Gabriel Staples, 05.01.2021 00:40
Show remaining 2 comments

Steps for deleting a branch:

For deleting the remote branch:

git push origin --delete <your_branch>

For deleting the local branch, you have three ways:

1: git branch -D <branch_name>

2: git branch --delete --force <branch_name>  # Same as -D

3: git branch --delete  <branch_name>         # Error on unmerge

Explain: OK, just explain what's going on here!

Simply do git push origin --delete to delete your remote branch only, add the name of the branch at the end and this will delete and push it to remote at the same time...

Also, git branch -D, which simply delete the local branch only!...

-D stands for --delete --force which will delete the branch even it's not merged (force delete), but you can also use -d which stands for --delete which throw an error respective of the branch merge status...

I also create the image below to show the steps:

Delete a remote and local branch in git

27.06.2017 13:13
git branch -a will display local and remote branches.It will be help for you diagram introduce. by LoranceChen, 27.07.2017 03:01
note that if you are setting on the branch you want to delete, you need to checkout a branch other than the one you need to delete (eg: master) before deleting the local branch. by BaDr Amer, 28.05.2018 08:43
When branches get deleted on origin, your local repository won't take notice of that. You'll still have your locally cached versions of those branches (which is actually good) but git branch -a will still list them as remote branches. You can clean up that information locally like this: git remote prune origin Your local copies of deleted branches are not removed by this. The same effect is achieved by using git fetch --prune by vibs2006, 08.05.2019 06:33
The image is distracting and very large and adds nothing to the answer. I hope this does not become a trend on SO. by jmiserez, 06.09.2019 10:31

You can also use the following to delete the remote branch

git push --delete origin serverfix

Which does the same thing as

git push origin :serverfix

but it may be easier to remember.

27.10.2011 22:22
...and safer to use :O by cst1992, 29.11.2017 07:31
You forgot the part about deleting the local branch which can be done by: git branch -d <local_branch> or git branch -D <local_branch> for force deleting by Amit Dash, 14.02.2018 04:23

Tip: When you delete branches using

git branch -d <branchname> # Deletes local branch


git push origin :<branchname> # Deletes remote branch

only the references are deleted. Even though the branch is actually removed on the remote, the references to it still exists in the local repositories of your team members. This means that for other team members the deleted branches are still visible when they do a git branch -a.

To solve this, your team members can prune the deleted branches with

git remote prune <repository>

This is typically git remote prune origin.

07.11.2012 13:02
You should clarify that the above git push operation deletes the local branch and the remote branch. by Annika Backstrom, 21.05.2013 13:51
Note that git remote prune is a somewhat obsolete way to remove obsolete remote-tracking branches, the newer way to do it is to use git fetch --prune or git fetch -p. by User, 11.06.2014 16:30
@RRMadhav, indeed you won't see the deleted branch after deleting it since the reference to the remote branch will be removed for you locally. Anyone else on your team that has checked out that branch will still have that reference and will still see it unless they prune the branch. by pfrenssen, 05.12.2014 14:27

If you want to delete a branch, first checkout to the branch other than the branch to be deleted.

git checkout other_than_branch_to_be_deleted

Deleting the local branch:

git branch -D branch_to_be_deleted

Deleting the remote branch:

git push origin --delete branch_to_be_deleted
07.10.2014 13:52

It's very simple:

To delete the remote branch

git push -d origin <branch-name>


git push origin :<branch-name>

-- You can also delete tags with this syntax

To forcefully delete local branch

git branch -D <branch-name>

Note: do a git fetch --all --prune on other machines after deleting remote branch, to remove obsolete tracking branches.

Happy Coding :)

07.12.2017 13:29
I needed to use --delete instead of -d to delete remote branch. by ZakJ, 10.12.2017 23:22
-d option is an alias for --delete and if --delete work then -d should also work, if you forcefully want to delete a branch you can use -D instead of -d or --delete. by Vivek Maru, 18.12.2017 09:48
git branch -D <name-of-branch>
git branch -D -r origin/<name-of-branch>
git push origin :<name-of-branch>
24.10.2013 17:36
Note that -D forces the deletion. It's always better to use -d, which will remind if you need to do something dangerous. by Jonathon Reinhart, 10.01.2015 01:08
ahahah :) it's up to you: use -d if you want to see git crying or -D if you want to cry. by Felipe, 13.02.2015 11:21

This is simple: Just run the following command:

To delete a Git branch both locally and remotely, first delete the local branch using this command:

git branch -d example

(Here example is the branch name.)

And after that, delete the remote branch using this command:

git push origin :example
15.02.2015 15:20

Another approach is:

git push --prune origin

WARNING: This will delete all remote branches that do not exist locally. Or more comprehensively,

git push --mirror

will effectively make the remote repository look like the local copy of the repository (local heads, remotes and tags are mirrored on remote).

18.11.2012 06:11
git push --prune origin didn't do anything for me on gitlab: git clone git://repo.git; git branch -d -r origin/some-branches; git push --prune origin; yields: Everything up-to-date; git fetch; brings locally deleted branches back; git push --mirror; now they are really gone! by eMBee, 08.10.2015 16:46

I use the following in my Bash settings:

alias git-shoot="git push origin --delete"

Then you can call:

git-shoot branchname
02.04.2013 22:11
I ended up just add the alias "shoot" into my .gitconfig shoot = push origin --delete by hdost, 04.12.2014 18:06
If your origin is a Atlassian Stash and the branch is set as the default, you will get an error "By default, deleting the current branch is denied...". I had to change the default branch in Stash to point to another branch before I could delete. by neoscribe, 12.12.2014 00:29
This is perfectly simple as you've done it, but fyi git also lets you make custom commands. Put git push origin --delete $1 in a file on your path called git-shoot and git shoot branchname will work too. by mahemoff, 14.10.2015 07:09
this is a good solution by yourson, 01.01.2021 04:41

Since January 2013, GitHub included a Delete branch button next to each branch in your "Branches" page.

Relevant blog post: Create and delete branches

29.04.2013 10:39
I only started using Github this year, so I was wondering why this was such a highly rated question, and why none of the top answers were suggesting to just delete it from the Github web interface! Interesting that it's only a recent addition. by Cam Jackson, 11.09.2013 12:18
I was going to point this one out. Note that the button won't delete your local branch... see this answer for how to do that: by ArtOfWarfare, 29.10.2013 14:02

Delete locally:

To delete a local branch, you can use:

git branch -d <branch_name>

To delete a branch forcibly, use -D instead of -d.

git branch -D <branch_name>

Delete remotely:

There are two options:

git push origin :branchname

git push origin --delete branchname

I would suggest you use the second way as it is more intuitive.

23.05.2015 08:56

If you want to complete both these steps with a single command, you can make an alias for it by adding the below to your ~/.gitconfig:

    rmbranch = "!f(){ git branch -d ${1} && git push origin --delete ${1}; };f"

Alternatively, you can add this to your global configuration from the command line using

git config --global alias.rmbranch \
'!f(){ git branch -d ${1} && git push origin --delete ${1}; };f'

NOTE: If using -d (lowercase d), the branch will only be deleted if it has been merged. To force the delete to happen, you will need to use -D (uppercase D).

15.01.2013 19:05
This is what I was looking for. My own shell function alias didn't work (Unexpected EOF) and I couldn't figure out why, but this works great! The only change I made was replacing && with ; so that even if the first command fails the second will still execute (sometimes only local or only remote exists). by user1021726, 16.12.2014 08:55

To delete your branch locally and remotely

  • Checkout to master branch - git checkout master

  • Delete your remote branch - git push origin --delete <branch-name>

  • Delete your local branch - git branch --delete <branch-name>

03.01.2016 21:08

You can also do this using git remote prune origin

$ git remote prune origin
Pruning origin
 * [pruned] origin/some-branchs

It prunes and deletes remote-tracking branches from a git branch -r listing.

12.03.2013 14:57

In addition to the other answers, I often use the git_remote_branch tool. It's an extra install, but it gets you a convenient way to interact with remote branches. In this case, to delete:

grb delete branch

I find that I also use the publish and track commands quite often.

24.03.2012 02:21
this is a good solution by yourson, 01.01.2021 04:41

A one-liner command to delete both local, and remote:

D=branch-name; git branch -D $D; git push origin :$D

Or add the alias below to your ~/.gitconfig. Usage: git kill branch-name

    kill = "!f(){ git branch -D \"$1\";  git push origin --delete \"$1\"; };f"
17.11.2016 01:03
⚠️ Use git branch -D carefully in a script, since it force-deletes a branch without checking it has been merged. Use -d to be safe. by caesarsol, 13.03.2017 14:05

Deleting Branches

Let's assume our work on branch "contact-form" is done and we've already integrated it into "master". Since we don't need it anymore, we can delete it (locally):

$ git branch -d contact-form

And for deleting the remote branch:

git push origin --delete contact-form
30.10.2015 12:39

Now you can do it with the GitHub Desktop application.

After launching the application

  1. Click on the project containing the branch
  2. Switch to the branch you would like to delete

    Switching branch

  3. From the "Branch" menu, select, "Unpublish...", to have the branch deleted from the GitHub servers.

    Unpublish branch

  4. From the "Branch" menu, select, 'Delete "branch_name"...', to have the branch deleted off of your local machine (AKA the machine you are currently working on)

    Delete local branch

22.10.2015 07:38
I didn't downvote, but my thinking is that it isn't substantively helping. The question is obviously asking for a more commandline type answer without having to use an external program, if people were clicking into here, they likely won't be looking for a github for desktop ways. by Daemedeor, 06.11.2015 11:51
@Daemedeor , I dissagree. In 2010 when the OP asked the question, the UI way of doing it didn't exist and the only option was command line. To indicate that you want a command line only option it should be stated in the question or with the tag, command-line-interface, which in this case is no present. by Eric, 06.11.2015 16:00
The git command for deleting a remote branch sucks and I tend to forget it (both new and old). Luckily there are GUI tools that have the option. Git Gui, TortoiseGit and GitHub Desktop have it - I wish Git Extensions had this functionality too. Anyway, what I remember is to start Git Gui from within Git Extensions when I need to delete a remote branch. by vezenkov, 25.03.2016 21:59

Delete remote branch

git push origin :<branchname>

Delete local branch

git branch -D <branchname>

Delete local branch steps:

  1. checkout to another branch
  2. delete local branch
31.12.2015 09:22
Does the remote branch deletion requires "git push" afterwards ? by Samitha Chathuranga, 17.02.2016 08:32
@SamithaChathuranga no, git push origin :<branchname> already pushes an 'empty` branch to the remote (hence deletes the remote branch) by Michał Szajbe, 09.06.2017 22:20

Simply say:

git branch -d <branch-name>
git push origin :<branch-name>
23.04.2015 18:06
This works if its your own branch. But if you are pruning all unneeded branches in the repo (some of which aren't yours) it wouldn't suffice by Kermit_ice_tea, 30.06.2016 22:23
git push origin --delete <branch Name>

is easier to remember than

git push origin :branchName
02.05.2015 10:59

To delete locally - (normal)

git branch -d my_branch

If your branch is in a rebasing/merging progress and that was not done properly, it means you will get an error, Rebase/Merge in progress, so in that case, you won't be able to delete your branch.

So either you need to solve the rebasing/merging. Otherwise, you can do force delete by using,

git branch -D my_branch

To delete in remote:

git push --delete origin my_branch

You can do the same using:

git push origin :my_branch   # Easy to remember both will do the same.

Graphical representation:

Enter image description here

23.06.2017 06:42

This won't work if you have a tag with the same name as the branch on the remote:

$ git push origin :branch-or-tag-name
error: dst refspec branch-or-tag-name matches more than one.
error: failed to push some refs to ''

In that case you need to specify that you want to delete the branch, not the tag:

git push origin :refs/heads/branch-or-tag-name

Similarly, to delete the tag instead of the branch you would use:

git push origin :refs/tags/branch-or-tag-name
29.07.2014 09:02
This is fine, but people really shouldn't be naming their branches and tags with the same name and same naming scheme in the first place. by User, 29.07.2014 10:00
Well, my scenario was that I was converting a branch to a tag and it made sense for the tag to have the same name as the branch. By converting I mean merging branch B to A and tagging the last commit in branch B with tag B so that after deleting branch B it can still be easily restored by simply checking out tag B. by Greg, 30.07.2014 11:59
More on the : and why it deletes by Timo, 12.04.2021 18:50
I get still the same error error: failed to push some refs to '' when git push origin :refs/heads/main. Probably github is the culprit. by Timo, 12.04.2021 18:52

I got sick of googling for this answer, so I took a similar approach to the answer that crizCraig posted earlier.

I added the following to my Bash profile:

function gitdelete(){
    git push origin --delete $1
    git branch -D $1

Then every time I'm done with a branch (merged into master, for example) I run the following in my terminal:

gitdelete my-branch-name

...which then deletes my-branch-name from origin as as well as locally.

10.02.2016 19:47
expanding on this, --delete "$@" and -D "$@" instead of $1 will handle it for multiple branches. by kunl, 27.06.2016 13:15
I suggest running git branch -d (with lowercase 'd') first to ensure changes have been merged, and then push if successful (put && in between commands) by bryn, 19.07.2016 14:17

Many of the other answers will lead to errors/warnings. This approach is relatively fool proof although you may still need git branch -D branch_to_delete if it's not fully merged into some_other_branch, for example.

git checkout some_other_branch
git push origin :branch_to_delete
git branch -d branch_to_delete

Remote pruning isn't needed if you deleted the remote branch. It's only used to get the most up-to-date remotes available on a repository you're tracking. I've observed git fetch will add remotes, not remove them. Here's an example of when git remote prune origin will actually do something:

User A does the steps above. User B would run the following commands to see the most up-to-date remote branches:

git fetch
git remote prune origin
git branch -r
27.11.2013 03:04

Before executing

git branch --delete <branch>

make sure you determine first what the exact name of the remote branch is by executing:

git ls-remote

This will tell you what to enter exactly for <branch> value. (branch is case sensitive!)

20.05.2016 21:42

According to the latest document using a terminal we can delete in the following way.

Delete in local:

git branch -D usermanagement

Delete in remote location:

git push --delete origin usermanagement
23.10.2017 11:23
I really have no idea why git command is so inconsistent and unintuitive to remember. Looks at the deletion, one is -D, another one is -d|--delete by Honghao Zhang, 01.12.2020 09:18
This is the only solution that worked for me +1. by Yahya, 02.02.2021 22:56


git push origin :bugfix  # Deletes remote branch
git branch -d bugfix     # Must delete local branch manually

If you are sure you want to delete it, run

git branch -D bugfix

Now to clean up deleted remote branches run

git remote prune origin
21.04.2016 16:49

Here is a mashup of all the other answers. It requires Ruby 1.9.3+ and is tested only on OS X.

Call this file git-remove, make it executable, and put it in your path. Then use, for example, git remove temp.

#!/usr/bin/env ruby
require 'io/console'

if __FILE__ == $0
      branch_name = ARGV[0] if (ARGV[0])
      print "Press Y to force delete local and remote branch #{branch_name}..."
    response = STDIN.getch
    if ['Y', 'y', 'yes'].include?(response)
      puts "\nContinuing."
      `git branch -D #{branch_name}`
      `git branch -D -r origin/#{branch_name}`
      `git push origin --delete #{branch_name}`
      puts "\nQuitting."
19.11.2013 21:02
@chhh then you need to extend this functionality to make this a variable instead of an assumption. by Dan Rosenstark, 05.12.2014 16:44
sorry, but install Ruby for that kind of work ? More logical is implementation on bash, which will work out of box. by Reishin, 21.05.2015 19:37
@Reishin Ruby is installed on the box just like Bash, at least on OSX. Please see:…, where this topic has been discarded as opinion-based by SO. by Dan Rosenstark, 21.05.2015 20:03
@Yar this link is out of the context and have a more broader scope. I tell only about git and as topic is not originated only for OSX, that choose is strange for other systems (e.g. *UNIX, Windows) by Reishin, 21.05.2015 20:33

I added the following aliases to my .gitconfig file. This allows me to delete branches with or without specifying the branch name. Branch name is defaulted to the current branch if no argument is passed in.

    branch-name = rev-parse --abbrev-ref HEAD     

    rm-remote-branch = !"f() { branch=${1-$(git branch-name)}; git push origin :$branch; }; f"
    rm-local-branch = !"f() { branch=${1-$(git branch-name)}; git checkout master; git branch -d $branch; }; f"
    rm-branch-fully = !"f() { branch=${1-$(git branch-name)}; git rm-local-branch $branch; git rm-remote-branch $branch; }; f"
22.02.2017 17:20
Be careful with de -D option. In a batch consider using lower -d by Alwin Kesler, 04.03.2017 11:41
In my case, I'm almost always deleting after merging (or without the need to merge). Using lower -d will require the branch be merged before deleting, using -D forces the branch deletion. by Jared Knipp, 05.03.2017 05:45

An alternative option to the command line for deleting remote branches is the GitHub branches page.

See for example:

Found in the Code -> Branches page of a GitHub repository.

I generally prefer command line myself but this GitHub page shows you lots more information about the branches, such as last updated date and user, and number of commits ahead and behind. It is useful when dealing with a large number of branches.

04.02.2016 23:34

There are good answers, but, in case that you have a ton of branches, deleting them one by one locally and remotely, would be a tedious tasks. You can use this script to automate these tasks.

branch_not_delete=( "master" "develop" "our-branch-1" "our-branch-2")

for branch in `git branch -a | grep remotes | grep -v HEAD | grep -v master`; do

    # Delete prefix remotes/origin/ from branch name
    branch_name="$(awk '{gsub("remotes/origin/", "");print}' <<< $branch)"

    if ! [[ " ${branch_not_delete[*]} " == *" $branch_name "* ]]; then
        # Delete branch remotly and locally
        git push origin :$branch_name
  • List the branches that you don't want to delete
  • Iterate over the remote's branches and if they aren't in our "preserve list", deleted them.

Source: Removing Git branches at once

04.08.2016 20:15
you must disclose affiliation when linking to external resources you're the author of. by Jean-François Fabre, 07.12.2020 12:18

Using Git Bash you can execute the following:

git branch --delete <branch>



From the GitHub desktop application, when you have the branch checked out, you can delete the local branch via the Branch menu strip:

Enter image description here

If you are not using the GitHub desktop application and are using an IDE like Visual Studio for your local source control, all you have to do is a couple of quick steps:

  1. Check out a branch other than the one you wish to delete.
  2. Right-click the branch you wish to delete.
  3. Select the Delete option from the context menu.

Then, once logged in to your GitHub account online, go to the repository and click the All Branches tab. From there, just click the little trash can icon on the right on the name of the branch you wish to delete.

Enter image description here

*Keep in mind - if the branch isn't published, there isn't any need to try to delete it from your online repository.

12.02.2017 21:25
I don't see these Overview, Yours, Active, State and All branches tab on GitHub website. Looks like this is an old snapshot. Under the Code tab, I see sub-tabs like commits, branches, releases and contributors. When I am the owner of a repository then I see an additional tab named MIT. by RBT, 01.08.2017 09:00
git branch --delete <branch> doesn't delete a remote branch, you need git push <server> --delete <branch> to do that by Sheldon, 24.08.2017 12:15

I created the following convenient function in my .bash_aliases file:

    if [[ -n $1 ]]; then
        git checkout master > /dev/null;
        echo "Deleting local $branch_name branch...";
        git branch -D "$branch_name";
        echo "Deleting remote $branch_name branch...";
        git push origin --delete "$branch_name";
        git remote prune origin;
        echo "Your current branches are:";
        git branch -a;
        echo "Usage: git-delete-branch <branch_name>";
25.09.2017 19:20

The most flexible way is to use a custom Git command. For example, create the following Python script somewhere in your $PATH under the name git-rmbranch and make it executable:

#!/usr/bin/env python3

import argparse
import subprocess
import sys

def rmbranch(branch_name, remote, force):
        print(['git', 'branch', '-D' if force else '-d', branch_name],
                             capture_output=True, check=True, encoding='utf-8').stdout, end='')
    except subprocess.CalledProcessError as exc:
        print(exc.stderr.replace(f'git branch -D {branch_name}', f'git rmbranch -f {branch_name}'), end='')
        return exc.returncode

    return['git', 'push', remote, '--delete', branch_name]).returncode    

if __name__ == '__main__':
    parser = argparse.ArgumentParser(description='Delete a Git branch locally and remotely.')
    parser.add_argument('-r', '--remote', default='origin', help="The remote name (defaults to 'origin')")
    parser.add_argument('-f', '--force', action='store_true', help='Force deletion of not fully merged branches')
    parser.add_argument('branch_name', help='The branch name')
    args = parser.parse_args()

    sys.exit(rmbranch(args.branch_name, args.remote, args.force))

Then git rmbranch -h will show you usage information:

usage: git-rmbranch [-h] [-r REMOTE] [-f] branch_name

Delete a Git branch locally and remotely.

positional arguments:
  branch_name           The branch name

optional arguments:
  -h, --help            show this help message and exit
  -r REMOTE, --remote REMOTE
                        The remote name (defaults to 'origin')
  -f, --force           Force deletion of not fully merged branches

Note that git push origin --delete <branch_name> also removes the local remote-tracking branch (origin/<branch_name> by default), so no need to care about that.

P.S. You can find the latest version of this Git command here. Comments and suggestions are welcome.

03.09.2019 13:23
Installing Python to do something git does well by itself, is not really a solution. More like an programming exercise. by Mogens TrasherDK, 02.01.2020 03:19
@Mogens Python is already preinstalled in most sane distributions. With git only you can't for example: 1) customize the output (e.g. make it more consistent) 2) combine multiple commands in desired way 3) easily customize the logic. Besides, entering the same commands over and over again is pretty boring. by Eugene Yarmash, 02.01.2020 11:24

Both CoolAJ86's and apenwarr's answers are very similar. I went back and forth between the two trying to understand the better approach to support a submodule replacement. Below is a combination of them.

First navigate Git Bash to the root of the Git repository to be split. In my example here that is ~/Documents/OriginalRepo (master)

# Move the folder at prefix to a new branch
git subtree split --prefix=SubFolderName/FolderToBeNewRepo --branch=to-be-new-repo

# Create a new repository out of the newly made branch
mkdir ~/Documents/NewRepo
pushd ~/Documents/NewRepo
git init
git pull ~/Documents/OriginalRepo to-be-new-repo

# Upload the new repository to a place that should be referenced for submodules
git remote add origin
git push -u origin master

# Replace the folder with a submodule
git rm -rf ./SubFolderName/FolderToBeNewRepo
git submodule add SubFolderName/FolderToBeNewRepo
git branch --delete --force to-be-new-repo

Below is a copy of above with the customize-able names replaced and using HTTPS instead. The root folder is now ~/Documents/_Shawn/UnityProjects/SoProject (master)

# Move the folder at prefix to a new branch
git subtree split --prefix=Assets/SoArchitecture --branch=so-package

# Create a new repository out of the newly made branch
mkdir ~/Documents/_Shawn/UnityProjects/SoArchitecture
pushd ~/Documents/_Shawn/UnityProjects/SoArchitecture
git init
git pull ~/Documents/_Shawn/UnityProjects/SoProject so-package

# Upload the new repository to a place that should be referenced for submodules
git remote add origin
git push -u origin master

# Replace the folder with a submodule
git rm -rf ./Assets/SoArchitecture
git submodule add
git branch --delete --force so-package
18.02.2019 20:24