Git无法从孤儿分支中检出另一个孤儿分支

时间:2017-07-26 00:05:37

标签: git version-control

machine1 上,我创建了一个孤儿分支git checkout --orphan branch1

machine2 上,我使用这一个分支git clone <url> --branch branch1 --single-branch克隆了存储库。这按预期工作。

返回 machine1 我创建了一个新的第二个孤儿分支git checkout --orphan branch2

machine2 当我git fetch origin -- branch2时,它会回复:

  

* branch branch2 - &gt; FETCH_HEAD

但是当我尝试用git checkout branch2签出分支时,我看到了

  

错误:pathspec'branch2'与git已知的任何文件都不匹配。

我无法弄清楚如何从我的 machine2 获取和检出第二个孤儿分支。是因为它是以single-branch克隆开始的吗?

1 个答案:

答案 0 :(得分:1)

首先,附注:孤儿分支是没有父且没有提交的分支。由于它没有提交,因此不存在。一旦你对它进行提交,它就不再是一个孤儿:它有一个提交,可以是父提交;它根本不再是一个孤儿分支。它只是一个普通的分支,就像其他所有分支一样。您的存储库的不寻常之处在于它现在有两个(或更多) root 提交:没有父级的提交。

既然你能够git fetch这些东西,它们就不是孤儿分支;他们只是分支机构。 “孤儿”(或缺乏)只是一个红色的鲱鱼。

发生了什么

  

......当我做git fetch origin -- branch2

作为PetSerAl noted in a commentgit fetch refspec 参数可以并且通常应该包含两者远程源部件和< / em>目的地部分:

git fetch origin src:dst

源部分可以缩写(如branch2)或拼写出来(refs/heads/branch2,这样您就可以确定获得的是分支而不是标记或者其他的东西)。目标部分通常是您自己的存储库中的远程跟踪分支名称(不是分支!),例如refs/remotes/origin/branch2

refspec可以(并且对于远程跟踪分支,通常应该)以加号开头,告诉Git覆盖您自己的引用,无论这对您意味着什么。对于远程跟踪分支名称,覆盖是明智的。对于本地分支机构名称,它更值得怀疑。

通常你没有这个

如果您的Git版本至少为1.8.4,git fetch通常会自行计算出所有这些。但是单分支克隆是不同的:

  

是因为它是作为单分支克隆开始的吗?

是!作为单分支克隆,您的克隆将其默认fetch refspec设置为仅匹配单个分支。也就是说,git fetch查看存储库的配置,该配置说:除了这一个分支外,不要跟踪上游的任何内容。

您正在尝试获取不同的分支,因此您的git fetch假定您并不真正想要跟踪它。它将结果转储到临时FETCH_HEAD文件中,每个提取始终将所有内容转储(由于历史原因等),然后忘记它。

如果您将单分支克隆转换为普通克隆,通过编辑fetch =行来读取它通常的方式,您现在正常的克隆将表现正常,正常。有关详细信息,请参阅How do I "undo" a --single-branch clone?(其中接受的答案只包含一个名为origin的远程。