分叉 (软件开发)

分叉（，又译作衍生、分支）是一个软件工程名词，表示开发者从一个软件包中获取了源代码的拷贝，并开始独立开发，建立了另一个独立的软件。 这个术语不只意味着版本控制上的新开发分支，往往还表示开发人员社区的分裂，是一种意识形式的分裂。意识分裂往往用"Schism"这个词，例如: 

 "the Lemacs/FSFmacs schism"  (Jamie Zawinski, 2000)
 "Behind the KOffice split"  (Joe Brockmeier, Linux Weekly News, 2010-12-14)
 "Copyright assignment – once bitten, twice shy"  (Richard Hillesley, H-Online, 2010-08-06)
 "Forking is a feature"  (Anil Dash, 2010-09-10)
 "The Great Software Schism"  (Glyn Moody, Linux Journal, 2006-09-28)
 "To Fork Or Not To Fork: Lessons From Ubuntu and Debian"  (Benjamin Mako Hill, 2005).分叉的原因一般是用户偏好不同或原始软件的开发已经停滞或停止。

根据自由及开放源代码软件的定义，这些软件可以在未经事先许可的情况下，从原始开发团队分叉，并且不会违反著作权法律。但是，专有软件（例如 UNIX）的分叉在许可之下也会发生。

 词源 
早在14世纪，“fork”一词就被用来表示“分成分支，分道扬镳”。Entry 'fork' in Online Etymology Dictionary 在软件领域，该词让人联想到 fork 系统调用，运行中的进程创建一个与自身（几乎）相同的副本，这两个进程（通常）会分别执行不同的任务。"The term fork is derived from the POSIX standard for operating systems: the system call used so that a process generates a copy of itself is called fork()." 

在软件开发中，早在 1980 年，艾瑞克·奥尔曼 就在版本控制系统里使用“fork”来表示创建一个新的修订“分支”：Allman, Eric. "An Introduction to the Source Code Control System."  Project Ingres, University of California at Berkeley, 1980.

1983 年，Usenet 开始使用该术语来表示创建子讨论组来细分讨论主题。Can somebody fork off a "net.philosophy"?  (John Gilmore, net.misc, 18 January 1983)

在 Lucid Emacs（现为 XEmacs）（1991年）和 BSD（1993-1994年）衍生出来时，“Fork” 一词还没有用来表示社区的分裂。当时（1993年） Russ Nelson 使用 “shattering” 一词来表示这种分叉，并将其归因于  John Gilmore。Shattering — good or bad?  (Russell Nelson, gnu.misc.discuss, 1 October 1993)到了1995年，“fork” 开始有了现在的意思，用来描述 XEmacs 的分裂，Re: Hey Franz: 32K Windows SUCK!!!!!  (Bill Dubuque, cu.cs.macl.info, 21 September 1995)1996年该用法成为 GNU 项目中一种公认的用法。Lignux?  (Marcus G. Daniels, gnu.misc.discuss, 7 June 1996)

自由和开源软件的分叉
根据自由软件定义和开源定义，自由软件和开源软件可以合法地分叉，无需经过当前开发、管理或分发软件的人员的批准：

在自由软件中，分叉通常是因为目标不同或个性冲突，进而导致的分裂。在分叉中，双方的代码库几乎相同，但通常只有团队更大或控制网站的的一方保留完整的原始名称和对应的用户社区。因此，分叉会带来声誉损失。双方团队间的关系可能很融洽，也可能非常紧张。另外，友好分叉或软分叉是指不打算竞争，且希望最终并入原分支的分叉。

美國開源軟體推動者埃里克·雷蒙（Eric S. Raymond）在他的文章《Homesteading the Noosphere》中指出：“分叉最重要的特征是它会产生竞争项目，这些项目以后无法交换代码，从而分裂了潜在的开发者社区”。他在《新黑客词典》 《Jargon File》中指出：
Forked  (Jargon File), first added to v4.2.2 , 20 August 2000)

