跳到主要内容

1. 版本控制简介

1.1. 为什么需要版本控制

1.1.1. 需求来源

我有朋友从事咨询行业,由于行业性质,他们经常要为甲方提供 PPT 材料。因为甲方的要求会随着心情和时间而反复横跳,他们最后提交的材料往往是《xx 项目报告 v0.52.1》这种命名。显然,命名中的 v0.52.1 不但讲述了一个悲伤的故事,还朴素地承担了版本管理的重任。

当然不只是在咨询行业有版本管理的需求。一个工作或任务,如果需要面对以下问题,那么就需要考虑是否要引入版本控制:

  1. 多人协作:多人协作时,需要保证各个人的工作不会相互冲突;
  2. 开发周期长:开发周期长的项目,需要记录工作的进度和历史;
  3. 频繁变更:需求频繁变更的项目,需要记录每次变更的内容。

显然,软件行业恰好具备了以上的特征:

  1. 大型软件开发过程中,需要大量的人力完成同一个项目;
  2. 软件开发周期长,一个软件的上线可能需要上述人马数月的开发;
  3. 变更需求是家常便饭,不论是领导还是甲方,总是有数不清的灵感需要员工来实现。

而代码,就是那个需要被版本控制系统管理的内容。

1.1.2. 版本控制的内容

在软件开发过程中,版本控制系统主要管理以下内容:

  1. 代码变更:版本控制系统可以记录代码的每一次变更,包括代码的增加与删除;
  2. 变更人:由谁做的这次变更;
  3. 变更内容:为什么做这次变更。虽然可以直接查看变更的代码,但是一个简短的描述可以让其他人更快地理解这次变更;
  4. 变更时间:这次变更是什么时候做的;
  5. 变更历史:每次变更都会被记录下来,形成一个变更历史,可以查看代码的演进过程;

1.2. 集中式与分布式版本控制

版本控制系统根据代码的管理方式与存放位置,可以分为两种:集中式版本控制系统和分布式版本控制系统。

1.2.1. 集中式版本控制系统

所谓集中式版本控制系统,是指所有的代码都存放在一个中央服务器上,每个人通过客户端连接到中央服务器,从而获取代码、提交代码等。中央服务器管理了所有的代码文件、版本信息、变更记录等等。

集中式版本控制系统的优点是:

  1. 管理方便:所有的代码都在一个地方,管理起来比较方便;
  2. 安全性高:中央服务器可以设置权限,保证代码的安全性;
  3. 易于控制:中央服务器可以控制每个人的权限,保证代码的质量。

但是,集中式版本控制系统也有一些缺点:

  1. 单点故障:中央服务器是整个系统的核心,一旦中央服务器出现问题,整个系统就会瘫痪;
  2. 依赖网络:所有的操作都需要连接到中央服务器,如果网络不稳定,就会影响工作效率;
  3. 不适合分布式团队:如果团队分布在不同的地方,集中式版本控制系统就会显得不够灵活。

虽然集中式版本控制系统有一些缺点,但是其简单直接的工作原理,易于搭建和使用的特点,使其一度成为了版本控制系统的主流。比如,CVS(Concurrent Versions System)就是一个非常著名的集中式版本控制系统。

1.2.2. 分布式版本控制系统

分布式版本控制系统是指每个人的电脑上都有一个完整的代码仓库,每个人都可以在自己的电脑上进行代码的管理、提交、分支等操作。分布式版本控制系统不依赖于中央服务器,每个人的电脑都可以作为一个中央服务器,可以独立工作。

当然为了保存代码的一致性,通常会有一个远程仓库,用来保存所有人的代码。

分布式版本控制系统的优点是:

  1. 离线工作:每个人的电脑都有一个完整的代码仓库,可以在没有网络的情况下工作;
  2. 分布式团队:分布式版本控制系统适合分布式团队,每个人都可以独立工作;
  3. 仓库完整性:每个人的电脑都有一个完整的代码仓库,即使远程仓库出现问题,也可以恢复代码(实际上我就遇到过需要使用本地仓库还原远端仓库的场景)。

分布式版本控制系统的缺点是:

  1. 学习曲线陡峭:相对于集中式版本控制系统,分布式版本控制系统的学习曲线更陡峭;
  2. 安全性问题:每个人的电脑都有一个完整的代码仓库,安全性需要特别注意;
  3. 仓库冲突:分布式版本控制系统中,每个人都有一个完整的代码仓库,可能会出现仓库冲突的问题。

分布式版本控制系统的代表是 Git,同时 Git 也是目前最流行的版本控制系统,没有之一。

1.3. Git 小史(野史?)

曾经有一位天才程序员,他的名字叫 Linus Torvalds。在那个操作系统普遍收费的年代,他创造了一个名叫 Linux 的操作系统,并且将其开源。Linux 的开源让操作系统的世界拨云见日,无数深受操作系统高昂授权费用之苦的程序员们加入到了 Linux 系统的开发中。

但是,随着参与人数的增多,代码管理的问题让 Linus 十分头疼。

最初,Linux 的代码是通过邮件的方式传递的。每个人都会将自己的代码通过邮件发送给 Linus,然后 Linus 会将这些代码合并到 Linux 的代码库中。显然这种方式的效率极低,而且极其容易出现错误。

彼时,市场上有一个商业版本控制系统 BitKeeper。BitKeeper 公司发现了 Linux 系统管理的窘境,因此向 Linus 抛出了橄榄枝,免费向 Linux 社区提供 BitKeeper 的使用权。Linux 社区欣然接受,从此 Linux 的代码管理逐渐走向了正轨。

然而好景不长,BitKeeper 公司在 2005 年撤回了对 Linux 社区的免费使用权。他们认为 Linux 社区一直在对 BitKeeper 进行逆向工程,因此撤回了 BitKeeper 的使用权。

此举让 Linus 十分愤怒,但是毕竟习惯了版本控制系统的好处,他决定自己写一个版本控制系统。

两周后,Git 的第一个可用版本诞生了。

2008 年,一个基于 Git 的代码托管平台诞生了,它的名字叫 GitHub。在未来的岁月中,GitHub 火遍了全球,成为全世界最大的代码托管平台,堪称程序员的“赛博乌托邦”,Git 也随之成为了全球最流行的版本控制系统。

当然,在不久的将来,BitKeeper 这个曾经大方光彩的商业版本控制系统,最终也在 GitHub 上开源了,这就是另一个故事了......