3.4 如何使用版本管理系统

    从这里开始我们一起来看一下为了顺利地推进团队开发,我们应该用版本管理系统具体管理些什么,以及如何管理。

    3.4.1 前提

    本节的内容在没有特殊说明的情况下,都是使用 Git 和 GitHub 来进行说明的。但这里不会对 Git 的安装方法和基本命令等的使用方法进行说明。另外,虽然文中会出现一些 Git 命令,但也仅仅展示了这些命令的一般用法,这点请注意 30 。

    30 Git 拥有非常灵活的命令体系,执行相同的内容可以有多种做法。

    Git 的使用门槛虽然有些高,但它非常灵活易用,并且几乎包罗了所有的需求和用例。因此当你觉得 Git 无法实现某些功能时,可以查看一下相关网页 31 或参考书籍,还有 man 32 ,一定能找到实现的方法。

    31 可以参考如下资料。

    • 猴子都能懂的 GIT 入门

    http://backlogtool.com/git-guide/cn/

    • Pro Git

    http://git.oschina.net/progit/

    32 在 UNIX/Linux/MacOSX 环境下执行 man git 命令就会显示 Git 的帮助手册。

    3.4.2 版本管理系统管理的对象

    应该用版本管理系统进行管理的对象可谓是多种多样,用一句话来概括就是“能够管理的对象都应该用版本管理系统进行管理”。

    根据《程序员修炼之道:从小工到专家》33 一书中的解释,其理由如下。

    33 Andrew Hunt、David Thomas 著,马维达译,电子工业出版社,2011 年 1 月。——译者注

    把项目整体纳入到代码管理系统之中,这样的做法隐含着显著的优点。那就是能够实现输出文件的 build 作业自动化,并且能够反复执行。

    重要的是通过使用版本管理系统来管理所有项目发布所需要的文件,这样就可以实现 build 的自动化。如果为了生成产品发布所需要的文件,每次都要委托 QA 部门 34 进行测试,或者委托运维部门手动生成文件,那是不可能实现优质快速的开发的。

    34 负责确保软件质量的部门。

    上述思考方式称为持续集成(Continuous Integration,CI)和持续交付(Continuous Delivery,CD)。CI 和 CD 在这几年已经成为了热门词汇,其实在很久之前已经有一部分开发团队对此进行了实践。二者相关的内容将分别在第 5 章和第 6 章进行说明。

    为了实现 CI 和 CD 这样的实践,首要前提就是使用版本管理系统对所有必要的信息进行适当的管理。一般我们所说的应该管理的信息主要包括以下这些。

    • 代码

    • 需求定义、设计资料等文档

    • 数据库模式、数据

    • 中间件等的配置文件

    • 库的依赖关系定义

    ●…… 代码

    版本管理系统最基本的功能就是对代码进行管理。从版本管理系统也称为代码管理系统(Source Code Management,SCM)就可以看出,版本管理系统原本就是为了管理代码而设计的。

    优秀的团队开发,首先就要从对代码进行版本管理开始做起。这里所说的代码也包括测试代码。测试代码的写法将在第 5 章中进行讲解,对测试代码也要进行版本管理。

    ●…… 需求资料、设计资料等文档

    对项目相关的文档也应该尽可能地进行版本管理。根据所属团队和项目的不同,有些文档是由销售人员或者企划人员撰写的,有些是由程序员自己写的,可谓是多种多样。文档一般反映了项目的起因,即为了解决什么问题而开展的,是为了和后继者交接工作内容所写的非常重要的资料。并且随着项目的进行,对文档进行相应的修改也是常有的事情,因此要尽量一同进行版本管理。

    如果可能的话,请尽量用文本文件的形式来管理这些文档。现在已经有了 Markdown35 、Textile36 、reStructuredText37 等多种格式,它们虽然是文本形式,但在一定程度上也能制作出漂亮的文档。

    35 http://daringfireball.net/projects/markdown/

    36 http://textile.sitemonks.com/

    37 http://docutils.sourceforge.net/rst.html

    ●…… 数据库模式、数据

    现在可以说几乎不存在不使用数据库的 Web 应用程序。这也意味着没有理由不对数据库模式和数据 38 进行版本管理。

    38 这里的数据不是指随着用户的操作等而增加的事务数据,而是指初始化设置这样的程序启动所必需的主数据(master data)。

    正如我们在第 2 章的案例中所见到的那样,是否能够管理好数据库模式及数据将直接决定团队开发是否能够顺利进行。本章稍后会介绍成功管理数据库的机制。

    ●…… 配置文件

    应用程序一般都会使用到一些 Web 应用程序框架以及中间件。这些 Web 应用程序的框架和中间件的配置文件也应该进行版本管理。

    根据部署环境的不同,配置文件中的值也会相应地改变,因此就必须根据环境把配置文件分开来。Ruby on Rails 和 Play Framework 等最近的 Web 应用程序框架提供了针对不同环境进行配置的机制,可以直接使用。

    但是,Apache、PostgreSQL、memcached 等应用程序的配置文件大都没有提供根据环境进行配置的机制,这方面只能自己花一些工夫了。

    ●…… 库的依赖关系定义

    Java 的话有 Apache Commons39 系列的库,脚本语言的话有 ImageMagick 40 和 Mechanize41 等,一般开发过程中都会用到一些外部的库。这些外部库的依赖关系也应该纳入到版本管理系统中进行适当的管理。

    39 http://commons.apache.org/

    40 http://www.imagemagick.org/

    41 http://mechanize.rubyforge.org/