Skip to content


为什么使用DVCS

我们在开发过程中一般都使用VCS工具,最普遍的工具就是svn,但是在使用过程中还是会存在一些问题的。

假设一个场景
一个项目要进行开发,

  • A是底层核心功能开发人员,他要对底层进行开发,并且在第一时间所有的人都要获取他的代码
  • B是功能开发人员,进行一个feature1的开发
  • C,D是功能开发人员,进行另外一个feature2的开发
  • feature1和feature2要公用部分代码,比如同一个接口文件,并对他进行修改

假如我们用svn进行开发,这里面是有一个问题的,因为A的存在,feature1和feature2的开发并不能完全分开,而在开发阶段B,C,D三个人都不能随意的提交代码,否则feature1和feature2都会相互影响。如果他们真的都是分开的功能也没问题,但是因为C,D是一个feature的负责人,他们之间必须要进行代码交换,而因为svn是集中式开发,那么他们应该,必须,也只能通过svn进行代码交换。
如果

  1. C提交代码,要求D更新代码
  2. A提交代码,要求所有人更新代码
  3. D获取代码,A和C的,是正确的代码
  4. B获取代码,死菜了,因为C的代码是他不需要的,会影响他的工作,甚至都无法编译通过

这个是一个很普遍的场景,尤其是对人数多一些的小组。那么我们应该如何避免这种情况的发生呢?答案是使用DVCS系统,也就是分布式代码管理系统,例如bzr,hg等。

DVCS的出现可以方便的解决这类问题。与svn等传统VCS系统不同,DVCS并不需要一个中心服务器,每个人的开发工作区都可以认为是中心服务器。DVCS的基础是分支,每需要一个开发工作区,都是基于已有的某个开发工作区创建一个分支,然后开发,然后进行分支的代码merge。因为这种特性,DVCS的分支操作代价非常小。当然对于管理,发布等等我们还是需要一个中心服务器的,那么我们只要一个放在中心服务器的分支就足够了,使用完全相同的技术和下面的各个开发工作区进行代码交换。从技术上,他们的地位是完全等同的。
根据这些,我们再使用DVCS假设一下上述的开发场景

  1. 在中心服务器创建技术开发版本
  2. A,B,C,D分别根据中心服务器创建自己的开发分支
  3. A进行开发,每个阶段,B,C,D基于A提供的代码进行merge,比如A自己架设一个(临时的)ftp
  4. C进行开发,每一阶段,D基于C提供的代码进行merge,相对D的开发来说,情况一样。他们的开发完全不影响B的开发
  5. 最终都开发完成,一并merge回中心服务器

这就非常顺利的避免了上面遇到的问题。而且,DVCS因为是把自己的工作区认为是代码仓库(repository),所以可以随时的提交代码,随时记录自己的开发变更。而这个在svn当中有时就比较头疼,如果一个feature要开发时间比较长,那么中间的每一个小阶段的代码就很难记录了。

当然了,你可以说,我在svn当中采用给每个人开分支的方法解决这个问题。bingo,没错,但是,这已经就是DVCS的思想了,不是么?那么为什么不用一个现成的DVCS工具呢?

Posted in bzr, subversion.

Tagged with , , .


One Response

Stay in touch with the conversation, subscribe to the RSS feed for comments on this post.

  1. nrb says

    过来顶一下



Some HTML is OK

or, reply to this post via trackback.