1

我对 git 的最初理解是(至少在最初)它是一个去中心化的 VCS(例如允许完全离线工作,甚至可以从另一个离线仓库克隆一个仓库……)。

根据我最初的理解,这仍然是检索存储库时术语“克隆”的原因:因为我们实际上得到了它的全部 - 它的完整副本(允许完整的离线工作或其他人克隆它一些更多等)。

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

那么我最初的理解是错误的吗?实际上是克隆而不是真正的克隆吗?它实际上是一个肤浅的吗?git clone 的默认设置是什么?官方文档仅说明 --depth “创建一个浅克隆”;我应该理解它让我选择所述克隆的深度(或者我应该说浅度?)?或者它会创建一个浅层克隆,而不是在没有选项的情况下创建一个深层克隆?

4

2 回答 2

6

当您克隆一个 git 存储库时,您将获得主分支的完整副本,并在克隆时检索其他分支的所有元数据(存储在您的存储库的 .git 目录中)。当您在本地签出/切换分支时,Git 使用此元数据构建分支。如果有人在您克隆存储库后或自您上次从远程获取数据后已推送到远程分支,则分支将过期。

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

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

  • 掌握
  • 功能/我的功能

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

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

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

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

于 2017-03-20T14:41:58.050 回答
0

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

于 2017-03-20T14:45:34.647 回答