Fork 和 Clone 有什么区别?

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

Jason Hibbets 拍摄

最近 Hacker News 上的一则标题引起了轰动 (原始推文在此)

Google forked Swift

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

Fork

在自由和开源软件中,Fork 项目 的概念已经存在了几十年。“Fork” 意味着复制项目,重命名,并围绕副本启动新的项目和社区。Fork 项目的人很少(如果有的话)会再次为父项目做出贡献。这相当于 罗伯特·弗罗斯特的诗: 代码库中有两条路径分叉,而我,我选择了人迹罕至的那一条……这造就了所有的不同。

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

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

Clone

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

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

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

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

这将创建一个存储库的本地克隆,您可以对其进行任意更改。如果您希望将更改贡献回原始存储库,则必须发送 拉取请求。除非原始存储库的维护者授予您直接访问权限,否则您无法在没有它的克隆和针对它的拉取请求的情况下为该存储库做出贡献。

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

复杂性

自由和开源软件从来都不是真正简单的,因此自然而然地,整个过程存在复杂性。

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

Chris Lattner - Swift at Google

原始 Chris Lattner 推文在此

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

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

6 条评论

我认为这不是对 “fork” 或 “clone” 词语的错误使用。我这样说的原因是 GIT 或 SVN 存储库之间的差异。当使用 GIT 时,您始终是按照协议的初衷进行 Fork。有时,这会使我们处于危险和利益的对立位置。我们不太可能看到项目死亡,因为维护者放弃了原始项目或唯一作者去世。在偶尔的情况下,关于主分支的混淆成为一个非凡的挑战。在某些情况下,由于此协议特有的格式,竞争协议或兼容性问题更有可能发生。但是,这反映了为什么这两个术语在此处没有被混淆。当然,当协议或语言中存在不兼容性时,会更加痛苦。但是,如果一个项目的两位拥护者都像苹果或谷歌那样规模庞大,那么我认为不太可能出现我们受到的伤害与我们获得的帮助一样多的情况。

回复 作者 Erez Schatz

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

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

回复 作者 Daniel Wolf (未验证)

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

在看到评论之前,一切都很清楚

坚持原文观点

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