什么是“克隆存储库当前活动的分支”

时间:2010-09-13 13:00:59

标签: git github dvcs

我已经合理地成功地使用Git(也许这是一个乐观的评价),现在已经持续了两年,但是我们已经在一定程度上盲目地这样做了。无论出于何种原因,我已经开始对内部人员产生更多的好奇,并且最近一直在深入研究远程跟踪分支机构。它们总体上是有意义的,但我留下了这个问题:

  

当我克隆存储库并创建了所有远程跟踪分支时,“克隆存储库当前活动的分支”是什么(引自git-clone文档)?

如果我是从同事的存储库中克隆的,我想这将是git branch结果中哪个本地分支在其前面有 * 的跟踪分支,但是如果我是从Github克隆的?它只是我在界面中选择的分支吗?初步测试表明情况并非如此。

感谢。

1 个答案:

答案 0 :(得分:1)

Git存储库当前活动的分支是其HEAD指向的分支。

在内部,HEAD只是一个文件,它位于存储库的GIT_DIR(非裸存储库的.git目录或裸存储库的顶部)的顶部。如果HEAD看起来像ref: refs/some/thing,则它被解释为命名ref的symref(符号引用)(通常是refs/heads/下的分支)。如果HEAD包含对象名称(SHA-1)的40字节ASCII十六进制表示,那么我们说它是“分离的HEAD”(因为它不是“附加”到正常分支)并且它的工作方式与普通{ {3}}(即它的工作方式与其他任何分支一样)。

如您所愿,git branch将显示当前活动的分支,前面带有星号。这适用于常规(非裸)和裸存储库。

在常规(非裸)存储库(具有工作树的存储库)中,HEAD通过正常使用 git checkout 自动维护:

git checkout other-branch
# HEAD is now a symref to refs/heads/other-branch

裸存储库(通常在服务器上使用)没有工作树,因此 git checkout 将无效。要更新裸存储库的HEAD,您必须使用ref

git symbolic-ref -m 'new default branch' HEAD refs/heads/other-branch
# HEAD is now a symref to refs/heads/other-branch

在这两种情况下,您都必须直接访问存储库才能更新HEAD以更改当前活动的分支。与大多数托管服务提供商一样,GitHub不提供对存储库的直接访问。但是,它确实提供了git symbolic-ref(它们将其称为“默认分支”)。