The Short Answers
Deleting a remote branch:
git push origin --delete <branch> # Git version 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
The Long Answers: there are 3 different branches to delete!
When you're dealing with deleting branches both locally and remotely, keep in mind that there are 3 different branches involved:
- The local branch
X
.
- The remote origin branch
X
.
- The local remote-tracking branch
origin/X
that tracks the remote branch X
.
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
.
To delete that actual remote branch, you need
git push origin --delete bugfix
The following sections are the detailed steps needed to actually delete these various branches.
Deleting the local branch X
git branch --delete X
# Or shorter
git branch -d X
# If X hasn't been merged yet, you'll need to force delete
git branch -D X
Deleting the remote branch X
You can use either of the following to delete the remote branch (depending on what version of Git you're using):
# Use an empty refspec to delete the remote branch.
# This will work in versions of Git older than 1.7.0.
git push origin :X
# If you're using Git version 1.7.0 or newer
# you can use the new --delete flag instead.
git push origin --delete X
Note that deleting the remote branch X
from the command line this way will also delete 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
, though 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 repo 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
# Or shorter
git fetch origin -p
Here is the relevant quote from the 1.6.6 release notes (emphasis mine):
"git fetch" learned --all
and --multiple
options, 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
# Or shorter
git branch -dr origin/X
See Also
git push origin :branchName
for remotegit branch -d your branchname
for local – Ramesh Rajendran Feb 27 at 15:50