我有一个远程裸存储库,它有两个分支“master”和“testing”,其中 HEAD 指的是“testing”。 克隆此存储库时,如果“master”和“testing”在同一修订版上(即 HEAD == testing == master),git 会检查“master”。 仅当“测试”是一个(或多个)落后或领先的提交时,git clone 才会检查本地的“测试”分支。 我在 Mac OS X (10.6.8) 上用 git 1.7.5 试过这个。
附录: 我只是对非裸存储库进行了同样的尝试:
mkdir A
cd A
git init
touch a
git add a
git commit -m "init repo A with a"
git checkout -b testing
现在回到根目录:
cd ..
git clone A B
cd B
git branch -v -a
* master 28f599b init A
remotes/origin/HEAD -> origin/master
remotes/origin/master 28f599b init A
remotes/origin/testing 28f599b init A
是“大师”!回到 repo A(我们仍在分支“测试”中):
cd ../A
touch b
git add b
git commit -m "add b in branch testing"
现在“测试”是“大师”之前的一次提交。现在让我们再次克隆 A:
cd ..
git clone A C
cd C
git branch -a -v
* testing 23bca39 add b in branch testing
remotes/origin/HEAD -> origin/testing
remotes/origin/master 28f599b init A
remotes/origin/testing 23bca39 add b in branch testing
您可以通过返回 A 来重新验证这种奇怪的行为,检查“master”并将其与“testing” merge (以便所有分支都有相同的头)。现在将 A 克隆到 D 中,D 将在 master 上 checkout !
最佳答案
git clone
复制所有分支及其历史记录,以及它们头部的 SHA1 和 not 引用。 AFAIK refspecs 没有被转移,因为它们对于 git 来说比克隆更新(很明显),并且克隆协议(protocol)不保留它们......这意味着它猜测(编辑:这已被邮件列表确认)。
head 的 ref 是在克隆过程中通过匹配其 SHA1 来猜测的。在您的情况下,SHA1 是不明确的,因为 master
和 testing
都匹配,因此 master
是按惯例选择的。据我所知,这在任何地方都没有记录,但应该是。
要查看情况,请转到您的 B
示例存储库并运行 git ls-remote
。输出将为您提供 SHA1,而不是 refs:
1c3eebcd1bd3659a40f02880918d5fbd5614b51a HEAD
1c3eebcd1bd3659a40f02880918d5fbd5614b51a refs/heads/master
1c3eebcd1bd3659a40f02880918d5fbd5614b51a refs/heads/testing
作为解决方法,
git clone -b <branch_name>
将克隆并 checkout 您想要的分支 branch_name,例如 master 或 test。
我认为此时您必须坚持 HEAD 是 master 并且 master 是检查的默认分支的约定,如果您设置了不同的 head 供开发人员克隆,请使用 -b 开关。
关于git clone 不 checkout 事件分支,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6927778/