Git - 已经在命令行中的分支上,但是在Atom的git插件中没有分支

时间:2018-06-11 15:13:16

标签: git git-branch

我的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完全访问该分支。

1 个答案:

答案 0 :(得分:0)

TL; DR

您可能只需要运行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}})的前几个步骤:

  1. origin说的任何内容中调用其他Git。
  2. 从他们那里获取所有引用的列表(一个涵盖分支和标记的技术术语;还有其他一些,但是你的Git除了他们之外不会关心任何事情这里的分支和标记名称)及其对应的哈希ID值。

    对于Git的Git存储库,当我运行git config --get remote.origin.url时,前几行是:

    git ls-remote origin,
    例如

  3. 一旦您的3e5524907b43337e82a24afbc822078daf7a868f HEAD fc54c1af3ec09bab8b8ea09768c2da4069b7f53e refs/heads/maint 3e5524907b43337e82a24afbc822078daf7a868f refs/heads/master 61856ae69a2ceb241a90e47953e18f218e4d5f2f refs/heads/next 拥有此信息,它就会确定要将哪些分支带来(他们的git fetchmaint,等等 - 他们的分支机构),以便检查是否您已提交masterfc54c1a...,等等。

    无论你没有拥有什么提交,你的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;行为。