git clone:默认浅或不?

时间:2017-03-20 14:25:53

标签: git clone shallow-clone

我对git的初步了解是(至少在最初阶段)它是一个分散的VCS(例如允许完全脱机工作,甚至克隆来自另一个离线存储库的repo ......)。

根据我最初的理解,这仍然是术语“克隆”的原因。检索存储库时:因为我们实际上已经完成了所有操作 - 它的完整副本(允许完整的脱机工作或其他人克隆它等等。)

但后来我意识到事实并非如此:有时我正在研究我的主人,这是最新的;然后切换到另一个分支,我希望它也是最新的,但是当我git fetch(或git pull)时,我会得到新东西(不一定 new)。

我最初的理解是错误的吗?实际上是克隆不是真正的克隆?它真的很浅吗? git clone的默认设置是什么?官方文档只说--depth"创建一个浅层克隆&#34 ;;我应该理解它能让我选择所述克隆的深度(或者我应该说浅薄?)?或者它创建了一个浅层克隆而不是一个没有选项的深层克隆?

2 个答案:

答案 0 :(得分:5)

当您克隆git repo时,您将获得master分支的完整副本,并在克隆时检索其他分支的所有元数据(存储在repo的.git目录中)。当你在本地检查它们/在它们之间切换时,Git使用这个元数据构建分支。如果有人在您克隆存储库之后推送到远程分支,或者从上次从远程获取数据,则分支将过时

您需要联机才能执行提取,并且每个分支(默认情况下)都是单独管理的。所以,如果你执行" pull"在" master"中,没有其他分支会自动更新 - 虽然git会(再次,默认情况下)为所有其他分支拉动元数据,以便您可以在它们之间切换并执行合并如你所愿。

提取的分支提交处于休眠状态,直到您在该分支中指定中工作时。这样做的原因是,您可能拥有本地分支的不同/工作副本,而您还不想将其与远程更改合并 - 因此,当您准备好这样做时,必须手动执行此操作。想象一下你有以下分支的场景:

  • 特征/我的特征

您目前正与另一位开发人员一起工作feature/my-feature - 您们都在定期推动代码并进行协作。然后,您被要求为LIVE修复错误;在这种情况下,您可以在feature/my-feature可能推送中存储或提交您的更改(如果更改已准备好供其他开发人员使用),请切换到master,执行此操作一个拉动并创建另一个错误修复分支来修复LIVE问题 - 你不希望你的feature/my-feature代码被覆盖......当你准备好时,你想要手动控制它远程分支发生变化。

A" pull"是一个" fetch"的组合和"合并"。 " fetch"从服务器中提取分支元数据,并且"合并"获取当前远程跟踪的分支提交,并将它们合并到您的本地分支。

A"浅层克隆"在git中仍然可以获得最新的代码快照,但不会克隆整个历史记录图。这是唯一的区别 - 它与分支无关。 depth参数允许您指定应为每个分支撤回的提交数。就个人而言,除了我在CI / CD服务器上撤回存储库之外,我从未需要使用它。

Git与TCS等VCS非常不同,而不仅仅是因为你必须一直在线。它非常灵活 - 并且允许您作为开发人员在工作方式上非常灵活(只要您根据自己的需要选择正确的分支策略) - 但不幸的是,它确实需要重新学习,尤其是当它需要时来自术语(例如git checkout不会从遥控器中提取代码 - 它只是在您的本地分支之间切换。)

答案 1 :(得分:0)

默认情况下,对于您正在拉动的分支,Git clone并不浅,但是除非您签出它们,否则它不会提取远程分支中提供的所有提交。如果要克隆备份或镜像,则应使用--bare选项。裸克隆拉取所有东西以获得完整副本。请注意,除非从另一个克隆指向,否则不能直接使用裸存储库,可能至少是本地克隆。