我正试图了解以下情况:
在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分支,但这里发生了什么?
答案 0 :(得分:5)
git clone
之后只有一个分支事实上,在git clone
完成之前,您没有分支。
Git使用分支名称来记住特定的提交。每个名称记住一个,只有一个会提交。每个提交都通过其哈希ID进行唯一标识:一个很大的丑陋数字,例如b7bd9486b055c3f967a870311e704e3bb0654e4f
。
这些提交本身会记住以前的提交(通过其大丑陋的哈希ID)。 Git将此称为每次提交的 parent 提交。这意味着只需要记住master
之类的名称即可记住任何给定分支的 last 提交。 Git将此最终提交称为分支的 tip 。
这也意味着我们可以使用一个不同的,不完全是分支的名称来记住一些 other Git的分支!
进行克隆涉及在内部运行git fetch
。 git fetch
复制了其他Git的提交,git fetch
也复制了它们的名称。它们的名称实际上是分支名称:它们记住其分支提示,例如master
和develop
。但是它们不是您的分支提示提交-尚未! 您的 Git将它们重命名,分别为origin/master
和origin/develop
。您的Git的远程跟踪名称(带有origin
前缀)请记住其名称和提示提交。
运行git fetch
将更新您的远程跟踪名称,以便您知道其新的分支提示提交是什么。当然,它也首先会获得他们所拥有的任何提交,而您没有。
[
develop
突然出现:]这里发生了什么黑魔法?
运行git checkout name
时,Git首先在分支名称列表中搜索<em> name
。如果存在,Git会尝试检出作为您的分支 name
提示的特定提交,并使其成为当前分支。到目前为止一切顺利,但是如果 这个名字还不存在怎么办?
在这种情况下,git checkout
不仅会失败,还会搜索您的远程跟踪名称,例如origin/master
和origin/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的非常完整的答案以解开其背后的详细信息。