git clone没有给我所有分支

问题描述 投票:1回答:1

我刚刚从bitbucket克隆了一个回购。出于某种原因,我的本地仓库中没有所有分支。它只有master。我尝试了git checkout origin/develop并最终得到了一个独立的HEAD。 git fetch什么都没有。

我能够通过git checkout -b develop手动创建一个新的分支来解决它,然后执行git pull origin develop,但我记不起以前必须这样做了。通常我可以从我的遥控器同步分支。

这是怎么回事?

git bitbucket
1个回答
2
投票

你确实获得了所有的分支机构,而不是你所意识到的形式。

你想要的是Arkadiusz Drabczyk said in a comment,它运行git checkout develop,它在Git中调用一个特殊的快捷方式选项 - 但是通过先前运行git checkout -b develop,你打破了快捷方式选项。 :-)

以下是整个过程的工作原理。它基于远程跟踪名称,其名称类似于origin/masterorigin/develop。他们有更长的拼写,一种全名 - 而不仅仅是origin/master,你可以输入refs/remotes/origin/master,例如 - 但为什么在较短的名字时输入较长的名字?1


1May,当你生气或不安时,全名是有用的,就像Stella android启动时一样:HARCOURT FENTON MUDD!


Cloning is shorthand for some more-basic commands

运行:

git clone url

(或与目标目录选项相同)与运行一堆单独的命令基本相同,大多数(但不是全部)是Git命令:

  1. mkdir some-directory && cd some-directory && git init 这里的目录名称基于url参数:例如,如果你git clone ssh://web.site/path/to/foo.git你得到一个名为foo的目录。此时的结果是一个完全空的存储库,没有分支,也没有提交;但它确实有配置。
  2. git remote add origin url 这为配置添加了“远程”。遥控器的关联URL是url。遥控器的相关fetch线 - remote.origin.fetch的配置值 - 设置为+refs/heads/*:refs/remotes/origin/*
  3. 这里可能有一些额外的git config命令(如果你将-c选项添加到你的git clone,或者使用一些其他克隆选项,如--bare)。在你的情况下,这里没有,但我将其包含在一般原则中。
  4. git fetch origin 这让你的Git在现在配置的url中调用Git并从Git中获取所有分支和标签。请注意,这与您可能运行的任何其他git fetch origin命令相同。
  5. git checkout master 有可能让Git在这里使用除master之外的其他分支名称,但master是最常见且最有可能的。您可以控制git checkout命令git clone自己运行的内容,但如果不这样做,您将受到您正在克隆的存储库的控制:它们会指出要检出的分支。如果他们没有做任何特别的事情,他们会说“退房master”,所以这最后一步将检查master

Git's fetch renames their branches

请注意,在步骤4中,git fetch origin从其他Git获取其所有分支名称及其对应的提交哈希ID的列表。 (要直接查看这些,不使用git fetch,请运行git ls-remote origin。)但是git fetch不会将这些分支名称保存为您的分支名称,因为您的分支名称是您的。拯救他们可能会弄乱你的工作!因此,默认情况下,git fetch将其分支名称保存为远程跟踪名称。

如果他们有一个名为master的分支,你的Git会改变这个名字 - 全名是refs/heads/master; master只是短版本 - 读取refs/remotes/origin/master,更短的origin/master的全名。如果他们有develop,你得到一个origin/develop,依此类推。

换句话说,对于他们(branch)拥有的每个分支名称origin,您将得到一个远程跟踪名称,拼写为origin/branch。每个提交的哈希ID都保持不变,但名称会发生​​变化。如果你回顾上面的第2步,当git clone添加名为origin的遥控器时,你会看到Git知道如何进行这种特殊的替换。但重要的是它确实取代了。

因此,当您的克隆过程完成时,您仍然没有分支。然而,你的git clone运行git checkout master,不知何故,这是有效的。

The git checkout command is fancy

如果你要求你的Git按名称检查一个分支,而你没有这个名称的分支,你的Git不会只说:抱歉,我不知道这个名字。相反,您的Git将查看所有远程跟踪名称。

既然你已经运行了git clone(也许从那以后可能有一些git fetch-es用于测量),你有远程跟踪名称origin/master,以及你的git fetch步骤创建或更新的所有其他远程跟踪名称。你的Git会扫描所有这些内容。如果它发现任何看起来很像master,或者你要求检查的任何分支,你的Git会对自己说:啊哈,我找到了一个匹配的名字:origin/master。你必须要我创建master,使用我在origin/master下看到的相同提交。

这是Git在运行git checkout name但没有名为name的分支时使用的“我的意思”(或DWIM)技巧。它是git checkout -b name origin/name的简写。

例如,如果你同时拥有origin/developremote2/develop,这将无效,因为你的Git会找到两个匹配的名字。但要得到一个remote2/develop,你必须运行git remote add remote2 another-url然后git fetch remote2。如果您还没有添加另一个遥控器,则无法获得两个合适的远程跟踪.../develops。

但是如果你已经创建了一个名为develop的本地分支,它也不适用于develop,因为现在git checkout develop只会查看本地开发。你已经拥有它了!没有必要 - 也没有能力 - 用华丽的DWIM代码创建一个新的。

One last caveat

git checkout命令只会让你“进入”本地分支。一旦你有一个名为develop的本地分支,或者用git checkout创建它,git checkout命令就会设置为你当前的分支是名为develop的分支。在成功之后,运行git status会说:

On branch develop

然后打印剩余的状态。

远程跟踪名称(例如origin/develop)不适用于此。相反,Git会给你你看到的“超级HEAD”模式。 Git会检查提交,但你根本就没有分支。

要退出这个“分离的HEAD”模式,你只需要git checkout一些确实存在的分支,或者可以并且将由DWIM代码创建的分支。

© www.soinside.com 2019 - 2024. All rights reserved.