在git pull
之后,我总是能够通过git branch
查看所有分支。
现在(出于某种原因)运行git branch
向我展示了我正在积极开展工作的主人和另一个分支。
git remote show origin
向我展示了所有分支机构。如果我在其中一个上执行git checkout
,它会在本地拉下分支并切换到它。之后,当我运行git branch
当我运行git branch
时,如何让远程分支再次显示?
注意:这只是一个视觉问题 - 我仍然可以毫无问题地访问我的远程分支机构,我只是想知道为什么当我像往常那样执行git分支时它们不会出现
答案 0 :(得分:18)
TL; DR:只需使用git branch -r
或git branch -a
(git fetch
后更新)。它一点也不清楚为什么你看到没有这些标志的远程跟踪分支(也许你一直在使用自动显示它们的GUI?)。
事实上,这个问题涉及三个分支名称。
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 内存 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
,因此它显示为" 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 fetch
与git remote show
和git 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。 现在他们的名字很重要!这里真正棘手的是,你的名字 。 你的 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/zorg
和origin/zorg
,那么origin/zorg
就是另一个远程,例如thirdrepo/zorg
但是指向第三个Git存储库,它也会失败,因为Git不知道我的本地thirdrepo
是否应该有origin
或zorg
作为其上游。
大多数情况下,您只有一个名为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 中的所有分支。