1.1. 我们将学习什么

未匹配的标注

在过去的十年中, git 已经成为了世界上的开源软件或者在私有公司内最主要的版本控制和协作工具。它引领从中心化的版本控制到去中心化的潮流。在这个去中心化的模型中,每一个开发者都有一个完整的仓库在它们自己的电脑上。这极大地改变了软件开发流程,使得许多常用的操作更快,并且能够并启用全新的工作流去管理软件团队之间的变更。

Git一直以很难学习和使用而闻名。部分是因为范式变了,另外也是因为它的用户界面令人困惑,它提供了许多做同样事情的方法,并且在这些不同的命令之间也没有明确的职责划分。它设计过程的临时性就意味着给新手挖了很多坑。在于某些情况下,它的用户界面甚至比它的功能还要复杂。用户长期抱怨:为了有效地使用 git 你不得不知道背后它在做什么!

不幸的是要弄明白它究竟在做什么是个令人生畏的任务。我们可以通过磁盘上的文件来部分检验它正在做什么。但是有一些东西是必须看源代码的。在我写这本书时,当前 git 的版本是 V2.15.0,它的代码库已经有接近20万行的 C 代码。由于一些命令有非常多的选项,git 的代码有时候是非常复杂,并且在这么多不同的代码当中很难够看清楚它的主要功能。

本书中我们将从头构建我们自己版本的 git 去学习它是怎样工作的。

为了使比阅读源代码更容易,我们将采用两个简单的步骤。首先,我们不会实现接近完整的 git 的命令界面,而只会实现那些对制作一个代表核心概念的可用副本至关重要的部分。第二个,我们会使用一个带有很多标准库的高级语言,所以我们的代码会比使用 C 代码来重写要少得多。在可能的范围内。这个实现将通过对 git 本身的直接观察来得知。要么观察它对文件的效果,要么记录它的系统调用或者研究源代码。

为了保持诚实,我们不会在我们的代码库中依赖原始的 git 的实现。相反所有的添加到项目的 commit 都是被我们自己的软件产生的。这意味着我们在有足够的代码产生一个有效的 git 的 commit 之前,我们都不会 commit 任何东西。但事实证明我们并不要我们并不需要写非常多的代码来让这个项目开始启动。 self hosting 这个过程为添加新功能提供了强大的动力。我们将会很快地注意到哪些特定特性的缺乏限制了我们这个工具的效果?随着我们添加了新的特性,我们的这个实现就会变得越来越强大。每一个新的命令都将解锁未来进步的可能和机会。

我们将集中精力,尽快覆盖基本组件,而不是完全地实现每一个命令和它的所有选项。最终的目标是有一个软件能够存储并准确的检索它自己的 git 历史,然后将它自己推到一个在 github 上远程仓库。

在像 git 这样的工具中,许多编程概念都发挥了作用。研究它是一个很好的拓宽知识的方法。当我们在进行我们自己的实现时,我们将研究每一个组件背后的理论,以及为什么它要这样做。除了对 git 有一个更好的理解外,你将在这个过程当中学到许多编程概念,然后应用到其它问题当中。

你将学习 UNIX 系统概念,比如如何与文件打交道,进程是怎么工作的及它们是如何交互的,怎么把输出展示到终端。你还将学习到 git 用来保证 commit 历史简洁和有效搜索的数据结构。不管是在磁盘还是在网络上,你将学习到 diffing 和 merging file 的算法,怎么样去找到文件中共享的数据,以便它们能够被压缩。然后你还将学 git 它是怎么去实现一个分布式数据库的,它是如何支持多人同步编辑的,为什么合并冲突会发生,还有当用户分享它们对项目的更改时,如何避免竞态情况 (race conditions)。

Remark

文中所有带*前缀的为补充内容,原书并没有展开。

本文章首发在 LearnKu.com 网站上。

上一篇 下一篇
讨论数量: 0
发起讨论 只看当前版本


暂无话题~