我刚刚从bitbucket克隆了一个回购。出于某种原因,我的本地仓库中没有所有分支。它只有master
。我尝试了git checkout origin/develop
并最终得到了一个独立的HEAD。 git fetch
什么都没有。
我能够通过git checkout -b develop
手动创建一个新的分支来解决它,然后执行git pull origin develop
,但我记不起以前必须这样做了。通常我可以从我的遥控器同步分支。
这是怎么回事?
你确实获得了所有的分支机构,而不是你所意识到的形式。
你想要的是Arkadiusz Drabczyk said in a comment,它运行git checkout develop
,它在Git中调用一个特殊的快捷方式选项 - 但是通过先前运行git checkout -b develop
,你打破了快捷方式选项。 :-)
以下是整个过程的工作原理。它基于远程跟踪名称,其名称类似于origin/master
和origin/develop
。他们有更长的拼写,一种全名 - 而不仅仅是origin/master
,你可以输入refs/remotes/origin/master
,例如 - 但为什么在较短的名字时输入较长的名字?1
1May,当你生气或不安时,全名是有用的,就像Stella android启动时一样:HARCOURT FENTON MUDD!
运行:
git clone url
(或与目标目录选项相同)与运行一堆单独的命令基本相同,大多数(但不是全部)是Git命令:
mkdir some-directory && cd some-directory && git init
这里的目录名称基于url
参数:例如,如果你git clone ssh://web.site/path/to/foo.git
你得到一个名为foo
的目录。此时的结果是一个完全空的存储库,没有分支,也没有提交;但它确实有配置。git remote add origin url
这为配置添加了“远程”。遥控器的关联URL是url
。遥控器的相关fetch
线 - remote.origin.fetch
的配置值 - 设置为+refs/heads/*:refs/remotes/origin/*
。git config
命令(如果你将-c
选项添加到你的git clone
,或者使用一些其他克隆选项,如--bare
)。在你的情况下,这里没有,但我将其包含在一般原则中。git fetch origin
这让你的Git在现在配置的url
中调用Git并从Git中获取所有分支和标签。请注意,这与您可能运行的任何其他git fetch origin
命令相同。git checkout master
有可能让Git在这里使用除master
之外的其他分支名称,但master
是最常见且最有可能的。您可以控制git checkout
命令git clone
自己运行的内容,但如果不这样做,您将受到您正在克隆的存储库的控制:它们会指出要检出的分支。如果他们没有做任何特别的事情,他们会说“退房master
”,所以这最后一步将检查master
。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
,不知何故,这是有效的。
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/develop
和remote2/develop
,这将无效,因为你的Git会找到两个匹配的名字。但要得到一个remote2/develop
,你必须运行git remote add remote2 another-url
然后git fetch remote2
。如果您还没有添加另一个遥控器,则无法获得两个合适的远程跟踪.../develop
s。
但是如果你已经创建了一个名为develop
的本地分支,它也不适用于develop
,因为现在git checkout develop
只会查看本地开发。你已经拥有它了!没有必要 - 也没有能力 - 用华丽的DWIM代码创建一个新的。
git checkout
命令只会让你“进入”本地分支。一旦你有一个名为develop
的本地分支,或者用git checkout
创建它,git checkout
命令就会设置为你当前的分支是名为develop
的分支。在成功之后,运行git status
会说:
On branch develop
然后打印剩余的状态。
远程跟踪名称(例如origin/develop
)不适用于此。相反,Git会给你你看到的“超级HEAD”模式。 Git会检查提交,但你根本就没有分支。
要退出这个“分离的HEAD”模式,你只需要git checkout
一些确实存在的分支,或者可以并且将由DWIM代码创建的分支。