'git branch -av'显示不再存在的远程分支


168

这可能是一个愚蠢的问题,但是我是git的新手,并且看到一个不再存在的远程分支。

$ git branch -a
* master
  remotes/origin/master
  remotes/origin/production

我不认为生产分支位于远程,也无法弄清为什么它仍在本地显示。如何删除/删除该分支?尝试删除它的方式如下:

$ git push origin :production

error: unable to push to unqualified destination: production
The destination refspec neither matches an existing ref on the remote nor
begins with refs/, and we are unable to guess a prefix based on the source ref.
error: failed to push some refs to 'git@IP:puppet.git'

我可以检出所谓的远程生产分支,但是可以得到:

$ git checkout origin/production
Note: checking out 'origin/production'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:

  git checkout -b new_branch_name

HEAD is now at c323996... added powerdns module, no really

我不知道我在做什么。任何帮助,将不胜感激。


git branch -aa之后的输出是git fetch什么?
alediaferia 2012年


我建议的副本有一个答案,比manojlds在这里所做的解释要多得多。
卡斯卡贝尔2012年

Answers:


338

你所要做的:

git remote prune origin

8
谢谢你的工作!您能否详细说明幕后情况?
CarpeNoctem 2012年

12
这些是本地存储库上的远程跟踪分支,如果在远程存储库上删除了分支,则必须清除它们。
manojlds 2012年

2
我很少如此迅速地找到并实施如此简单的问题和答案。
jleach

太棒了。在我的本地系统中,我看到了与代码库无关的奇怪分支。当我运行此命令时,它调整了本地分支,然后添加了上游主服务器。谢谢
Ankur Srivastava

54

因此,存在两个问题。在这两种情况下,请记住Git是分布式的。

第一。当你做类似的事情时

$ git branch -a

该操作是在本地存储库而不是远程计算机上执行的。换句话说,您的本地仓库报告了所有已知的分支。这些可能是本地分支(如“ master”)或从远程获取的远程分支。自上次提取以来,远程存储库的“生产”分支已更改,但是您的本地存储库不知道这一点。来自manojlds的答案是正确的。跑

$ git remote prune origin

删除陈旧的分支。

'git push origin:production'命令用于从远程计算机的git repo中删除分支。不是您的本地仓库。在这种情况下,其他人已经删除了远程计算机的git repo上的分支,因此您会看到此错误消息。

这里是总结这些命令的链接

第二个问题涉及结帐。

签出分支机构时,您希望从本地分支机构而不是远程分支机构执行。这就是为什么您会收到有关分离的HEAD的错误的原因。该混帐票据回购在血淋淋的细节问题的一个很好的解释。基本上,关键词是

但是,当您签出不正确的本地分支名称的任何内容时,HEAD不再是任何内容的符号引用。相反,它实际上包含您要切换到的提交的SHA-1哈希(提交ID)。

现在,如何签出与远程分支相同的本地分支?

很容易,您可以在结帐远程分支时创建一个本地分支。

$ git checkout -b my_local_branch来源/生产


20
git remote prune origin

没错,只需添加您可以使用的--dry-run选项,该选项将报告将从本地存储库中删除哪些分支,但实际上不修剪它们

git remote prune origin --dry-run
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.