git clone 不 checkout 事件分支

标签 git git-branch git-clone git-remote

我有一个远程裸存储库,它有两个分支“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 是不明确的,因为 mastertesting 都匹配,因此 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/

相关文章:

git - 如何解决 git 中分支名称和提交哈希之间的歧义?

git - 如何让现有的git分支跟踪远程分支?

git - Pycharm 在 Git 中表现异常(树条目中的文件名包含反斜杠)

git - 尝试在 SourceTree 中克隆 git 存储库时 SSH 身份验证失败

svn - 将单个提交添加到 Git 存储库的根目录/将 Git 导出到 Subversion

git - 自动中止 "failed"git rebase?

git - 我怎样才能在 master 上修复错误并将其集成到我不太稳定的分支中?

git - 当它们可能有轻微冲突时如何在 GitHub 中提交多个 pull 请求

Git 分支/ rebase 良好实践

visual-studio - 从 Azure DevOps 克隆时如何选择首选的 Visual Studio 版本