本文从实践角度对版本控制系统进行直观介绍。

介绍过程遵循 2W1H 的思路(即: what-why-how ),希望能让看到的朋友更直观、深入、切实的理解 版本控制系统 ,并学以致用。

关于 2W1H ,可参考另外一篇文章: 思考你的思维——从 5w1h到2w1h到空、雨、伞

version_control.jpg

阅读之前

为了能更好的学习相关知识,这里给出阅读之前的一些建议,后面将依次对所学内容进行介绍。

what-所涉知识

版本控制系统的概念、用途、原理、实践、应用等方面的有关讲述。

who-适用人群

本课程适用人员包括但不仅限于:

  • 多人协作项目管理人员
  • 多人协作项目开发成员
  • 版本和文档管理人员
  • 系统部署和运维人员
  • 电子作品编辑和排版人员
  • 对版本控制工具感兴趣的人员

注:参与人员最好能对Linux基础和项目开发有一定的理解。

where-适用职业

  • 项目管理
  • 项目开发
  • 运维测试
  • 内容管理
  • 写作相关
  • 多人协作

why-学习目标

  • 理解版本控制系统的功能、概念
  • 理解版本控制系统发展历史概况
  • 理解版本控制系统的分类、区别、和优缺点
  • 理解版本控制系统管理的基本工作流程
  • 掌握版本控制系统运行的基本原理和实现架构
  • 理解版本控制系统的基本使用方式

when-所需时间

按照一定时间学习,而非固定的次序,假设时间单位为课时。
每个课时的实际时长可能是一个小时、一天、1甚至10分钟等等,具体情况因人而异。
学习之后将会达到前面所述的本文目标,所需时长估计大约占:7课时。

how-内容日程

以下列出本文主要内容(实际稳重并不严格按照相应的次序给出),
每个部分内容按照重要性和难度,大致所需时长与学习计划建议如下。

场景与需求(0.5课时)

给出应用场景,提出对版本控制系统的需求,并对其概念、功能、应用场景进行简单介绍。

发展与原理(0.5课时)

首先对版本控制系统出现的过程进行简单介绍,然后讲述版本控制系统功能的基本原理,最后给出版本控制系统本身的发展。

Subversion原理及应用(1课时)

对集中式版本控制系统阶段中的Subversion的原理、使用进行详细讲述。

Git原理及应用(1课时)

对分布式版本控制系统阶段中的Git的原理、使用进行详细讲述。

其它

简介(0.5课时)

对版本控制系统的概念、功能、应用场景进行简单介绍。

原理与应用

集中式版本控制系统(2课时)

对集中式版本控制系统原理进行讲述。

给出服务端的搭建以及客户端使用的典型工作流程。

版本控制系统的改进(1课时)

分析集中式版本控制的缺点,并针对集中式版本控制系统的缺点,给出分布式版本控制系统的思路。

分布式版本控制系统(2课时)

对分布式版本控制系统原理进行讲述。

给出分布式版本控制中本地端远端的工作典型方式。

总结(0.5课时)

在前面讲述版本控制系统的同时对版本控制系统的发展情况进行纵向概括,并给出版本控制系统的发展趋势。


什么是版本控制?

版本控制的正式定义有许多, 这里给出实践中总结的描述, 即:

版本控制系统是一种可供多人共同更新的存档管理系统, 存储文档的内容、时间、作者、版本、分支更新注释等信息,
并可根据这些信息对文档进行任意的历史回退、查询、比较、修改、删除、恢复、合并等操作.

若不考虑精确性,其实可这样直观的理解: 版本控制系统类似电脑中的文件系统,用目录实现文档的存储、管理、更新、和访问等操作。

除此之外,它还有一个“加强”的功能,即对存储于其中的内容,除在空间上的路径信息外,还记录了其历史等信息。

这也让版本控制系统拥有比传统文件系统更为高级的管理功能,类似某些高级编辑器中的“撤销”、“重做”、“宏操作”、“审阅”等功能。

为什么使用版本控制?

仅从上面的定义中,我们可能还是不太清楚版本控制系统有什么用途, 这里给出在实践应用中重要的几点。

存档

版本控制系统,其实就是一种存档管理系统(例如文件系统),可通过路径访问其中任意最近更新的文档,这和我们平时所见的 "磁盘目录", "云盘" 等这些存放文件资料的方式没有太大区别.

如图:

file_paths.png

历史

保存文档内容是一般存档系统的基本功能,但是为提供更为强大的功能,版本控制系统更包含了每个文档乃至整个存档系统的所有历史信息,这使得版本控制系统对其文档的访问,不仅限于传统“一维”文件路径的最新更新内容,更加入了时间维度,可访问过去某个时间、某个路径的文件,以及基于此扩展的更多特性。

如图:

version_control_paths.png

增强

版本控制系统,可看作传统存档系统的加强。

存储

与传统存档系统一样,版本控制系统可当作文件系统使用,存放文档内容。

协同

版本控制系统可允许多人共同更新存档信息,更新冲突的解决方式也有多种更为智能的选择途径;

如图:

coresponding.png

而多人协作在传统存档系统的途径仅仅是简单替换,手动修改,并且仅限于少数人。

版本

版本控制系统的任意文档可回退至其任意已存在的历史版本;

如图:

versions.png

而传统存档系统更新后仅仅包含当前最新的内容,从前的信息全部丢失。

分支

版本控制系统的任意文档可同时拥有多套独立的历史信息,各自保持其更新历程直至对应不同的最新版本,做为不同的用途,并且它们之间共享相同的内容;

如图:

branches.png

而传统存档系统,只能通过备份的方式,浪费空间,且数量也不宜过多。

合并

版本控制系统可方便的将任意版本、分支间的修改动作记录和回放,应用到另外一个版本、分支上,并且不必考虑没有变化的部分;

如图:

merge.png

而传统文件系统,只能在有限的几个重要新旧副本中,要么简单替换,要么通过特殊工具生成并打补丁的方式添加所需的修改到目标。

差异

版本控制系统可对比任意任意文档在任意时间、分支、版本、之间的区别,便于了解到在期间进行了哪些修改;

如图:

difference.png

而传统文件系统由于只有最新版本,完全无法了解其更新的历程。

查询

版本控制系统中可查询任意文档所有历史更新信息以及备注、分支、也可根据时间,作者等信息查询修改的内容、修改者等;

如图:

query.png

而传统文件系统只能看到文档的最新更新的内容、修改时间。

结论

综上我们可见,版本控制系统比日常所见的存档系统提供了更多的功能。

如果除了仅仅存储文档外,我们:

  • 还想能够将整个文档系统恢复到从前任意时间的状态
  • 想要随时撤销和重做对任意文档的错误或正确的更新
  • 想要多人共同维护修改系统中的任意文档
  • 想要查询文档是否变化、变化了多少、什么时候变化的、为什么变化
  • 想要将别人任意期间的修改动作自动轻松的应用到自己待更新的文件上
  • 等等等等……

这些要求:

  • 仅仅用传统的备份来实现?显然是不现实的,并且有些功能根本无法达到
  • 似乎只有在一个非常强大而理想的存储系统才可能实现一些?在某些商业系统的收费功能中,或许可以勉强做到一些。
  • 在版本控制系统中,根据前面所述,却是触手可及的功能!
undo_redo.png
multiuser.png
checkinfo.png
merge_change.png

集中式版本控制系统-Subversion