克隆后,我只有一个分支吗?

时间:2018-08-13 07:23:50

标签: git github git-branch git-clone

我正试图了解以下情况:

在Github中有一个我和其他人正在使用的项目。我相信除master(尤其是“ develop”)之外,它还有几个分支机构

因此,我使用git clone <url>将项目克隆到了我的计算机上 我得到了这个项目。有人告诉我应该与开发分支一起与master分支

一起工作

所以我输入git branch来查看那里有什么分支

$ git branch
* master

什么?开发分支在哪里?

尽管如此,我仍然git checkout develop这样做!我现在在开发部门!我再次做git branch,我可以看到

$ git checkout develop
Branch develop set up to track remote branch develop from origin.
Switched to a new branch 'develop'
$ git branch
* develop
  master

这里发生了什么黑魔法??它说发展是为了追踪发展而来的!那么在那个发展被隐藏之前?无法到达?

完成git log --oneline --decorate之后,我可以看到origin / develop分支,但这里发生了什么?

2 个答案:

答案 0 :(得分:5)

是的,您在git clone之后只有一个分支

事实上,在git clone完成之前,您没有分支

但是“拥有分支”并不意味着那么多

Git使用分支名称来记住特定的提交。每个名称记住一个,只有一个会提交。每个提交都通过其哈希ID进行唯一标识:一个很大的丑陋数字,例如b7bd9486b055c3f967a870311e704e3bb0654e4f

这些提交本身会记住以前的提交(通过大丑陋的哈希ID)。 Git将此称为每次提交的 parent 提交。这意味着只需要记住master之类的名称即可记住任何给定分支的 last 提交。 Git将此最终提交称为分支的 tip

这也意味着我们可以使用一个不同的,不完全是分支的名称来记住一些 other Git的分支!

进入远程跟踪分支

进行克隆涉及在内部运行git fetchgit fetch复制了其他Git的提交,git fetch也复制了它们的名称。它们的名称实际上是分支名称:它们记住分支提示,例如masterdevelop。但是它们不是您的分支提示提交-尚未! 您的 Git将它们重命名,分别为origin/masterorigin/develop。您的Git的远程跟踪名称(带有origin前缀)请记住其名称​​和提示提交。

运行git fetch将更新您的远程跟踪名称,以便您知道其新的分支提示提交是什么。当然,它也首先会获得他们所拥有的任何提交,而您没有。

黑暗魔法

  

[develop突然出现:]这里发生了什么黑魔法?

运行git checkout name时,Git首先在分支名称列表中搜索<​​em> name 。如果存在,Git会尝试检出作为您的分支 name 提示的特定提交,并使其成为当前分支。到目前为止一切顺利,但是如果 这个名字还不存在怎么办?

在这种情况下,git checkout不仅会失败,还会搜索您的远程跟踪名称,例如origin/masterorigin/develop。如果确实有一个与您要求的名称相似的名称,您的Git现在会创建您自己的分支名称,并将其设置为记住您的分支提示提交时,相同的哈希ID您的Git使用该远程跟踪名称记住的是他们的提示。

所以现在您有了一个develop,现在Git可以签出了!

实际上,这是git clone的最后一步:这是您首先获得master的方式。从origin复制提交并将其名称更改为origin/*之后,您的Git运行了git checkout master。您的master尚不存在,因此您的Git是根据您的origin/master由他们的master创建的。 (哇!似乎还有很长的路要走,但最终一切都有意义!)

答案 1 :(得分:3)

简短答案

当您clone(然后您fetch之后)时,本地版本库会获取远程分支的更新定义,但是不会自动创建本地副本。如果您只签出一个名称与远程分支之一匹配的(尚未本地存在)分支,则git会为您假设您需要跟踪该分支的远程版本。

尝试git branch -a查看所有内容。

更多信息,请参阅torek的非常完整的答案以解开其背后的详细信息。