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

Kan*_*bot 0 git github git-clone git-branch

我想了解以下情况:

我和其他人正在使用Github的一个项目.我相信它除了主人之外还有几个分支(特别是"开发")

所以我将项目克隆到我的计算机上,git clone <url> 然后我得到了这个项目.我被告知我应该使用开发分支而不是主分支

所以我打字git branch看看那里有什么分支我得到了

$ git branch
* master
Run Code Online (Sandbox Code Playgroud)

什么?开发分支在哪里?

不过我确实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
Run Code Online (Sandbox Code Playgroud)

这里发生了什么黑魔法?它说开发是为了跟踪原产地的发展!那之前发展是隐藏的吗?无法访问?

在做完之后,git log --oneline --decorate我可以看到原点/开发分支,但刚刚发生了什么?

tor*_*rek 5

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

事实上,就在git clone完成之前,你没有分支.

但"有一个分支"并不意味着那么多

Git使用分支名称来记住特定的提交.每个名称都会记住一个,只有一个提交.每个提交都由其哈希ID唯一标识:像一个大丑陋的数字b7bd9486b055c3f967a870311e704e3bb0654e4f.

这是提交自己记住以前的提交(通过他们的丑陋的哈希ID).Git将此调用称为每次提交的提交.这意味着master仅需要记住任何给定分支的最后一次提交.Git将此最终提交称为分支的提示.

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

进入远程跟踪分支

制作克隆涉及内部运行git fetch.它git fetch复制了其他Git的提交,并git fetch复制了它们的名字.他们的名字实际上是分支名称:这些记住他们的分支提示,比如masterdevelop.但他们不是你的分支提示 - 还没有! 你的 Git 这些重命名origin/masterorigin/develop.你的Git的远程跟踪名称,带有origin前缀,记住他们的名字他们的提示.

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

黑暗魔法

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

当你运行时,Git首先搜索你的分支名称列表.如果它存在,Git会尝试检查出具体的承诺是尖分支,并让你的当前分支.到目前为止这么好 - 但如果这个名字还不存在呢?git checkout namenamename

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

所以现在你有一个develop,现在Git可以检查出来!

事实上,这是最后一步git clone:这就是你如何获得自己master的第一步.在复制提交origin并将其名称更改为之后origin/*,您的Git就会运行git checkout master.你还master没有存在,所以你的Git是从你origin/master的Git创建的那个创建的master.(哇!这似乎是漫长的过程,而且它确实很有意义!)