我刚刚从bitbucket克隆了一个回购。出于某种原因,我的本地仓库中没有所有分支。它只有master
。我尝试了git checkout origin/develop
并最终获得了一个独立的HEAD。 git fetch
什么都没有。
我能够通过git checkout -b develop
手动创建一个新分支来解决它,然后执行git pull origin develop
,但我不记得以前必须这样做。通常我可以从我的遥控器同步分支。
发生了什么事?
答案 0 :(得分:2)
你 获得了所有分支,而不是你实现的形式。
你想要的是,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
1 也许全名对于生气或沮丧时很有用,比如当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
。远程关联的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
重命名他们的分支请注意,在步骤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/develop
和remote2/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代码创建的分支。