远程Git分支不可见

时间:2016-12-31 08:59:49

标签: git

git pull之后,我总是能够通过git branch查看所有分支。

现在(出于某种原因)运行git branch向我展示了我正在积极开展工作的主人和另一个分支。

git remote show origin向我展示了所有分支机构。如果我在其中一个上执行git checkout,它会在本地拉下分支并切换到它。之后,当我运行git branch

时,它就会显示出来

问题

当我运行git branch时,如何让远程分支再次显示?

注意:这只是一个视觉问题 - 我仍然可以毫无问题地访问我的远程分支机构,我只是想知道为什么当我像往常那样执行git分支时它们不会出现

9 个答案:

答案 0 :(得分:18)

TL; DR:只需使用git branch -rgit branch -agit fetch后更新)。它一点也不清楚为什么你看到没有这些标志的远程跟踪分支(也许你一直在使用自动显示它们的GUI?)。

但是,你确实在你的问题中至少有一个小的误解 - 这并不奇怪; Git的这个特殊部分起初很棘手。

事实上,这个问题涉及三个分支名称。

  

git remote show origin向我展示了所有分支。

不完全是。让我们稍微备份一下,然后定义分支的两个集(或类,或者你喜欢的任何单词)。 Git提供:

  • 您的常规,普通,本地分支机构。这些是git branch在没有参数和标志的情况下显示的内容。

    $ git branch
      diff-merge-base
    * master
      precious
      stash-exp
    

    "分支"通常意味着其中一个:名称,当提交给git rev-parse时,解析为提交ID:

    $ git rev-parse diff-merge-base
    2d0cc5001c1a88995727521d4ef77f7a4acc4e14
    

    ,其全名以refs/heads/开头:

    $ git rev-parse --symbolic-full-name diff-merge-base
    refs/heads/diff-merge-base
    
  • 您的远程跟踪分支。这些是git branch -r显示的内容:

    $ git branch -r
      origin/HEAD -> origin/master
      origin/maint
      origin/master
      origin/next
      origin/pu
      origin/todo
    

这些之间的关键区别在于你的本地分支是你喜欢操纵的名字,而你的远程跟踪分支是你的名字,Git自动从属于其他东西。 可能让您自己操纵它们,但它不是有利可图,因为它们的目的是记住一些其他 Git&# 39; s分支名称(和相应的SHA-1值)。

请注意,将远程跟踪分支名称提供给git rev-parse 也可以,并且您也可以获得symbolic-full-name:这只是以refs/remotes/开头,然后是遥控器的名称,然后是本地名称​​,如果你是Git在远程上运行 那么。因此:

$ git rev-parse --symbolic-full-name origin/master
refs/remotes/origin/master

表示我的Git' origin/master是我的Git 内存 masterorigin上的含义,最后一次让我的Git调用origin并获取 - 即更新 - 来自他们。

git remote(有时)实际上调用了远程Git

请记住,每次提取或推送提交时都会涉及两个(有时甚至更多)Git版本控制数据库。所以你可以查看你的信息,或者你可以让你的Git通过互联网电话打电话给他们的 Git,并查询他们关于他们的信息。他们也可能拥有自己的本地分支机构,甚至是远程跟踪分支机构。 (通常,对于这种情况,他们只有本地分支。)

为了便于说明,让我删除一个自己的远程跟踪分支(这是非常无害的,因为我会立即运行git fetch来恢复它):

$ git branch -r -d origin/pu
Deleted remote-tracking branch origin/pu (was 7c79844).

现在,如果我运行git branch -r,我将不再拥有origin/pu:我的Git不再具有远程跟踪分支。但他们的 Git,在origin上,仍然有一个名为pu本地分支,所以:

$ git remote show origin
* remote origin
  Fetch URL: git://git.kernel.org/pub/scm/git/git.git
  Push  URL: git://git.kernel.org/pub/scm/git/git.git
  HEAD branch: master
  Remote branches:
    maint  tracked
    master tracked
    next   tracked
    pu     new (next fetch will store in remotes/origin)
    todo   tracked
  Local branches configured for 'git pull':
    master    merges with remote master
    stash-exp merges with remote master
  Local ref configured for 'git push':
    master pushes to master (local out of date)

