git clone没有给我所有分支

时间:2017-12-26 20:45:05

标签: git bitbucket

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

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

发生了什么事?

1 个答案:

答案 0 :(得分: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

1 也许全名对于生气或沮丧时很有用,比如当Stella android启动时:HARCOURT FENTON MUDD!

克隆是一些更基本的命令的简写

运行:

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 。远程关联的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

  6. Git' fetch 重命名他们的分支

    请注意,在步骤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,并且不知何故,工作

    git checkout命令很花哨

    如果您要求Git按名称查看分支机构,并且您没有拥有该名称的分支机构,那么您的Git不会只是说:抱歉,我不知道该名称。相反,您的Git会查看所有远程跟踪名称

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

    这是"做我的意思" (或 DWIM )Git在您运行git checkout name时使用的技巧,但不要拥有名为 name 的分支。它是git checkout -b name origin/name的简写。

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

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

    最后一个警告

    git checkout命令只会让你得到" on" 本地分支。如果您有一个名为develop的本地分支,或者使用git checkout创建它,则git checkout命令将进行设置,以便您的当前分支是一个名为develop。在成功之后,运行git status会说:

    On branch develop
    

    然后打印其余状态。

    远程跟踪名称(例如origin/develop)对此无效。相反,Git会给你那个"分离的HEAD"你看到的模式。 Git会检查 commit ,但你根本就没有分支。

    退出此"分离的HEAD"模式,您只需要git checkout存在 的某个分支,或者可以由DWIM代码创建的分支。