我已经合理地成功地使用Git(也许这是一个乐观的评价),现在已经持续了两年,但是我们已经在一定程度上盲目地这样做了。无论出于何种原因,我已经开始对内部人员产生更多的好奇,并且最近一直在深入研究远程跟踪分支机构。它们总体上是有意义的,但我留下了这个问题:
当我克隆存储库并创建了所有远程跟踪分支时,“克隆存储库当前活动的分支”是什么(引自
git-clone
文档)?
如果我是从同事的存储库中克隆的,我想这将是git branch
结果中哪个本地分支在其前面有 * 的跟踪分支,但是如果我是从Github克隆的?它只是我在界面中选择的分支吗?初步测试表明情况并非如此。
感谢。
答案 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(它们将其称为“默认分支”)。