Git:Fork / Remote / Clone Concepts

时间:2011-11-12 12:13:28

标签: git github

我正在尝试理解/可视化分配回购的元素。我的开始参考是help page

第一个问题

当我分叉回购时,例如GitHub上的 Spoon-Knife (即点击其网站上的Fork按钮),是否意味着将 Spoon-Knife 复制到我的GitHub帐户?真正的副本真的发生了还是只是一个概念?

第二个问题

帮助页面的下一步是执行 clone

  

$ git clone git@github.com:username / Spoon-Knife.git

此命令在本地计算机上制作了源代码的副本。它是否从我的GitHub帐户中的分叉/复制仓库中克隆(请参阅我的第一个问题)?或者,从最初的 Spoon-Knife 回购?

第3个问题

关于配置遥控器的步骤:

  

当一个repo被克隆时,它有一个名为origin的默认远程指向你GitHub上的fork,而不是它分叉的原始repo。要跟踪原始仓库,您需要添加另一个名为upstream的远程。

那么,我的本地副本和我的GitHub帐户上的repo副本之间是origin某种“代理”吗?那么,upstream怎么样?

先感谢您的帮助。

6 个答案:

答案 0 :(得分:4)

  1. 当您“分叉”时,您所做的就是在您可以检查的git存储库中有效地创建一个分支。

  2. 您克隆到的本地副本只是克隆并链接到您在git-hub上创建的分支。请记住,分支只是指向提交对象的指针,因此当您“分叉”时,您只需在其仓库中添加一个分支名称,该分支名称指向其主人的当前头部。

  3. git中的遥控器只是外部地址存储库的名称。你的默认“origin”是由git设置的,只是一个命名的遥控器。 “upstream”只是另一个名称,指向您最初分支的原始master,以便您可以在master和您自己的分支之间进行更改。您可以使用git remote -v查看您的遥控器,并轻松添加它们以跟踪任何外部可用的git仓库中的任何分支。

答案 1 :(得分:4)

您需要区分 fork clone 的概念。

  • clone 是GitHub之前存在的Git概念:当您克隆存储库时,将其中的所有历史记录和数据复制到您自己新创建的存储库中。此外,在新存储库中自动创建远程,称为 origin ,它指向您克隆的存储库。

  • fork 是一个GitHub概念,核心Git不知道。当您分叉GitHub项目时,您正在创建自己的GitHub项目,该项目与原始项目相同,所有GitHub功能(如fork图表)会自动更新。在幕后,fork还包括在原始项目中克隆Git存储库,并在新创建的项目中创建新的Git存储库。

当您想从自己的私人计算机上处​​理GitHub项目时,您需要首先克隆该存储库,无论它是您的存储库还是其他人的存储库。如果你从你的 GitHub项目克隆,你会得到 origin ,但是如果你想把原始项目作为远程项目,你还需要添加手动(并称之为上游)。

答案 2 :(得分:2)

第一个问题:

你复制了它。事实上,它是一种克隆。您现在在github帐户中拥有该项目的副本(实际上是其中一个分支)。

第二个问题:

git clone命令克隆你提供的repo。 所以$ git clone git@github.com:username/Spoon-Knife.git克隆来自username回购的Spoon-Knife。如果是您的帐户,那么它是您的Spoon-Knife回购副本的副本:)

第3个问题:

origin不是代理,它只是另一个回购的名称。 例如,以下命令添加名为local_srv的仓库:

git remote add local_srv /path/to/local/srv

upstream只是另一个遥控器。您可以将其配置为从中提取(即获取更新)。

在你的情况下,origin是你的github仓库(我称之为远程github),你可以将upstream远程添加到原始的Spoon-Knife仓库。 因此,您在本地项目中工作,推送到您的github帐户(例如git push origin master)并使用git pull upstream master获取Spoon-Knife项目的最新更新。

注意:这里我只使用了master,但你可以用你喜欢的分支替换它。

答案 3 :(得分:1)

  

当我分叉回购时,例如GitHub上的Spoon-Knife,是否意味着Spoon-Knife被复制到我的GitHub帐户?

  

真正的副本真的发生了还是只是一个概念?

这是Github结束时的实现细节。对你来说无所谓。 (我很确定他们共享存储空间。)

  

它是否从我的GitHub帐户中的分叉/复制仓库中克隆了?或者,从最初的Spoon-Knife回购

由于您将其指向您的用户帐户的仓库,因此它将从那里复制它。不过,这两个叉子的内容在这一点上是相同的。

  

那么,我的本地副本和我的GitHub帐户上的repo副本之间是否有某种“代理”?上游怎么样?

不是真的。 “origin”只是GitHub上repo的标识符,使您可以更轻松地与它进行通信。 “上游”也会起作用。您不需要设置这些遥控器,但将它们用于您经常使用的所有存储库(推或拉变化)可以使您更轻松。名称“origin”和“upstream”也只是约定(你应该遵循),它们没有“魔力”。

答案 4 :(得分:1)

使用git,每个存储库都可以获得完整的历史记录。实际上(除了在本地存储库之间共享数据的一些优化之外),每个存储库都是另一个存储库的克隆。或者在git hub中说一个分叉(它们是同一个东西)。

所以你有三个存储库:原始的开发人员存储库,git hub上的一个克隆(他们称之为fork),以及这个克隆的本地克隆。名称origin只是一个简写名称,用于引用git hub(您的第一个克隆)上的存储库。如果没有这种速记,则必须在每一步都将完整的URI提供给存储库。

存储库可以有许多这样的简写名称到其他存储库。建议它们都是同一个原始存储库的克隆,以便历史记录是一个带有单个根的简单有向非循环图。

您可以在git hub上没有中间克隆的情况下工作,但由于您没有对原始开发人员存储库的写访问权限,因此您可以访问私有存储库是不切实际的,git上的这个存储库hub可以用作您和原作者之间补丁的通信网关。

答案 5 :(得分:1)

3 repos

original - {GitHub}/octocat/Spoon-Knife  
forked   - {GitHub}/   mine/Spoon-Knife  
local    -  {local}        /Spoon-Knife
  1. 当您“分叉”时,您确实拥有一个实际的副本,因为您具有对它的读/写访问权限。 但是,最好将其视为一种有效“在原始git存储库上创建可以写入的分支”的方法。

  2. “fork”操作将original复制到您的GitHub帐户。您可以直接从local克隆推送到forked(非original)。

  3. 简而言之,remote是外部地址存储库的名称 “origin” - 指向forked(“origin”是默认的remote名称)
    “上游” - 指向original,以便您可以获取对回购的更改

  4. 您可以使用git remote -v查看您的遥控器,并轻松添加它们以跟踪任何外部可用的git仓库中的任何分支。

    部分来自Mark的回答。