1 引言
原文地址为https://wyag.thb.lt/
本文试图从最基础的层面开始,从下至上解释Git版本控制系统。这听起来并不容易,并且已经有多次尝试,成功与否存疑。但是有一种简单的方式:理解Git的内部原理只需要从头开始重新实现Git。
别跑。
这并不是一个玩笑,而且真的并不复杂:如果你从头到尾阅读本文并编写代码(或者只是克隆仓库 - 但你真的应该自己编写代码),你将得到一个名为wyag的程序,它将实现Git的所有基本功能:init、add、rm、status、commit、log…以一种与Git本身完全兼容的方式。本文的最后一次提交实际上是使用wyag创建的,而不是git。而且所有这些只需563行非常简单的Python代码。
但是Git不是太复杂了吗?我认为Git的复杂性是一个误解。的确,Git是一个功能很多的大型程序。但是该程序的核心实际上非常简单,它的复杂性主要源于它经常令人费解(而Git是个大杂烩博客文章可能对此没有帮助)。但是也许最令人困惑的是Git核心模型的极端简单和强大。核心的简单性和强大的应用结合在一起,往往使得事物非常难以理解,因为从基本抽象的本质简单性中推导出各种应用所需的思维跳跃(幽灵变量,有人要来吗?)。
实现Git将展示其纯粹的基本原理。
可以期待什么?本文将详细实现并解释(如果有任何不清楚的地方,请反馈!)Git核心命令的一个非常简化版本。我将保持代码简单而直接,因此wyag不会接近真正的git命令行的强大功能 - 但是缺少的部分将是显而易见的,任何想尝试的人都可以轻松实现。“将wyag升级为一个功能齐全的git库和CLI是留给读者作为练习的”,就像他们所说的那样。
更具体地说,我们将实现以下内容:
- add() git手册页面
- cat-file(wyag源代码) git手册页面
- checkout(wyag源代码) git手册页面
- commit() git手册页面
- hash-object(wyag源代码) git手册页面
- init(wyag源代码) git手册页面
- log(wyag源代码) git手册页面
- ls-files(wyag源代码) git手册页面
- ls-tree() git手册页面
- merge() git手册页面
- rebase() git手册页面
- rev-parse() git手册页面
- rm() git手册页面
- show-ref() git手册页面
- tag(wyag源代码) git手册页面
在阅读本文时,你不需要掌握太多知识:只需要一些基本的Git知识(显然),一些基本的Python知识,以及一些基本的Shell知识。
首先,我只会假设你对最基本的git命令有一定的了解 - 不需要专家级水平,但如果你从未使用过init、add、rm、commit或checkout,你可能会迷失方向。
在语言上,wyag将使用Python实现。同样,我不会使用太高级的东西,而且Python看起来像伪代码,所以很容易理解(讽刺的是,最复杂的部分可能是命令行参数解析逻辑,但你不需要理解那部分)。然而,如果你懂编程但从未接触过Python,我建议你在互联网上找一个速成课程,以便熟悉这门语言。
wyag和git都是终端程序。我假设你熟悉Unix终端的使用方式。再次强调,你不需要成为一个黑客,但cd、ls、rm、tree等命令应该是你工具箱中的一部分。
title: 警告
# Windows用户请注意
wyag应该可以在任何带有Python解释器的类Unix系统上运行,但我完全不知道它在Windows上的表现如何。测试套件绝对需要一个兼容bash的Shell,我假设WSL可以提供。另外,如果你使用WSL,请确保你的`wyag`文件使用Unix风格的换行符(如果你使用VS Code,请参考这个StackOverflow解决方案)。希望能得到Windows用户的反馈!
title: 注意
# 致谢
本文得到了多个人的重要贡献,我对他们都表示感谢。特别感谢:
Github用户tammoippen,他首次起草了我简单地...忘记编写的tag_create函数(那是#9)。 Github用户hjlarry在#22中修复了多个问题。 GitHub用户cutebbb在#27中实现了ls-files的第一个版本,并通过这样做,终于将wyag引入到了暂存区的奇迹中!