1.2 Git的诞生
通常来说,当工具跟不上项目需求时,开发人员就会开发一个新的工具。实际上,在软件领域里,创造新工具经常看似简单和诱人。然而,鉴于市面上已经有了相当多的VCS,决定再创造一个却应该是要深思熟虑的。不过,如果有着充分的需求、理性的洞察以及良好的动机,则完全可以创造一个新的VCS。
Git就是这样一个VCS。它被它的创造者(Linus,一个脾气急躁又经常爆出冷幽默的人)称作“从地狱来的信息管理工具”。尽管Linux社区内部政治性的争论已经淹没了关于Git诞生的情形和时机的记忆,但是毋庸置疑,这个从烈火中诞生的VCS着实设计优良,能够胜任世界范围内大规模的软件开发工程。
在Git诞生之前,Linux内核开发过程中使用BitKeeper来作为VCS。BitKeeper提供当时的一些开源VCS(如RCS、CVS)所不能提供的高级操作。然而,在2005年春天,当BitKeeper的所有方对他们的免费版BitKeeper加入了额外的限制时,Linux社区意识到,使用BitKeeper不再是一个长期可行的解决方案。
Linus本人开始寻找替代品。这次,他回避使用商业解决方案,在自由软件包中寻找。然而,他却发现,在现有的自由软件解决方案中,那些在选择BitKeeper之前曾经发现的,导致他放弃自由软件解决方案的一些限制和缺陷如今依然存在。那么,这些已经存在的VCS到底存在什么缺陷?Linus没能在现有VCS中找到的有关特性到底是哪些?让我们来看看。
有助于分布式开发
分布式开发有很多方面,Linus希望有一个新的VCS能够尽可能覆盖这些方面。它必须允许并行开发,各人可以在自己的版本库中独立且同时地开发,而不需要与一个中心版本库时刻同步(因为这样会造成开发瓶颈)。它必须允许许多开发人员在不同的地方,甚至是离线的情况下,无障碍地开发,
能够胜任上千开发人员的规模
仅仅支持分布式开发模型还是不够的。Linus深知,每个Linux版本都凝聚了数以千计开发人员的心血。所以新的VCS必须能够很好地支持非常多的开发人员,无论这些开发人员工作在整个项目相同还是不同的部分。当然,新的VCS也必须能够可靠地将这些工作整合起来。
性能优异
Linus决心要确保新的VCS能够快速并且高效地执行。为了支持Linux内核开发中大量的更新操作,他知道不管是个人的更新操作,还是网络传输操作,都需要保证执行速度。为了节约存储空间,从而节约传输时间,需要使用“压缩”和“差异比较”技术。另外,使用分布式开发模型,而非集中式模型,同样也确保了网络的不确定因素不会影响到日常开发的效率。
保持完整性和可靠性
因为Git是一个分布式版本控制系统,所以非常需要能够绝对保证数据的完整性和不会被意外修改。那如何确定,在从一个开发人员到另一个开发人员的过程中,或者从一个版本库到另一个版本库的过程中,数据没有被意外修改呢?又如何确定版本库中的实际数据就是认为的那样?
Git使用一个叫做“安全散列函数”(SHA1)的通用加密散列函数,来命名和识别数据库中的对象。虽然也许理论上不是绝对的,但是在实践中,已经证实这是足够可靠的方式。
强化责任
版本控制系统的一个关键方面,就包括能够定位谁改动了文件,甚至改动的原因。Git对每一个有文件改动的提交(Git把一个历史版本叫做一个“提交”)强制使用“改动日志”。“改动日志”中存储的信息由开发人员、项目需求、管理策略等决定。Git确保被VCS管理的文件不会被莫名地修改,因为Git可以对所有的改动进行责任追踪。
不可变性
Git版本库中存储的数据对象均为不可变的。这意味着,一旦创建数据对象并把它们存放到数据库中,它们便不可修改。当然,它们可以重新创建,但是重新创建只是产生新的数据对象,原始数据对象并不会被替换。Git数据库的设计同时也意味着存储在版本数据库中的整个历史也是不可变的。使用不可变的对象有诸多优势,包括快速比较相同性。
原子事务
有了原子事务,可以让一系列不同但是相关的操作要么全部执行要么一个都不执行。这个特性可以确保在进行更新或者提交操作时,版本数据库不会陷入部分改变或者破损的状态。Git通过记录完整、离散的版本库状态来实现原子事务。而这些版本库状态都无法再分解成更小的独立状态。
支持并且鼓励基于分支的开发
几乎所有的VCS都支持在同一个项目中存在多个“支线”。例如,代码变更的一条支线叫做“开发”,而同时又存在另一条支线叫做“测试”。每个VCS同样可以将一条支线分叉为多条支线,在以后再将差异化后的支线合并。就像大多数VCS一样,Git把这样的支线叫做“分支”,并且给每个分支都命名。
伴随着分支的就是合并。Linus 不仅希望通过简单的分支功能来促进丰富的开发分支,还希望这些分支的合并可以变得简单容易。因为通常来说,分支的合并是各VCS使用中最为困难和痛苦的操作,所以,能够提供一个简单、清晰、快速的合并功能,是非常必要的。
完整的版本库
为了让各个开发人员不需要查询中心服务器就可以得到历史修订信息,每个人的版本库中都有一份关于每个文件的完整历史修订信息就非常重要。
一个清晰的内部设计
即使最终用户也许并不关心是否有一个清晰的内部设计,对于Linus以及其他Git开发人员来说,这确实非常重要。Git的对象模型拥有者简单的结构,并且能够保存原始数据最基本的部分和目录结构,能够记录变更内容等。再将这个对象模型和全局唯一标识符技术相结合,便可以得到一个用于分布式开发环境中的清晰数据对象。
免费自由(Be free, as in freedom)
——Nuff曾说过。
有了创造一个新VCS的清晰理由后,许多天才软件工程师一起创作出了Git。需求是创新之母!