計算機科學家David A. Wheeler 指出了Why Open Source Software / Free Software (OSS/FS, FLOSS, or FOSS)? Look at the Numbers!: Forking  (David A. Wheeler)四种可能的分叉结果，并给出了例子：

 分叉消亡。这是目前最常见的情况，宣布分叉很容易，但继续独立开发和支持则要付出巨大努力。
 分叉被重新合并。（例如 EGCS克隆 作为 GCC 的新版本被“扶正”）
 原始版本消亡。（例如 X.Org Server 完全继承，而 XFree86 消亡)
 两者共存，通常各有所长。（例如 OpenBSD 和 NetBSD）

GitHub、Bitbucket 和 Launchpad 等网站提供免费的 DVCS 托管，明确支持独立分支，这样大大降低了分叉源代码存储库的技术、社会和财务障碍，GitHub 使用“fork”作为这种为项目做贡献的方法的术语。

分布式版本控制 (DVCS) 工具普及了“fork”一词的另一种用法，该用法不带感情色彩，与“branch”几乎没有区别。e.g.  参见 在类似 Mercurial 或 Git 的 DVCS 系统中为项目做贡献的常规方式是，首先创建存储库的个人分支，与主存储库独立，然后设法将更改合并入主存储库。GitHub、Bitbucket 和 Launchpad 等免费 DVCS 托管网站都明确支持个人分支，从技术、社会和经济方面降低了分叉源代码的难度，GitHub 使用“fork”作为术语来描述这种为项目做贡献的方式。

Fork 的版本编号通常从头开始（如 0.0.1、0.1 或 1.0），即使原始软件已经发展到例如 3.0、4.0 或 5.0 的版本了。但是如果分叉软件被设计为原始项目的直接替代品时，也会有例外，例如 MariaDB 作为 MySQL 的替代Forked a project, where do my version numbers start? 和 LibreOffice 作为 OpenOffice.org 的替代。

BSD许可证 允许分叉变成专有软件，而 Copyleft （公共版权）的支持者认为，商业激励使得专有化几乎不可避免。（因为公共版权许可证本身可以通过双重许可被规避掉，即额外以贡献者许可协议的形式授予专有权。）例子包括 macOS （基于专有的 NeXTSTEP 和开源的 FreeBSD）， Cedega 和 CrossOver （Wine 的专有分叉，尽管 CrossOver 紧跟 Wine 的进度并做出了相当大的贡献），EnterpriseDB （PostgreSQL 的分叉，增加了 Oracle 兼容性功能EnterpriseDB ），受支持的 PostgreSQL（带有专有 ESM 存储系统）Fujitsu Supported PostgreSQL 和 Netezza 的Netezza 专有且高度可扩展的 PostgreSQL 衍生产品。部分厂商会将更改回馈给社区项目，也有厂商将他们的更改留作自己的竞争优势。

专有软件的分叉
在 专有软件 中，版权方通常是公司实体，而不是单个软件开发人员。因此，当所有者需要开发不同版本时（窗口版和命令行版，或者不同操作系统的版本，例如一个 文字处理器 分别用于 IBM PC 兼容机和 Mac 计算机），专有的代码往往在这种情况下被分叉。这种内部分叉通常致力于在不同平台上保持相同的外观、感觉、数据格式和行为，让熟悉一个平台的用户也可以跨平台高效工作，或跨平台共享文档。这一决策通常出于财政考虑，占据更大的市场份额来弥补分叉产生的额外开发成本。

还有一次特别的专有软件分叉不是这种类型，那就是专有 UNIX 分叉出了许多变种——几乎都是在许可下从 AT&T Unix 衍生而来的，都被称为 “Unix”，但相互之间越来越不兼容。Fear of forking  – An essay about forking in free software projects, by Rick Moen参见 。

参见
 集体决策
 模块化编程
 团队效率
 代码重复

参考文献

外部链接
 Right to Fork  at MeatballWiki
 A PhD examining forking: (Nyman, 2015)  "Understanding Code Forking in Open Source Software – An examination of code forking, its effect on open source software, and how it is viewed and practiced by developers"

Category:软件复刻
Category:軟體專案管理
Category:软件开发