在克隆完成时使用GIT获取另一个分支--深度1

在克隆完成时使用GIT获取另一个分支--深度1,git,github,Git,Github,我最近被介绍到--git clone的深度1。显然,这并没有得到所有的历史,而且速度要快得多。我用过: git克隆--深度1-b开发 这使我可以玩,修改和分支的发展分支 不过,现在我想看看另一个分支“BillsFeature” 我尝试了:git checkout BillsFeature并得到了 错误:pathspec“BillsFeature”与git已知的任何文件都不匹配 这对我来说有些道理。大概是因为我使用了--depth 1,我没有下拉分支名称如何获得另一个分支机构? 我也不需要Bill

我最近被介绍到--git clone的深度1。显然,这并没有得到所有的历史,而且速度要快得多。我用过:

git克隆--深度1-b开发

这使我可以玩,修改和分支的发展分支

不过,现在我想看看另一个分支“BillsFeature” 我尝试了:git checkout BillsFeature并得到了 错误:pathspec“BillsFeature”与git已知的任何文件都不匹配

这对我来说有些道理。大概是因为我使用了--depth 1,我没有下拉分支名称如何获得另一个分支机构? 我也不需要BillsFeature的历史记录。 我应该说我试过: git fetch--深度1原始帐单功能 似乎发生了什么事。然而,当我获得git状态时,我得到:

论分支机构的发展 您的分支机构的“起源/发展”是最新的

没什么要承诺的,正在清理树

谢谢,
Dave

问题的根源在于
git clone
--depth
选项也会打开
--single branch
。要在克隆时消除这种情况,请使用
--无单分支
。若要在之后击败它,请参阅To

请注意,在取消克隆的单分支后,必须再次运行
git fetch--depth 1
。这将从您克隆的存储库中检索其余的分支名称,所有分支名称都将成为远程跟踪名称;请参阅下面的详细信息,并允许您对每个这样的名称运行
git checkout
,以创建具有相同名称的本地分支。您还可以使用
git remote set branchs--add
将单个名称添加到现有远程设备;同样,您需要另一个
git fetch--depth

可选阅读:详细信息,或者,上面的工作原理 Git存储库从技术上讲,非裸存储库实际上由以下三部分组成:

  • 一对数据库,如下所述
  • 一个索引,Git通过它知道要提交哪些文件,即要跟踪哪些文件,尽管索引不仅仅是一个文件列表;及
  • 可以使用和修改文件的工作树或工作树。这些文件实际上是您的,实际上根本不在Git中。Git中的文件,在主数据库中,都是只读的,并且是一种特殊的压缩和消除重复的格式,只有Git自己可以使用
当你运行
git clone
时,你让你的git复制主数据库——保存所有提交和文件的数据库,但让它读取另一个数据库,解析并理解它,然后将另一个数据库写入你的克隆

--depth
标志会影响主数据库,因此您不会大量复制它。正如我们所注意到的,
--single branch
标志打开后会自动影响辅助数据库。在我们继续之前,让我们给这两个数据库命名,这样我们就不会一直提到一些尴尬的短语,如:

  • 我一直称之为“主数据库”的东西是Git的对象存储。这是一个简单的示例,其中键是散列ID,值是Git的提交和其他内部对象。1通常这是Git存储库的最大部分。2

  • 第二个数据库也是一个简单的键值存储,键值是名称,包括分支和标记名,但也包括Git的几乎所有其他名称3,值是散列ID。每个名称只存储一个哈希ID,因为这就是所需的全部内容

因此,总而言之,
git clone
将在没有
--单分支
--深度
标志的情况下调用其他git,并让它列出其所有分支、标记和其他名称。然后,它将使用这些名称查找原始存储库中的所有提交和其他Git对象,并让其他Git发送所有这些对象。结果是对象数据库的完整副本。4您现在拥有来自其他Git存储库的所有提交

但是,与此同时,您自己的Git会获取他们的所有名称,并选择要获取的名称以及如何处理这些名称。一般来说,您的Git会使用其所有分支名称,这些名称的完整拼写为
refs/heads/master
refs/heads/topic
,然后将它们重命名为您自己的远程跟踪名称:
refs/remotes/origin/master
refs/remotes/origin/topic
,等等。然后,您的Git创建自己的独立名称来散列ID数据库,其中没有分支名称。5

最终的结果是,在这一步
git clone
之后,您立即拥有所有提交,而没有分支!不过,通过最后一步的
git clone
,这种情况很快得到了纠正。如果您没有说
--no checkout
git clone
的最后一步是运行
git checkout
,这一步实际上创建了一个分支。Git创建的分支名称是随
-b
选项提供的名称。如果您没有提供
-b
选项,您的Git会询问另一个Git它推荐的分支,如果所有其他操作都失败,您的Git将采用您自己的默认初始分支名称。6


1每个提交对象引用一个(单个)树对象,该树对象保存该提交的快照,并具有元数据。每个树对象都包含一个部分文件名组件数组,这些组件将根据需要和另一个哈希ID串在一起。该哈希ID标识另一棵树或存储某个文件内容的blob对象。Git通过读取所有需要的子树来建立文件的全名,并将完整的文件名存储在其索引中,然后使用索引中显示的名称和blob哈希ID提取文件。这不是一个完整的描述,但这就是为什么Git不能
... <-F <-G <-H   <-- br1
             I--J   <-- br1
            /
...--F--G--H   <-- shared
            \
             K--L   <-- br2
             i--J   <-- br1

        g--H   <-- shared

             j--L   <-- br2
             I--J   <-- br1
            /
     f--G--H   <-- shared
            \
             K--L   <-- br2
...--V--W--X   <-- main
            \
             Y--Z   <-- topic
        w--X   <-- main
        w--X   <-- main
            \
             Y--Z   <-- topic
...--V--W--X   <-- main
      \
       Y--Z   <-- topic
...--V  w--X   <-- main
      \
       Y--Z   <-- topic
           X   <-- main

..--V--Y--Z   <-- topic