Fork 和 Clone 有什么区别?

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

Jason Hibbets 拍摄的照片

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

Google forked Swift

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

Fork

派生项目的概念在自由和开源软件中已经存在了几十年。“Fork” 意味着复制一个项目,重命名它,并围绕副本启动一个新项目和社区。那些派生项目的人很少甚至从不再次为父项目做出贡献。这就像 罗伯特·弗罗斯特的诗: 代码库中有两条路径分叉,我,我选择了人迹罕至的那一条……这造成了天壤之别。 的软件等价物。

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

在自由和开源软件的历史中,已经出现过许多 fork。一些著名的 fork 是 MariaDBMySQL 派生,NextCloudOwnCloud 派生,以及 JenkinsHudson 派生。

Clone

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

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

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

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

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

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

复杂性

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

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

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 基于的“模板”......

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

坚持原文

知识共享许可协议本作品根据知识共享署名-相同方式共享 4.0 国际许可协议获得许可。
© . All rights reserved.