git clone:默认浅或不?

tis*_*sek 0 git clone shallow-clone

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

根据我最初的理解,这仍然是检索存储库时术语"克隆"的原因:因为我们实际上正在获取它 - 它的完整副本(允许完整的脱机工作或其他人克隆它)更多等).

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

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

Spi*_*keh 5

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

您需要联机才能执行提取,并且每个分支(默认情况下)是单独管理的.因此,如果您在"master"中执行"pull",则不会自动更新其他分支 - 尽管git将(再次,默认情况下)拉取所有其他分支的元数据,以便您可以在它们之间切换并根据需要执行合并至.

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

  • 功能/我的特征

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

"拉"是"获取"和"合并"的组合."fetch"从服务器中提取分支元数据,"merge"获取当前远程跟踪的分支提交,并将它们合并到本地分支中.

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

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