1972年,著作《高级 UNIX编程》的UNIX 牛人 Marc J. Rochkind, 在贝尔实验室开发了SCCS(Source Code Control System)。这是现代RCS、CVS、SVN、GIT等等版本控制系统的鼻祖。
版本控制系统如今优40多年的历史,纵观 IT 界,版本控制系统已经成为了我们做软件开发的必备技能,我们通过 版本管理代码、文字等等。
image.png版本管理的进化史,就是我们的信息时代的进化史。从软件开发的蛮荒时代,软件的规模逐渐扩大,单人开发到多团队协同,集市与大教堂并存。版本管理系统的进化史,主要分三个阶段单用户版本管理、集中式版本管理和分布式版本管理,从实际的软件系统进化来看,SCSS、RCS到CVS、SVN,再到现在的Git和Mercurial
image.png青铜时代:单用户版本管理
这个阶段的代表包括SCSS和RCS。1972年由Marc J. Rochkind开发的SCCS。通过将不同版本下的文件单独保存的形式完成,将同一版本的所有文件打包保存。SCCS使用了长达10年的时间。
image.png
直到1982年,Walter F.Tichy 发布了RCS (Revision Control System),提供了较SCCS更多的功能,并将其开源出来,并作为GNU项目的一部分,用以替代SCCS,SCCS当时还不是开源的。
image.png
白银时代:集中式版本管理
1986年创建的CVS也是一款使用时间长,范围广的版本控制软件。但其并不记录文件的更名,移动,并且CVS的commit操作并不支持原子(atomic)操作,这也带来了一定的安全隐患。其定义的branching模型一直沿用到后面的版本控制软件中。2008年5月,CVS的停止开发。
在功能上,CVS采用C/S架构体系,其代码都都存储在服务器端,开发者需从服务器上获得一份代码复制到本机,然后开发。开发者可随时将新代码提交给服务器,也可以通过更新操作获得最新的代码,保持与其他开发者的一致。CVS提供了一组用于与项目中的文件进行交互的命令,但是使用RCS历史文件格式和后台命令。
VCS历史上,CVS首次允许多个开发人员检出并同时处理相同的文件。CVS在处理多人同时修改页面时,采用"先允许修改,再处理冲突"。
image.png
2000伊始,Subversion (SVN)作为CVS的替代品问世,其几乎全面兼容CVS。2009年11月,Subversion被Apapche社区接受,目前由该社区进行开发维护。SVN提供了真正的atomic commits,增强了鲁棒性。同时,其提供了对文件的追踪,可以记录下文件在历史上的的改名,移动操作。使用SVN,可以轻松实现http下的版本控制,非常方便的进行branching,以及原生支持二进制文件的版本管理。
但SVN也存在着一些不足:SVN提出了一种tagging的模型(一个tag实际就是一个branch)进行版本控制,对文件系统以快照的形式保存,导致了虽然其本身的branching过程比较简单,但在客户端操作较为耗时。并且,SVN并不记录历史信息,无法进行diff操作。
image.png和CVS一样,SVN也使用集中式存储库模型。远程用户必须依赖网络来实现连接才能将其更改提交到中央存储库。
Subversion引入了原子提交的功能,确保提交将完全成功,或者在发生问题时被完全放弃。在CVS中,如果提交操作中途失败(例如,由于网络中断),则存储库可能损坏和不一致的状态。
Subversion中的提交或修订可以包含多个文件和目录。这样可以允许用户以项目为单位的跟踪相关更改集,而无需分别跟踪每个文件的更改。
黄金时代:集中式版本管理
接下来,便到了GIT出场的时候。Git的出现或许也是巧合,这源于BitMover停止提供免费的版本控***务。Linux Kernel的开发起初都是在BitMover公司的一套专利系统,BitKeeper,进行的,同时BitKeeper还支持着几个其他的开源软件的开发。由于合作一直进行,社区中的程序员起初并没有想过要自己开发一个版本控制软件。但2005年BitKeeper终止了与开源社区的合作协议,并支付了赔偿金(关于这部分还有很多有趣的争论,感兴趣的可以去看看BitKeeper and Linux: The end of the road?)。于是Linus等人根据在BitKeeper上的使用经验,开始着手开发自己的版本控制系统,
Git的最重要的功能在于其分布式的设计,这也是第一个分布式的版本控制软件,提供了客户端轻量级的维护。GIt的开发于2005年4月开始, 主要由Junio Hamano负责,于12月发布了1.0版本。这里是Git的开发仓库。目前,Github和BitBucket都提供了免费的Git服务。
与以往不同,Git强调了非线性的开发,具体体现在其方便的branch和merge功能。同时,使用Git进行版本控制速度快,尤其表现在大型软件的开发方面。
Git的缺点表现在其学习曲线,要想完全掌握Git的特性并不容易。另一方面,Git并不会记录空目录,这也是一些人抱怨的原因。
几乎与此同一时间的,Mercurial也是一个很成功的版本控制软件,拥有着与Git相同的目的。目前BitBucket提供了免费的Mercurial系统。
网友评论