1. 引言
备注
(2023 年 8 月)Wyag 现已完成!
本文旨在从基础开始,深入解释 Git 版本控制系统。这听起来并不简单,过去的尝试往往效果不佳。但有一个简单的方法:要理解 Git 的内部机制,只需从头实现一个 Git。
这不是开玩笑,也并不复杂:如果你仔细阅读这篇文章并编写代码(或者直接 下载代码 压缩包——但我强烈建议你自己动手写代码),你将得到一个名为 wyag
的程序,它实现了 Git 的基本功能:init
、add
、rm
、status
、commit
、log
……而且与 Git 本身兼容,甚至可以说最后添加关于提交部分的记录是由 wyag 本身而不是 Git 创建的 (链接)。所有这一切仅需 988 行简单的 Python 代码。
那么,Git 真的有那么复杂吗?我认为复杂性是个误解。确实,Git 是一个功能丰富的大型程序,但其核心其实非常简单,表面上的复杂性往往源于其深奥之处(而且 Git 被比作墨西哥卷饼 的讨论可能也没有帮助)。实际上,让 Git 令人困惑的,正是它核心模型的极简与强大。核心的简单性与丰富的应用之间的结合,常常让人难以理解,因为需要一定的思维跳跃才能从基本的简单性中推导出各种应用。
通过实现 Git,我们将能更清晰地认识其基本原理。
期待什么? 本文将详细实现和解释一个简化版本的 Git 核心命令(如果有不清楚的地方,请随时 反馈。我会保持代码简单明了,因此 wyag
的功能远不能与真正的 Git 命令行相提并论,但缺失的部分将显而易见,任何想要尝试的人都能轻松添加这些功能。“将 wyag 升级为一个功能齐全的 Git 库和 CLI 是留给读者的练习”,正如人们所说的那样。
更具体地说,我们将实现:
add
(wyag 源代码) git 手册页面cat-file
(wyag 源代码) git 手册页面check-ignore
(wyag 源代码) git 手册页面checkout
(wyag 源代码) git 手册页面commit
(wyag 源代码) git 手册页面hash-object
(wyag 源代码) git 手册页面init
(wyag 源代码) git 手册页面log
(wyag 源代码) git 手册页面ls-files
(wyag 源代码) git 手册页面ls-tree
(wyag 源代码) git 手册页面rev-parse
(wyag 源代码) git 手册页面rm
(wyag 源代码) git 手册页面show-ref
(wyag 源代码) git 手册页面status
(wyag 源代码) git 手册页面tag
(wyag 源代码) git 手册页面
你无需掌握太多知识即可跟上这篇文章:只需了解一些基本的 Git(显然)、一些基本的 Python 和一些基本的 shell 知识。
- 首先,我假设你对最基本的 git 命令 有一定了解——不需要达到专家水平,但如果你从未使用过
init
、add
、rm
、commit
或checkout
,你可能会感到困惑。 - 在编程语言方面,wyag 将使用 Python 实现。代码将保持简单易懂,因此对于初学者来说,Python 看起来像伪代码,容易上手(讽刺的是,最复杂的部分将是命令行参数解析逻辑,但你不需要深入理解这个)。如果你会编程但从未接触过 Python,建议找个速成课程熟悉一下这门语言。
wyag
和git
都是终端程序。我假设你对 Unix 终端操作非常熟悉。再强调一遍,你不需要是个黑客,但cd
、ls
、rm
、tree
等命令应该是你工具箱里的基本工具。
警告
对 Windows 用户的说明
wyag
应该能够在任何带有 Python 解释器的类 Unix 系统上运行,但我不确定它在 Windows 上的表现。测试套件绝对需要一个兼容 bash 的 shell,我相信 WSL 可以满足这一需求。此外,如果你使用 WSL,请确保你的 wyag
文件采用 Unix 风格的行结束符(请参见这个 StackOverflow 解决方案,适用于 VS Code)。欢迎 Windows 用户提供反馈!