我正在尝试理解/可视化分配回购的元素。我的开始参考是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
怎么样?
先感谢您的帮助。
答案 0 :(得分:4)
当您“分叉”时,您所做的就是在您可以检查的git存储库中有效地创建一个分支。
您克隆到的本地副本只是克隆并链接到您在git-hub上创建的分支。请记住,分支只是指向提交对象的指针,因此当您“分叉”时,您只需在其仓库中添加一个分支名称,该分支名称指向其主人的当前头部。
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
当您“分叉”时,您确实拥有一个实际的副本,因为您具有对它的读/写访问权限。 但是,最好将其视为一种有效“在原始git存储库上创建可以写入的分支”的方法。
“fork”操作将original
复制到您的GitHub帐户。您可以直接从local
克隆推送到forked
(非original
)。
简而言之,remote
是外部地址存储库的名称
“origin” - 指向forked
(“origin”是默认的remote
名称)
“上游” - 指向original
,以便您可以获取对回购的更改
您可以使用git remote -v
查看您的遥控器,并轻松添加它们以跟踪任何外部可用的git仓库中的任何分支。
部分来自Mark的回答。