当我运行git remote show origin时,我的Git会调用他们的Git(这恰好是Git的Git存储库的副本 - github.com上的另一个存储库,这些天可能更合适并从他们那里得到他们所有分支的清单。我已将其中大部分作为我自己的"远程跟踪分支机构",但我删除了pu,因此它显示为" new"。

类似的命令git ls-remote也会调用另一个Git并对其进行查询,但会向您显示更多信息:它会显示每个分支的提交哈希值(以及每个标记的对象哈希值) 。有很多标签,所以让我将其限制在一个分支:

$ git ls-remote origin master
e05806da9ec4aff8adfed142ab2a2b3b02e33c8c        refs/heads/master

在这两种情况下,你的Git(或我的Git)都会调用他们的Git并从中获取信息,但它只显示它,而不是保存。要保存信息,我们必须运行git fetch。我有一段时间没有这样做,所以:

$ git fetch origin
remote: Counting objects: 2064, done.
remote: Compressing objects: 100% (1294/1294), done.
remote: Total 2064 (delta 1383), reused 1118 (delta 767)
Receiving objects: 100% (2064/2064), 2.12 MiB | 2.29 MiB/s, done.
Resolving deltas: 100% (1383/1383), done.
From git://git.kernel.org/pub/scm/git/git
   de2efeb..e05806d  master     -> origin/master
   3074f94..c69c2f5  next       -> origin/next
 * [new branch]      pu         -> origin/pu
   1a46792..2135c1c  todo       -> origin/todo

git fetchgit remote showgit ls-remote做了同样的事情,但后来也做了更多的事情:它收集了我需要完成的对象 我的存储库,然后更新我的远程跟踪分支名称,以对应存储库中的分支名称。

这就是为什么我重新获得origin/pu:他们仍然有pu,我放弃了我的,所以我获得了他们,现在再次拥有一个。

这也是为什么我更新了除maint之外的所有其他内容:它已经足够长,以至于它们都已更新。我的origin/master用于引用提交de2efeb,但现在引用e05806d,这与我们在运行git ls-remote时看到的ID相同。 (这意味着他们在我输入所有这些内容的几分钟内没有更新他们的master。想象一下,数十亿纳秒已经没有更新了!:-))

(请注意,git remote show -n origin 会跳过 origin的电子邮件,只是告诉您Git记录的内容。其他几个git remote命令也可以使用本地;请参阅文档以获取具体信息。)

摘要

回顾一下,这里有三个分支名称集合:

  • 您当地的分支机构;
  • 您的远程跟踪分支机构;和
  • 他们的分支(在远程Git中)。

最后一组分支名称​​并不重要,大部分时间。大多数情况下,您在自己的存储库中工作。只有一个Git参与其中,而且它是你的。 他们的 Git,它有自己的分支,就在图片之外。

但有时啊 - 这样的时间! - 有时,你必须将你的Git连接到另一个 Git。 现在他们的名字很重要!这里真正棘手的是,你的名字 你的 master 必须与他们的master相对应,但你的 Git没有硬性和快速的原因会将他们的 master复制到你的 origin/master,这样如果你的名字和名字那么它可以保存很多脑细胞匹配。你可以解决这个问题(以多种不同的方式),但是在你遇到真正需要它的情况之前不要这样做(多个遥控器使用冲突的分支名称 - 这几乎从来没有发生)。

git checkout blah怎么样?

您在上面提到过:

  

如果我在git checkout输出中没有看到的[他们的分支名称]之一上git branch,则会在本地拉出分支并切换到它。

让我们说你已经运行git branch -r(而不是git remote show origin)并看到一个名为origin/zorg的分支。我们还说你还没有一个名为zorg的(本地)分支。你跑:

$ git checkout zorg

你的Git说:

Branch zorg set up to track remote branch zorg from origin.
Switched to a new branch 'zorg'

你的Git没有"#34;拉下来" 任何在这里。它所做的是创建一个新的本地分支名称zorg,指向相同的提交 - 同样大的丑陋SHA-1哈希ID - {{1} }。该提交已经在您的存储库中,随时可以检出,实际上您可以完成:

origin/zorg

看看它 - 但这会给你Git所说的"分离的HEAD"。

这里发生的是,在Git中,分支名称只是指向一个特定提交的可移动指针。 $ git checkout origin/zorg 命令在以这种方式使用时会执行两个事情:检查一个特定的提交(进入工作树),,切换你的Git& #39;"当前分支名称"的概念。当你git checkout一个现有的本地普通分支名称时,Git会检查一个有问题的提交,然后将你放在分支上,而{34}会说:

git checkout

当你git status通过 一个简单的分支名称提交任何内容时,Git仍会检出一个提交,但会将你从任何分支中删除,即给你一个"分离的HEAD"。

我们从上面知道$ git status On branch master 是(现在)提交git checkout,所以:

