Git 的发展历史
Git 的诞生是一个关于危机应对和技术远见的故事。2005 年,Linux 内核开发社区经历了一场突如其来的协议危机,最终催生了这个彻底改变软件开发流程的分布式版本控制系统。
1. BitKeeper 危机 (2005)
Section titled “1. BitKeeper 危机 (2005)”在 2002 年之前,Linux 内核开发团队使用一套自制的补丁和脚本来管理代码版本。这种方式效率低下,且难以处理大规模协作。2002 年,Linux 之父 Linus Torvalds 决定开始使用专有软件 BitKeeper。
BitKeeper 是一款分布式版本控制系统,由 BitMover 公司开发。为了支持开源项目,BitMover 向 Linux 内核团队免费提供了 BitKeeper 的使用权。这大大提升了内核开发的效率,但这个安排在 2005 年突然破裂。
协议撤销事件
Section titled “协议撤销事件”2005 年 4 月,一名名叫 Andrew Tridgell 的开发者试图通过逆向工程的方式,编写 BitKeeper 的兼容客户端。BitMover 公司对此反应强烈,认为这侵犯了他们的知识产权。作为报复,BitMover 宣布撤销 Linux 社区使用 BitKeeper 的免费许可。
2. Linus Torvalds 的解决方案
Section titled “2. Linus Torvalds 的解决方案”面对危机,Linus Torvalds 决定不再依赖任何第三方工具,而是自己动手开发一个全新的版本控制系统。他在 2005 年 4 月 3 日开始编写 Git,仅用约两周时间就完成了基本功能,一个月后即可用于 Linux 内核的开发。
Linus 为 Git 设定了严格的设计要求,这些要求至今仍然是 Git 的核心特性:
- 速度 (Speed): 必须能够在几秒钟内完成大规模代码库的提交和合并操作。
- 简单设计 (Simplicity): 核心代码库应该紧凑、可靠,避免不必要的复杂性。
- 非线性开发支持 (Strong support for non-linear development): 必须支持成千上万的并行分支和合并。
- 完全分布式 (Fully distributed): 每个开发者都拥有完整的代码历史,不依赖中央服务器。
- 大规模项目管理 (Efficient handling of large projects): 能够处理 Linux 内核这样超大规模的项目。
3. “Git” 名字的由来
Section titled “3. “Git” 名字的由来”关于 Git 名字的来源,有一个广为流传的故事:
在英式英语里,“git” 是一个俚语(贬义词),意为”混蛋”、“笨蛋”或”令人讨厌的人”(大致相当于美式英语中的 “jerk” 或 “idiot”)。Linus 用它来开玩笑式地命名这个项目。
当被问及名字含义时,Linus 这样解释:
“I’m an egotistical bastard, and I name all my projects after myself. First Linux, now git.”
(我是一个自负的家伙,我用我的名字给所有项目命名。先是 Linux,现在是 Git。)
4. 早期发展
Section titled “4. 早期发展”Git 最初仅用于 Linux 内核的开发。2005 年 7 月,项目维护权移交给了 Junio Hamano,他至今仍然是 Git 项目的核心维护者。
随着时间的推移,Git 的优势逐渐显现:
- 分布式架构: 即使没有网络,开发者也能正常提交和查看历史。
- 分支成本低廉: 创建和合并分支极其快速,鼓励频繁使用分支。
- 数据完整性: 使用哈希算法对每次提交进行校验,可有效检测数据损坏或篡改。(Git 正从 SHA-1 逐步迁移到更强的 SHA-256。)
这些特性使 Git 在 2008 年 GitHub 上线后迅速普及,随后 GitLab、Bitbucket 等托管平台进一步扩大了它的使用范围,最终成为现代软件开发的事实标准。
5. 为什么 Git 取代了 Subversion?
Section titled “5. 为什么 Git 取代了 Subversion?”在 Git 流行之前,集中式版本控制系统(如 CVS、Subversion/SVN)是主流。它们依赖中央服务器,所有的版本历史存储在服务器上,开发者客户端只保留最新代码的副本。
Git 的分布式模式带来了革命性变化:
| 特性 | 集中式 (SVN) | 分布式 (Git) |
|---|---|---|
| 单点故障 | 中央服务器宕机则无法提交 | 每个人都有完整历史,可离线工作 |
| 分支/合并 | 成本高,容易冲突 | 成本低,合并快速可靠 |
| 历史查看 | 需要网络连接 | 可离线查看完整历史 |
| 提交速度 | 慢(必须与服务器通信) | 快(本地操作) |