When I do git fetch origin
and origin has a deleted branch, it doesn't seem to update it in my repository. When I do git branch 开发者_如何学Go-r
it still shows origin/DELETED_BRANCH
.
How can I fix this?
You need to do the following
git fetch -p
The -p
or --prune
argument will update the local database of remote branches.
From http://www.gitguys.com/topics/adding-and-removing-remote-branches/
After someone deletes a branch from a remote repository, git will not automatically delete the local repository branches when a user does a git pull or git fetch. However, if the user would like to have all tracking branches removed from their local repository that have been deleted in a remote repository, they can type:
git remote prune origin
As a note, the -p param from git fetch -p
actually means "prune".
Either way you chose, the non-existing remote branches will be deleted from your local repository.
You need to do the following
git fetch -p
in order to synchronize your branch list. The git manual says
-p
,--prune
After fetching, remove any remote-tracking references that no longer exist on the remote. Tags are not subject to pruning if they are fetched only because of the default tag auto-following or due to a--tags
option. However, if tags are fetched due to an explicit refspec (either on the command line or in the remote configuration, for example if the remote was cloned with the--mirror
option), then they are also subject to pruning.
I personally like to use git fetch origin -p --progress
because it shows a progress indicator.
This worked for me.
git remote update --prune
Regarding git fetch -p
, its behavior changed in Git 1.9, and only Git 2.9.x/2.10 reflects that.
See commit 9e70233 (13 Jun 2016) by Jeff King (peff
).
(Merged by Junio C Hamano -- gitster
-- in commit 1c22105, 06 Jul 2016)
fetch
: document that pruning happens before fetchingThis was changed in 10a6cc8 (
fetch --prune
: Run prune before fetching, 2014-01-02), but it seems that nobody in that discussion realized we were advertising the "after" explicitly.
So the documentation now states:
Before fetching, remove any remote-tracking references that no longer exist on the remote
That is because:
When we have a remote-tracking branch named "
frotz/nitfol
" from a previous fetch, and the upstream now has a branch named "frotz
", fetch would fail to remove "frotz/nitfol
" with a "git fetch --prune
" from the upstream. git would inform the user to use "git remote prune
" to fix the problem.Change the way "
fetch --prune
" works by moving the pruning operation before the fetching operation. This way, instead of warning the user of a conflict, it automatically fixes it.
If git fetch -p origin
does not work for some reason (like because the origin repo no longer exists or you are unable to reach it), another solution is to remove the information which is stored locally on that branch by doing from the root of the repo:
rm .git/refs/remotes/origin/DELETED_BRANCH
or if it is stored in the file .git/packed-refs
by deleting the corresponding line which is like
7a9930974b02a3b31cb2ebd17df6667514962685 refs/remotes/origin/DELETED_BRANCH
For git
and Apple git
newer than version 2.x
this worked for me:
git remote prune origin
精彩评论