origin/master

或:

e05806da9ec4aff8adfed142ab2a2b3b02e33c8c

都做同样的事情。由于$ git checkout origin/master 本地分支,我最终得到:

$ git checkout e05806da9ec4aff8adfed142ab2a2b3b02e33c8c

(或有时origin/master)。

因此,$ git status HEAD detached at e05806d 所做的是尝试将您提供的名称转换为分支名称。 如果失败HEAD detached at origin/master有这个额外的内置功能:它会搜索所有远程跟踪分支以查看是否只有一个 "大多数匹配"名字。因此git checkout检查名为git checkout的本地分支无法找到它,然后在所有远程跟踪分支中搜索匹配git checkout zorg的分支。实际上只有一个 - zorg - 所以这会触发特殊情况代码。

特殊情况代码简单地实现"创建新的本地分支设置以跟踪相应的远程跟踪分支"。也就是说,创建一个本地zorg,其上游(因为Git现在调用这些东西)设置为origin/zorg

请注意,要使其正常工作,必须有恰好一个合适的远程跟踪分支。如果我根本没有zorg,那么这会失败 - 如果我同时拥有origin/zorgorigin/zorg,那么origin/zorg就是另一个远程,例如thirdrepo/zorg但是指向第三个Git存储库,它也会失败,因为Git不知道我的本地thirdrepo是否应该有originzorg作为其上游。

大多数情况下,您只有一个名为origin/zorg的遥控器。因此,只要您将所有thirdrepo/zorg个分支保存为您自己的Git远程跟踪分支记忆,您只需origin这些名称即可将您的Git带到创造它们。但有时您会发现必须先运行origin,以便更新远程跟踪分支。

答案 1 :(得分:15)

好吧,我有完全相同的问题,然后我在git config

中找到了

remote.origin.fetch

不是

fetch = +refs/heads/*:refs/remotes/origin/*

类似的东西:

[remote "origin"]
  url = https://....
  fetch = +refs/heads/v8.1:refs/remotes/origin/v8.1

将其更改为:

[remote "origin"]
  url = https://....
  fetch = +refs/heads/*:refs/remotes/origin/*

现在'git branch -avv'显示所有远程跟踪分支

如果你想知道我从哪里得到这个奇怪的设置,那是因为我使用了'clone --single-branch'

答案 2 :(得分:1)

1)只显示分支:

git branch -r

2)将远程分支加载到本地git:

git fetch origin/<remote_name>

3)从远程分支创建本地分支(在调用它之后,您可以将分支查看到git分支之外):

git checkout -b <remote_name> origin/<remote_name>

答案 3 :(得分:0)

git branch -a

将列出所有分支,遥控器将以红色显示,并以遥控器名称为前缀。

答案 4 :(得分:0)

你可以试试get-fetch

git fetch <remote>

答案 5 :(得分:0)

对我来说,我是从C:\Program Files\Notepad++\plugins提取/获取的,但需要从上游获取

Settings -> Import -> Import plugin,然后我可以签出丢失的分支

答案 6 :(得分:0)

git分支

o / p:主 xyz

git branch -u origin / [分支名称]

ex:git branch -u起源/开发人员

然后结帐: git checkout [分支名称]

ex:git checkout sonarfix-fvfr-parts-splitter

git分支

o / p:主 y 开发人员

答案 7 :(得分:0)

接受的答案是完美的答案,并解决了我的目的。我只是分享对我有用的东西。 让我们从问题开始,我试图访问一个已经创建的名为“ NewBranch”的分支,但出现错误,如下所示:

error: pathspec 'NewBranch' did not match any file(s) known to git

所以,我尝试了这个git命令,

git remote show origin

以上命令将为您提供所有分支的列表。而且,我发现我要检出的分支是新分支,尚未提取。像这样的东西

  Remote branches:
DH5982                               new (next fetch will store in remotes/origin)
ML                                   tracked
Sarvesh_Branch                       tracked
NewBranch                   new (next fetch will store in remotes/origin)
auc_branch                           tracked
fileSize                             tracked
fileuploadtime                       tracked
master                               tracked
refs/remotes/origin/DH-5697          stale (use 'git remote prune' to remove)
refs/remotes/origin/DH-5914          stale (use 'git remote prune' to remove)

所以,我只是使用了这个git命令,

git fetch --all

然后,它完成了,我可以使用“ NewBranch”了。

答案 8 :(得分:0)

我经历了同样的场景,但只执行 git fetch 命令会获取 master 中的所有分支。