我的Gitlab项目的远程分支在终端中处于活动状态。当我运行git checkout branch
时,它会返回already on branch
。
但是,在Atom的Git选项卡中,分支选项卡仅列出了我当前七个分支中的三个。在命令行中,运行git branch -r
将返回十个分支,其中包括已删除和/或合并的分支。
运行git fetch
返回
From gitlab.com:zeesy/project
* [new branch] branch -> origin/branch
这里发生了什么?我希望能够在Atom中编辑我的文件,然后推送到Git。
运行git branch -a
返回
* branch
baby-steps-demo
lit-html-demo
master
webapp
working-demo
archaeological-record
remotes/origin/HEAD -> origin/master
remotes/origin/branch
remotes/origin/archaeological-record
remotes/origin/baby-steps-demo
remotes/origin/js
remotes/origin/lit-html-demo
remotes/origin/master
remotes/origin/split-pages
remotes/origin/webapp
remotes/origin/working-demo
请注意,GitLab项目中不再存在baby-steps-demo
。
运行git pull && git checkout branch
会导致
There is no tracking information for the current branch.
Please specify which branch you want to merge with.
See git-pull(1) for details.
git pull <remote> <branch>
If you wish to set tracking information for this branch you can do so with:
git branch --set-upstream-to=origin/<branch> branch
这表明没有远程分支。但是,可以从Gitlab完全访问该分支。
答案 0 :(得分:0)
您可能只需要运行git checkout branch
(我猜您已经这样做了)然后重新启动Atom(完全停止它;它会继续运行以便快速启动并轻松打开窗口)。我实际上并没有使用Atom,所以这是一个猜测 - 它的插件可能会假设只有插件执行任何与Git相关的操作,因此在您在命令行中执行操作后它永远不会重新扫描。
尽管如此,对实际发生的事情的详细描述可能会有所帮助。
我将在这里谈谈git fetch
和Git的命名系统。
请注意,GitLab项目中不再存在
baby-steps-demo
...
这是正常的:默认情况下,git fetch
不会删除远程跟踪名称,它只会创建或更新。< / p>
这里有几个部分。您有您的 Git存储库,服务器有其 Git存储库,每个存储库都有自己的分支名称。但是你的Git存储库也需要记住其他 Git存储库的名称。所以除了你的(本地)分支名称之外,你的Git存储库还有一组远程跟踪名称,它们对应于其他Git存储库所拥有或已经存在的,Git最后一次与之交谈他们的Git。
从命令行运行,它可以帮助您查看正在运行的内容:
git ls-remote origin
这会向您显示git fetch origin
(或git fetch
的{{1}})的前几个步骤:
origin
说的任何内容中调用其他Git。从他们那里获取所有引用的列表(一个涵盖分支和标记的技术术语;还有其他一些,但是你的Git除了他们之外不会关心任何事情这里的分支和标记名称)及其对应的哈希ID值。
对于Git的Git存储库,当我运行git config --get remote.origin.url
时,前几行是:
git ls-remote origin,
例如。
一旦您的3e5524907b43337e82a24afbc822078daf7a868f HEAD
fc54c1af3ec09bab8b8ea09768c2da4069b7f53e refs/heads/maint
3e5524907b43337e82a24afbc822078daf7a868f refs/heads/master
61856ae69a2ceb241a90e47953e18f218e4d5f2f refs/heads/next
拥有此信息,它就会确定要将哪些分支带来(他们的git fetch
,maint
,等等 - 他们的分支机构),以便检查是否您已提交master
,fc54c1a...
,等等。
无论你没有拥有什么提交,你的Git都要求他们的Git以及完成你的存储库所需的任何其他对象。这一切都发生在一个相当迅速的#34;我有X,但我需要Y&#34;交换,然后他们的Git构建一个包文件来发送给你:
3e55249...
一旦他们向您发送了所有内容,您的 Git会将这些对象放在数据库中,并按其哈希ID编制索引。除非你(或你的Git,真的)在某些时候抛弃它们,现在你拥有了这些对象,你再也不需要再检索它们了。
最后,您的Git必须设置一些名称或名称,以便记住这些对象,或者更具体地说,它们的哈希ID。如果你的Git不知道为什么它有这些对象 - 如果它没有可以找到它们的名字 - 它最终会把它们扔掉。存储哈希ID的一个地方是特殊的remote: counting objects ...
remote: compressing objects ...
文件。每个新的提取都会用它提取的内容覆盖该文件,这样你至少可以坚持到下一个FETCH_HEAD
。但是对于你的目的来说更重要的是 - 因为它持续的时间更长 - 是你的Git 重命名他们的分支名称:
git fetch
变为refs/heads/master
refs/remotes/origin/master
变为refs/heads/next
然后你的Git会在这个集合的右侧创建或更新名称。这些是远程跟踪名称。
出于显示目的,Git 缩短这些,但至少删除refs/remotes/origin/next
,通常也是下一个斜线分隔的单词。 refs/
命令使用缩写的哈希ID前缀所有这些:
git fetch
告诉您Git根据他们的 aaaaaaa..bbbbbbb master -> origin/master
更新了您的 refs/remotes/origin/master
,同时您的 refs/heads/master
用于名称提交refs/remotes/origin/master
,现在名称提交aaaaaaa
。或者:
bbbbbbb
根据查看 * [new branch] branch -> origin/branch
列表中的refs/remotes/origin/branch
,告诉您Git 刚刚创建您的refs/heads/branch
。
请注意,您的git ls-remote
- 全名真的是origin/baby-steps-demo
;它只是缩短了显示范围 - 是远程跟踪名称,而不是分支名称。 1 分支名称是名称其完整版本以refs/remotes/origin/baby-steps-demo
开头。
现在我们可以回到这句话:
请注意,GitLab项目中不再存在
refs/heads/
...
这意味着当你的Git调用他们的Git时,他们不会列出baby-steps-demo
。
您的Git使用他们的refs/heads/baby-steps-demo
来创建您的baby-steps-demo
。您的Git现在应该删除origin/baby-steps-demo
吗?如果你想要你的Git,你可以告诉你的Git使用他们所有分支的完整列表 prune 你的远程跟踪名称。您可以使用origin/baby-steps-demo
执行此操作,或在Git配置中将git fetch --prune
设置为fetch.prune
,以使true
默认执行此操作。
命令行命令git fetch
专门显示这些远程跟踪名称。
命令行命令git branch -r
(不包含git branch
)专门显示您的分支名称。这些不依赖于远程跟踪名称的存在(反之亦然)。
每个(本地)分支可以有一个,但只有一个,上游。您基于远程跟踪名称-r
创建的master
分支的上游通常会将远程跟踪名称设置为其上游,但这可能是您的上游告诉Git设置,具体取决于你如何创建(本地)分支名称。
某些操作(包括origin/master
)使用上游设置来确定git pull
的内容以及git fetch
完成后git merge
的内容。如果您的分支机构没有上游设置,则他们无法或不会假设某些默认设置。
在您的情况下,您当前的分支git fetch
没有将branch
设置为其上游(因为它根本没有上游设置)。如果您运行:
origin/branch
您将告诉您的Git将git branch --set-upstream-to=origin/branch branch
设置为名为origin/branch
的分支的上游。如果在此之前它有其他上游设置,那将用这个新设置替换旧的上游设置。
上游设置实际上只是一对名字; branch
确保名称存在并且有效,然后设置它们,git branch --set-upstream-to
完全删除它们(如果你想因任何原因想要这样做,那么分支就不再有上游了)。
1 这组短语显然有很多不足之处。如果分支是你可以得到的东西&#34;到&#34;使用git branch --unset-upstream
,然后远程跟踪名称或远程跟踪分支名称不是分支,因为git checkout
或类似名称离开了你在分离的HEAD 模式下。此外,远程跟踪(分支)名称实际上是您自己的Git本地存储的东西!但有些人喜欢将远程跟踪名称视为分支名称,并且他们确实拥有&#34; branch-y&#34;行为。