一、关于实施版本控制的必要性:
在公司现阶段开发过程中,尤其在多人并行开发,以及后期维护修改的过程中,经常出现这几种问题:1、程序员A已经修改了程序的某个版本1.0,形成版本1.0.1,而这时程序员B并不知道已经生成了版本1.0.1,他又在原来1.0程序的基础之上修改了好多的东西,而A和B程序员对自己所做的修改,并不能全部记忆下来,并且有很多重叠工作;项目负责人发现这种情况以后,就必须对他们两个人所做的东西进行整合处理(整合成一个版本);这样,浪费了大量的时间和精力;2、在后期维护过程中,出差在客户处修改程序,而不能对公司中的保留版本进行更新,造成再一次替换程序时,以前所做的修改丢失,又是重复劳动;3、一个程序对于不同的用户有不同的版本,由于各种原因,很可能导致混乱,客户越多,就多不好管理;4、现阶段代码的整合通常由项目管理者或者代码整合的专人来完成,他们并不清楚每个程序员所每天所做的每一个工作(包括修改一个提示语句什么的),而程序员本身,如果每天修改的东西过多,也未必都能记的起来,在这种情况下,通常我们通过与每个程序员进行交流,或者每个程序员保留修改文档,最后交给负责人整合代码的方式来完成代码的整合,这种方式出错的几率非常大,而且浪费时间;还有其他的问题,就不一一列举。
鉴于此,在程序开发过程以及后期维护中,建议进行版本控制(我个人觉得适合三人以上工作组开发),来解决上述问题。
二、CVS的版本控制可以做什么?(仅以我说接触到的功能,结合公司情况进行说明)
1、 在多人并行开发的时候,在CVS的辅助控制之下,不容易产生混乱,能够尽量避免重复性的工作;说的具体一点,就是他可以对多人同时修改的某段代码,给出提示让软件开发人员做出合理的判断,进行相应的处理;
2、 软件后期的维护工作,必然产生程序的不断的,反复的修改以及发布,他可以保留每次修改后的程序副本,在需要的时候可以取出;并且可以对比两个版本的不同之处,包括每一行代码的不同之处以及文件(增加、删除、修改、不变)的不同之处;
3、 对于不同客户处发布的不同的程序,可以通过他的分支来控制;现在暂时我只能做到创建一个分支,恢复一个分支,而我想一个分支还应该有在上面进行版本控制的功能,关于这点我正在研究ing;
CVS是当前软件开发界最热门的版本控制软件,听说freeBSD就是用他做版本控制,我们将要使用的是CVSNT服务器端,以及WinCvs客户端(对于jbuilder不需要WinCvs客户端);而他的功能很显然不可能只有我说的这么多,关于更多的功能就请大家有时间自己研究研究吧!
三、SourceSafe的版本控制可以做什么?(仅以我说接触到的功能,结合公司情况进行说明)
1、 关于他的并行开发控制这个方面似乎不大方便,对VB工程的同步好象有些问题;如果在不添加窗体或者其他东西的时候,控制的还不错,但是涉及到一个组件的增加删除,处理的不是很好;这个在我们的项目中用处不大;除非自己单机使用,还可以;
2、 对于两个版本软件的对比,这个方面的功能我觉得比CVS要好;这部分功能比较适合我们用电项目情况;经常更新代码,但又不能每一处修改都做记录的时候,可以用他做新老代码的对照;
SourceSafe好象在各个公司的版本控制中使用的比较少,在网上多是介绍使用原理的文章,而实际操作的寥寥无几。
四、CVS操作:(以Jbuilder和CVS结合为例)
CVS服务器以及WinCVS客户端的配置及操作详见《CVS参考手册》(我有),这里介绍CVS和Jbuilder结合的操作:
1、 选择版本控制软件:点击主菜单的team—>Select project VCS 弹出窗体如图,选择CVS;
2、 把项目放到版本控制服务器中,点击菜单team—>Place project into CVS,弹出窗口如下,设置服务器的各种属性以后,按照提示一步一步把项目放入到版本控制服务器中;
3、 在本地建立工作目录:点击菜单team—>pull project from CVS,如图:按照选择工作目录,按照提示把服务器上的最新代码拖拽到本地工作目录;
4、 把本地的一个类的代码与服务器最新代码同步:右键点击类,弹出菜单选择CVS—>update;如图:
5、 提交本地一个修改后的代码给服务器,就是上图中的update;
6、 查看本地一个类是否与服务器中的最新代码一致,就是上图中的Status for ……;
7、 批量更新本地代码:JB主菜单中的team—>update project;该操作把服务器中这个项目的代码覆盖本地的工作目录,不能够备份本地的工作目录,要慎重操作;
8、 批量提交本地代码:JB主菜单中的team—>commit Brower;他把整个工作目录的代码全部提交给服务器,当然只提交不一样的;并且在提交之前,可以查看每个不一样的代码究竟有何不同;如图:
从上图可以看到你将要对每个不一样的类的操作(Action)包括:commit(提交到服务器)、get(从服务器中取出)、no action(保持原样,不做操作);每个代码单元在工作目录中的状态Status,包括是否改变,是否存在,或者增加了;下面可以具体查看两个代码的不同,黄色的为新增的代码,红色的为删除的代码,其实上面的workspace Diff标签下面的框中可以看出,程序员把function btnMod_onClick(serviceName)……的两行,修改成了function btnMod_onClick(serviceId) ……;
9、 对比本地项目与服务器项目的不同:就是team—>Status Brower,具体与第8点类似;
10、 生成版本标签:team—>CVS administration—>create Version Label,如图:
11、 取出某个特定的版本(分支)的代码到自己的工作目录中:team—>CVS administration—>update special如图:
可以按照日期,按照分支(branch),按照版本(Version),取回代码;点击scan可以查看版本控制器中有哪些版本或者分支;
12、 整和特殊时期(版本,分支)与当前工作目录的代码:team—>CVS administration—>merge;如图:
五、SourceSafe操作:
原来打算抓图都写出来,现在看来太浪费时间了,关于他的配置与单机使用(联机使用经过我的测试,我感觉不好,或许是我的方式不正确也不一定),如果有人想知道,我可以和他讨论一下,就先不写了;
六、建议具体实施办法:
(A)关于web项目,由于Jbuilder可以直接和CVS结合,我建议按照如下工作方式工作:
1、 在大家确认整和了一个最新代码以后,把这个代码放到CVS服务器中(Jbuilder中为Place project into CVS,WinCVS客户端为import moudle);
2、 大家把服务器中的最新代码拖拽回本机(Jbuilder中是Pull project from CVS,WinCVS为check out moudle),保存到本机的一个目录中,这个目录就是以后你的工作目录,任何代码的修改都在这个目录完成;
3、 在操作员不清楚一个类或者窗体或者其他的开发单元,是否为最新的时候,通过update,来让本地的开发单元更新,保持与服务器上的代码同步;
4、 每次对一个代码编码以后,确定编码暂时完成以后,通过commit向服务器提交,如果产生还有其他人正在编写同一个单元的提示以后,大家协商解决;该操作一般在一天内完成,称为每日提交;
5、 由项目管理者或者版本控制人员,来创建版本标签;以便于随时恢复以前的版本;该操作可以一天一次,或者几天一次;
6、 对于不同客户所造成的代码不一致的情况使用分支来控制,并且对分支程序也进行上面的控制;(由于分支我还没有具体研究)所以也可以干脆不用分支,另外创建一个版本控制的模块,单独控制;
7、 对于一个项目,一个最新的代码未必是给用户发布的版本,可以通过tag来控制,也可以干脆在发布的版本上做一个特殊的标记;
(B)关于VB项目,由于VB不能直接和CVS整合(题外话:微软东西的一贯作风就是不喜欢整合别人的东西),所以如果要使用CVS就必须每个人都安装客户端,单独使用CVS进行版本控制;控制的步骤也是上面的7点;但CVS的整个项目不同版本的对比工作我觉得不如sourcesafe(指在WinCVS客户端中,在JB中还是不错的);所以可以通过使用sourcesafe对比两个项目的代码不同之处(这个操作不必把VB项目加入到sourcesafe中,直接对比两个目录就可以了);
VB项目也可以采用保守一点的办法,就是每个人改动之后,把代码(还有修改文档)交付到项目负责人手中,然后由项目负责人,用sourcesafe,参看每个程序员的修改文档,整合工程代码;
8、要就阶段性成果,把阶段性的代码和可执行文件以及文档等形成单独的项目做以标识;
七、注意事项:
任何工具都只能起到辅助作用,而主要决定因素是人;我觉得大家应该从思想上认识到并行开发时,多人协作代码统一的重要性;认识到自己机器上的修改并非真正在修改整个程序,只不过是打了一个草稿,只有提交到服务器,才是真正修改了程序;为了保证代码的同步:
1、 程序员必须在不清楚是否为最新代码的时候,与版本控制的服务器进行交流(update或者查看是否有不同),然后再修改本地代码;否则在修改了一天以后,可能发现有的代码以前已经修改过了;
2、 在每次修改完毕后,都要把自己的修改第一时间提交到服务器中;也可能产生修改了一天,修改了很多的地方,记不清楚究竟修改的是哪儿,那你可以通过本地和服务器代码的对比查看,也能确认出自己的修改,然后根据情况提交;
3、 在上述两点都保证的情况下,在关键时刻(比如:相对来说比较稳定的版本、某年某月某日发布给用户的版本,某次测试的版本)版本控制人员都要做版本标记,以便于随时找到某个时期的代码;
4、 版本控制不仅仅可以控制代码,我们也可以把所有的项目文档、数据库文档,都放到一个目录下,作为版本控制管理的一个部分,保存不同时期的整个程序文档,并且对比不同;
以上是我个人对版本控制的看法以及建议,希望大家讨论,有不足的地方请批评指正。