Git叉子实际上是Git克隆吗?

时间:2011-06-08 23:45:54

标签: git github git-clone git-fork

我一直听到有人说他们在Git中提供代码。 Git“fork”听起来像Git“克隆”,还有一些(毫无意义的)放弃未来合并的心理意愿。 Git中没有fork命令,对吧?

GitHub通过将对应关系固定到它上来使叉子变得更加真实。也就是说,您按下前叉按钮后,当您按下拉取请求按钮时,系统足够智能,可以通过电子邮件发送给所有者。因此,它是关于存储库所有权和权限的一点点舞蹈。

是/否?对GitHub的任何焦虑都会向这个方向扩展Git?或者有关Git吸收功能的谣言?

10 个答案:

答案 0 :(得分:883)

在GitHub上下文中,

Fork 不会扩展Git。
它只允许在服务器端进行克隆。

在本地工作站上克隆GitHub存储库时,除非明确声明为“贡献者”,否则无法返回上游存储库。那是因为你的克隆是该项目的一个单独的实例。如果您想为项目做出贡献,可以通过以下方式使用分叉来完成:

  • 克隆GitHub帐户上的GitHub存储库(即"fork" part,服务器端的克隆)
  • 贡献对GitHub存储库的提交(它在您自己的GitHub帐户中,因此您有权利推送它)
  • 通过您在自己的GitHub存储库上所做的更改,将任何有趣的贡献发送回原始GitHub存储库(即 "pull request" part

同时检查“Collaborative GitHub Workflow”。

如果要保留与原始存储库(也称为上游)的链接,则需要添加引用该原始存储库的远程数据库。
请参阅“What is the difference between origin and upstream on GitHub?

fork and upstream

使用Git 2.20(Q8 2018)等等,从fork获取效率更高,with delta islands

答案 1 :(得分:130)

  

我一直听到人们说他们在git中分配代码。 Git“fork”听起来像git“clone”,加上一些(无意义的)放弃未来合并的心理意愿。在git中没有fork命令,对吧?

“分叉”是一个概念,而不是任何版本控制系统特别支持的命令。

最简单的分叉与分支同义。每次创建分支时,无论您的VCS如何,您都“分叉”了。这些叉子通常很容易合并在一起。

你正在谈论的那种分支,一个单独的一方拿走代码的完整副本并走开,必然发生在VCS之类的集中式系统中,如Subversion。像Git这样的分布式VCS可以更好地支持分支整个代码库并有效地启动新项目。

Git(不是GitHub)本身支持以某种方式“分叉”整个回购(即克隆它):

  • 克隆时,会为您创建一个名为origin的遥控器
  • 默认情况下,克隆中的所有分支都将跟踪其origin等效项
  • 从您分叉的原始项目中获取和合并更改非常简单

Git将更改贡献给fork的源代码就像要求原始项目中的某个人从您那里获取,或者请求写访问权来自行推送更改一样。这是GitHub更容易和标准化的部分。

  

对Github的任何焦虑都会向这个方向扩展git?或者任何关于git吸收功能的谣言?

没有焦虑,因为你的假设是错误的。 GitHub通过一个漂亮的GUI和一个发布拉取请求的标准方式“扩展”了Git的分叉功能,但它没有向Git添加功能。完全复制分叉的概念在基础层面上直接进入分布式版本控制。您可以随时放弃GitHub并继续推送/拉动您“分叉”的项目。

答案 2 :(得分:77)

是的,fork是一个克隆。它的出现是因为,未经他们的许可,你不能将其他人的副本推送给他人。他们为您制作了副本 fork ),您也将获得写入权限。

将来,如果实际所有者或其他用户拥有类似您的更改的分支,他们可以将其拉回到自己的存储库中。或者,您可以向他们发送“拉动请求”。

答案 3 :(得分:37)

“Fork”在这个上下文中意味着“复制他们的代码,以便我可以添加自己的修改”。没有什么可说的了。每个克隆本质上都是一个fork,并且由原来决定是否从fork中提取更改。

答案 4 :(得分:25)

克隆涉及将git存储库的副本复制到本地计算机,而分叉则将存储库克隆到另一个存储库。克隆仅供个人使用(尽管可能会出现未来的合并),但是要求您复制并打开新的可能项目路径

答案 5 :(得分:10)

我认为fork是其他存储库的副本,但随着您的帐户修改。例如,如果您在本地直接克隆其他存储库,则远程对象源仍在使用您从中克隆的帐户。您无法提交和贡献您的代码。它只是一个纯粹的代码副本。否则,如果您分叉存储库,它将使用您的github帐户中的帐户设置更新来克隆存储库。然后在您的帐户环境中克隆回购,您可以提交您的代码。

答案 6 :(得分:10)

当您决定为某个项目做出贡献时,就完成了分叉。您可以复制整个项目及其历史记录日志。此副本完全在您的存储库中完成,一旦您进行了这些更改,您就会发出拉取请求。现在它可以接受您的拉取请求,并将更改合并到原始代码中。

Git clone是一个实际的命令,允许用户获取源的副本。 git clone [URL] 这应该在您自己的本地存储库中创建[URL]的副本。

答案 7 :(得分:7)

除了克隆是从服务器到您的机器并且分叉正在服务器本身上进行复制之外,一个重要的区别是当我们克隆时,我们实际上获得所有分支,标签等。

但是当我们分叉时,我们实际上只获取主分支中的当前文件,除此之外。这意味着我们没有获得其他分支等。

因此,如果您必须将某些东西合并回原始存储库,那么它就是一个存储库间合并,肯定需要更高的权限。

Fork不是Git中的命令;它只是GitHub实现的一个概念。记住Git被设计为在点对点环境中工作,而不需要与任何主副本同步。服务器只是另一个对等体,但我们将其视为主副本。

答案 8 :(得分:5)

这里有一个关于什么是“叉子”的误解。事实上,fork只不过是一组每用户分支。当您推送到fork时,您实际上会推送到原始存储库,因为这是唯一的存储库。

您可以通过推送到fork,注意提交然后转到原始存储库并使用提交ID来尝试此操作,您将看到提交位于原始存储库中。

这很有意义,但它远非显而易见(我最近偶然发现了这一点)。

当John分配存储库SuperProject时,似乎实际发生的事情是源存储库中的所有分支都使用“John.master”,“John.new_gui_project”等名称进行复制。

GitHub“隐藏”了“约翰”。来自我们并给我们一个错觉,我们在GitHub上有我们自己的“副本”存储库,但我们没有,甚至不需要。

所以我的fork的分支“master”实际上被命名为“Korporal.master”,但GitHub UI从未显示过这一点,只显示“master”。

根据我最近一直在做的事情以及当你思考它时,我认为这就是我认为的内容。非常好的设计。

出于这个原因,我认为微软很容易在他们的Visual Studio Team Services产品中实现Git分支。

答案 9 :(得分:3)

最简单的说,

当您说要分叉存储库时,基本上是在GitHub帐户中的GitHub ID下创建原始存储库的副本。

当您说要克隆时,您是在系统(PC /笔记本电脑)中直接创建原始存储库的本地副本,而在GitHub帐户中没有副本。

相关问题