在 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
克隆开始的吗?
答案 0 :(得分:1)
首先,附注:孤儿分支是没有父且没有提交的分支。由于它没有提交,因此不存在。一旦你对它进行提交,它就不再是一个孤儿:它有一个提交,可以是父提交;它根本不再是一个孤儿分支。它只是一个普通的分支,就像其他所有分支一样。您的存储库的不寻常之处在于它现在有两个(或更多) root 提交:没有父级的提交。
既然你能够git fetch
这些东西,它们就不是孤儿分支;他们只是分支机构。 “孤儿”(或缺乏)只是一个红色的鲱鱼。
......当我做
时git fetch origin -- branch2
作为PetSerAl noted in a comment,git 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
的远程。