【问题标题】:Remote Git branches not visible远程 Git 分支不可见
【发布时间】:2017-05-15 09:13:33
【问题描述】:

git pull 之后,我总是可以通过git branch 看到所有分支。

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

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

时它是可见的

问题

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

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

【问题讨论】:

  • 对于本地编辑/查看,您应该使用 git checkout -b origin/ 从远程创建本地分支,另一种情况是远程主机与本地同名的远程分支可以重写本地分支,所以git不会从远程创建本地分支,你应该自己添加它。
  • 如果您在git clone 时添加了--single-branch 选项,您将看不到任何其他分支。这是solution

标签: git


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    接受的答案是完美的答案,解决了我的目的。我只是分享对我有用的东西。 让我们从问题开始,我试图访问我已经创建的名为“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”。

    【讨论】:

      【解决方案3】:

      git 分支

      o/p : 主人 xyz

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

      ex : git branch -u origin/developer

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

      ex : git checkout sonarfix-fvfr-parts-splitter

      git 分支

      o/p : 主人 xyz 开发者

      【讨论】:

        【解决方案4】:

        好吧,我遇到了完全相同的问题,然后我在项目特定的 git config(位于 ./.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'

        【讨论】:

        • 你可能需要在更改 git 配置文件后执行git fetch --all
        • 这解决了我的类似问题,即使我的存储库来自git clone --depth=1 --no-checkout
        • 我有一个类似的问题,我克隆了一个裸仓库,然后使用git worktree 并行处理不同的分支。出于某种原因,[remote "origin"] 配置部分根本没有fetch 条目,这(我认为)完全阻止了 git 创建远程跟踪分支(因此,我无法在我的本地克隆)。添加缺少的条目fetch = +refs/heads/*:refs/remotes/origin/* 为我修复了它!
        • git clone 时,你添加了--single-branch 选项,所以你看不到任何其他分支。您的解决方案绝对正确。
        • 这个解决方案来得很紧,我能够拉出远程分支,但在列表中看不到它们。结果我的配置文件,出于某种原因,被设置为fetch = +refs/heads/master:refs/remotes/origin/master
        【解决方案5】:

        对我来说,我是从 origin 拉取/获取,但需要从上游获取

        get fetch upstream 然后我能够检查出丢失的分支

        【讨论】:

          【解决方案6】:

          TL;DR:只需使用git branch -rgit branch -a(在git 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 自动从属于其他东西的名称。 可能你自己来操作它们,但这并不有利可图,因为它们的目的是记住一些 other Git 的分支名称(以及相应的SHA-1 值)。

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

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

          表示我的 Git 的 origin/master 是我的 Git 的 内存master 的意思是,在 origin 上,我的 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,所以它显示为“新”。

          类似的命令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 做了同样的事情,但还做了更多的事情:它收集了我需要完成的对象 我的存储库,然后更新 my 远程跟踪分支名称以对应于 他们的 存储库中的分支名称。

          这就是我重新获得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 会复制 他们的 em> masteryour origin/master,所以如果你的名字和他们的名字 do 匹配,它会节省很多脑细胞。你可以解决这个问题(以多种不同的方式),但在你遇到真正需要它的情况之前不要这样做(多个遥控器使用冲突的分支名称——这几乎不会发生) .

          git checkout blah 呢?

          您在上面提到:

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

          假设您运行了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 没有“拉下”任何东西。它所做的是创建一个新的本地分支名称zorg,指向与origin/zorg 相同的commit——同样又大又丑的SHA-1 哈希ID。该提交已经在您的存储库中,随时可以签出,实际上您可以这样做:

          $ git checkout origin/zorg
          

          看看它——但这会给你一个 Git 所说的“分离的 HEAD”。

          这里发生的事情是,在 Git 中,一个分支 name 只是一个指向 一个特定提交的可移动指针。 git checkout 命令,当以这种方式使用时,会做两件事:检查一个特定的提交(进入工作树),,切换你的 Git 的概念“当前分支名称”。当您 git checkout 一个现有的、本地的、普通的分支名称时,Git 会检查出有问题的一个提交,并将您置于“分支上”,正如 git status 所说:

          $ git status
          On branch master
          

          当你 git checkout 任何提交的东西不是一个简单的分支名称时,Git 仍然检查一个提交,但 让你离开任何分支,即, 给你一个“分离的 HEAD”。

          从上面我们知道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 的分支。事实上确实有一个——origin/zorg——所以这会触发特殊情况代码。

          特例代码简单地实现了“创建新的本地分支设置以跟踪相应的远程跟踪分支”。也就是说,创建一个本地zorg,并将其upstream(Git 现在这样称呼)设置为origin/zorg

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

          大多数时候,您只有一个遥控器,名为origin。因此,只要您将所有 origin 的分支保存为您自己的 Git 的远程跟踪分支内存,您就可以通过 git checkout 这些名称让您的 Git 来创建它们。但有时你会发现你必须先运行git fetch,才能更新你的远程跟踪分支。

          【讨论】:

          • 非常感谢您写得非常好和出色的回答。它为我清除了很多东西!
          • 很好的答案,感谢您花时间编写它。
          • 难以置信的答案,我从阅读中学到了很多东西。谢谢
          【解决方案7】:

          1) 只显示分支:

          git branch -r
          

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

          git fetch origin/<remote_name>
          

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

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

          【讨论】:

            【解决方案8】:

            你可以试试get-fetch as:

            git fetch <remote>
            

            【讨论】:

            • 问题是关于使用git branch查看遥控器
            【解决方案9】:
            git branch -a
            

            会列出所有的分支,远程会以红色显示,并以远程的名称为前缀。

            【讨论】:

              猜你喜欢
              • 2012-10-22
              • 1970-01-01
              • 1970-01-01
              • 2012-07-18
              • 2012-03-21
              • 2013-11-21
              • 2014-03-17
              • 2015-10-31
              相关资源
              最近更新 更多