二、版本管理
版本管理工具的用途就不多说了。LZ想说的是,大部分开发人员用版本管理工具就是更新代码和提交代码,然而对于版本管理工具提供的其它功能的知道或使用则少的可怜。
在讨论版本管理工具的其它功能之前,先明确一个问题:哪些文件需要进行版本管理?
LZ提出这个问题,主要是发现有开发人员将Java编译后的class文件也提交到版本库了,WTF!对于将IDE的配置文件提交到版本库尚且可以说见仁见智,但是将编译后的文件以非里程碑版本打包的方式提交到版本库,LZ怎么觉得都是不应该的。
软件开发过程中,需要进行版本管理的文件有:程序源码文件(能编译成最终程序的最小单位)、软件文档(需求、产品、设计、其它说明性文档)。IDE的配置文件(Eclipse的.settings文件夹、.classpath文件、.project文件,IntelliJ IDEA的.idea文件夹和项目文件夹中的iml文件)则因目标程序的编译不应依赖于特定的IDE和需要持续集成(见后文“构建工具”)的关系,不需要进行版本管理,况且各人使用的IDE不一样就更不用说了。
LZ觉得版本管理工具在软件开发过程中经常使用的功能有:
1.分支&标记:对里程碑式的版本进行分支&标记处理,从而在版本树中可以方便的查看版本变化;
2.Bug追踪:配合合适的Bug管理工具,将代码的提交与相应的Bug关联起来;
3.版本回滚:对于功能或改进的取消,应该用回滚而不是再次修改后提交。
与IDE的集成:各版本管理工具都提供了对IDE和系统的资源管理器的集成,功能上差别不大,只是展现方式上的不一样。在使用IntelliJ IDEA中,发现IntelliJ IDEA对所有的版本管理工具界面统一,合并和比较版本时显示逐字上的差别。IntelliJ IDEA在版本管理中,还有个非常有用的功能:文件更改列表。代码的提交就是对一个个更改列表中的文件进行提交,这对于多个项目或者需要个性化开发、调试修改(不用提交到版本库)的这种情况特别有用。当然还可以设置忽略的文件或目录和匹配的文件。变更列表和最近的提交说明,SVN的TortoiseSVN似乎也提供,但可用性可能差了一点。至于SVN的Eclipse插件,因使用Eclipse的时间有限,所以不是很清楚。
IntelliJ IDEA的版本管理还可以非常方便的查看一个文件的每一行的最后修改人是谁及相应的提交版本号,并可以查看对应的提交版本的所有文件修改。这对于代码中的疑问的追踪处理非常有帮助。
提到忽略的文件或目录,不得不提Git。Git除了其分布式特性,本地提交和查看变更记录外,还有一个“.gitignore”配置文件,通过这个文件,可以设置Git的忽略文件或文件夹。在使用Git作为版本管理时,项目一开始在版本库中建立时就需要设置好应该忽略的文件或目录,这能完全避免上面所提到的非必要文件入版本库的问题。PS:或许是Git的分布式特性,在克隆项目时,会把项目的所有提交记录都克隆过来,项目文件(包括版本记录)通常比较大,所以不得不弄一个“忽略”配置功能。
有些开发人员在使用版本管理工具管理代码时,会经常将一大片的代码进行注释处理而不是删掉,甚至会加上注释的原因日期什么的。LZ就觉得纳闷了,如果这样处理,不就相当于版本管理工具的目的吗?那你还使用版本管理工具干嘛?如果确实要参考以前的实现什么的,添加一个注释说明,告诉代码阅读者让他查看变更记录不就好了?
另外,很多开发人员,在提交代码的时候,对于提交说明,通常只是草草几个字,没有任何意义,只是为了应付提交说明 不能为空。LZ觉得,这是一个很扯淡的事情,在提交说明里面写上本次提交做了什么事情(完成了什么功能,修改了什么功能,修复了什么Bug)有这么难?在有些公司需要写日报的情况下,很多人就不知道日报写什么,就更可笑了。在提交代码时,把说明写清楚,然后在下班前写日报时看下今天的代码提交记录,做了什么事情,不就有详细记录?如果项目管理流程妥当,直接在版本库中提取开发人员的提交记录,连手动填写日报的事情都省了。