Fork 和 Clone 之间有什么区别?

提示:这与您要贡献的社区有关。这是一个完整的解释。
412 位读者喜欢这篇文章。
Forks and spoons, Open Office and Libre Office

Jason Hibbets 拍摄

最近 Hacker News 上的一个标题引起了轰动 (原始推文链接)

Google forked Swift

标题Google forked Swift,既准确又令人困惑。为什么会引起如此轩然大波?因为在自由和开源软件中,“fork”一词有两种含义。让我们进一步深入探讨。

Fork

Fork 项目的概念在自由和开源软件中已经存在了几十年。“Fork”意味着复制一个项目,重命名它,并围绕该副本启动一个新的项目和社区。Fork 项目的人很少甚至从不再次为父项目做出贡献。这相当于 Robert Frost 的诗: 代码库中有两条路径分叉,我,我选择了人迹罕至的那条……这造成了巨大的差异。

项目 fork 可能有很多原因。也许项目已经搁置了一段时间,有人想重新启动它。也许资助该项目的公司已被收购,社区担心新的母公司可能会关闭该项目。或者,也许社区内部存在分裂,部分社区已决定在该项目中朝着不同的方向发展。通常,项目 fork 伴随着大量的讨论,甚至可能还有社区冲突。无论原因是什么,项目 fork 都是复制一个项目,目的是围绕它创建一个新的、独立的社区。虽然 fork 确实需要一些技术工作,但它主要是一种社会行为。

在自由和开源软件的历史中,出现过很多 fork。一些著名的例子是 MariaDBMySQL fork 出来,NextCloudOwnCloud fork 出来,以及 JenkinsHudson fork 出来。

Clone

在过去,我们这些想在代码库上工作的人会启动我们的 CVSSubversion,并 check out 代码,以便在我们的沙箱中创建工作副本。

然后 git 出现了(Mercurial 也是,但它与这个问题没有直接关系)。作为一种 分布式版本控制系统(又名 DVCS,您不再“check out 工作副本”主存储库。相反,存储库的每个副本本身都可以对某人来说是主要的。要在 DVCS 中工作,您仍然必须获取代码的副本,但复制的代码与原始代码一样有效,并且可能与原始代码一样主要。因此,与其对代码执行 checkout,不如 clone 它。就像 "Orphan Black" 或任何其他优秀的科幻节目一样,clone 与原始来源相同,并且有可能成为主存储库,尽管这种情况很少发生(在 FOSS 中,如果不是在科幻中)。

如果您希望为使用 git 作为其版本控制系统的项目做出贡献,则需要创建它的 clone。例如,要为 Public_Speaking 存储库做出贡献,您首先需要使用以下 git 命令创建一个 clone

git clone https://github.com/vmbrasseur/Public_Speaking.git

这将创建存储库的本地 clone,您可以对其进行任何您喜欢的更改。如果您希望将更改贡献回原始存储库,则必须发送 pull request。除非原始存储库的维护者授予您直接访问权限,否则如果没有它的 clone 和针对它的 pull request,您将无法为该存储库做出贡献。

Clone 与 fork 不同,是技术行为,不需要涉及社区或任何社会变革。

复杂之处

在自由和开源软件中,没有什么事情是真正简单的,因此自然而然地,整个过程存在复杂之处。

GitHub 在 2008 年推出时,它选择 fork 这个词来表示 git clone 命令的操作。当您在 GitHub 上 fork 一个项目时,您实际上只是创建了它的一个 clone——您可以在其上执行工作的副本。完全有可能从这里您可能会选择以原始意义 fork 该项目:创建一个单独的项目和相关的社区,而不是简单地将 pull request 发送回原始项目。然而,几乎所有 fork GitHub 项目的人都只想创建一个个人工作副本,即 clonefork 这个词的这种过载用法在自由和开源软件社区中引起了不小的混乱,最近引起了人们的恐慌,即 Google 可能已经 fork(在原始意义上)了 Swift 编程语言(暗示它正在创建一个新的、单独的项目),而不是它实际所做的:clone 该项目以便为其做出贡献,就像任何优秀的自由和开源公民都会做的那样。

Chris Lattner - Swift at Google

(Chris Lattner 的原始推文链接)

所以您看,通常您的 fork 是一个 clone,但有时它是一个 fork。这一切都取决于您是仅仅为原始社区做出贡献 (clone) 还是试图组建一个新的社区 (fork)...或者如果您使用的是 GitHub,在这种情况下,您的 fork 是一个 clone,反之亦然。

VM Brasseur profile photo
VM(又名 Vicky)在科技行业的大部分 20 年时间里都在领导软件开发部门和团队,并为中小型企业提供技术管理和领导力咨询。

6 条评论

我认为这不是对“fork”或“clone”一词的错误使用。我这样说的原因是 GIT 或 SVN 存储库之间存在差异。当使用 GIT 时,您始终会根据协议的意图进行 fork。有时这会使我们处于危险和收益相反的境地。当维护者放弃原始项目或唯一作者去世时,我们不太可能看到项目消亡。在极少数情况下,关于主分支的混淆成为一项非凡的挑战。在某些情况下,由于这种协议特有的格式,竞争协议或兼容性问题更有可能出现。然而,这反映了为什么这两个术语在这里不会被混淆。当然,当协议或语言中存在不兼容性时,会更加痛苦。但是,如果一个项目的两个拥护者都像 Apple 或 Google 那么大,我认为不太可能出现我们受到的伤害与我们获得的帮助一样多的情况。

回复 ,作者:Erez Schatz

当然,两者之间没有区别。当您 fork 一个项目(XEmacs/GNUemacs 类型的 fork)时,您会创建一个 clone,然后进行所有品牌更改等操作。GitHub fork 和常规 git-clone 之间没有任何区别,除了 fork 是使用 GitHub 界面制作的,并且是 GitHub 界面的头等公民。我甚至会进一步建议 Linus(或任何提出这个术语的人)决定将 git-clone 称为“clone”而不是“fork”,以避免与项目 fork 相关的含义。

这从一开始就不是一个技术讨论,而只是一个被接受的名称。

回复 ,作者:Daniel Wolf (未验证)

在我看来,会使用这个词的人?应该是最了解如何使用它的人。例如,我不在 GitHub 上......不知道如何编码......而且我现在才开始将 Linux 系统管理员作为职业(RedHat 等),所以对我来说?“fork”?是从一个项目分支出来,以便可以启动一个辅助项目......例如 Debian 和 DeVuan......DeVuan fork 了 Debian......因为 Debian 是 DeVuan 基于的“模板”......

在看评论之前都很清楚

坚持原文

Creative Commons 许可协议本作品根据 Creative Commons Attribution-Share Alike 4.0 International License 许可。
© . All rights reserved.