为什么克隆远程Git仓库会创建一个远程HEAD,而只是跟踪不会?

时间:2013-01-29 21:42:25

标签: git git-clone git-remote

我为项目中的参与者提供了Git配置,这些配置旨在为我和所有协作者提供相同的行为。因此,例如,我们的分支名称匹配,分支跟踪相同的远程。

在我结束时,我从一个包含我的项目的Git仓库开始,然后执行(1)

git checkout -b dev
git remote add development <dev-repo uri>
git push --set-upstream development dev

创建和配置我们将用于协作的分支和远程回购。然后我简单地指导我的合作者(2)

git clone -o development <dev-repo uri>

一切都按预期工作。特别是,本地回购“看起来”非常相同(这有助于沟通) - 除了一个区别:第二个配置,(2),在远程分支上有一个额外的分支:development/HEAD。这个分支是什么?它来自哪里?为什么它不存在于(1)中。它的存在(或缺席)是否有效?

2 个答案:

答案 0 :(得分:2)

问题的第一部分是a dupe

这是我对第二部分的猜测:当你克隆一个repo时,你正在从头开始构建一个完整的存储库,包括工作目录。没有远程HEAD,git不知道最初要检查哪个分支 - 换句话说,git不知道你的本地HEAD应该是什么,它不知道从哪里得到工作目录的文件。

另一方面,当您将遥控器添加到现有仓库时,您将添加已完成的内容。 Git不必关心遥控器默认检查哪个分支。您已经拥有本地HEAD,因此您无需远程指导。

答案 1 :(得分:1)

HEAD不是真正的分支,它是一个象征性的参考。在遥控器上它代表它的实际分支。您可以使用git symbolic-ref refs/remotes/development/HEAD查看其内容,或只是查看文件.git/refs/remotes/development/HEAD

当您克隆存储库时(默认情况下)该分支将在HEAD ref指向远程的本地存储库中检出,除非master也在该提交上,因为那时主分支被检出,它在某种程度上具有更高的优先级,至少在一年前是这种情况。

为什么它存在于您的存储库中而不存在于另一个存储库中?我不知道,但这并不重要。