版本控制是记录一个或几个文件内容变化的系统,以便将来可以检查特定版本的修订。方便查看修改历史,备份和恢复之前的版本,保证多人协作时不出问题。
1.原始版本控制的黑暗时代版本控制工具:最原始的版本控制是手动版本控制:修改文件,保存文件的副本;保存的副本名称是随机的,很难区分新旧版本,也无法区分各个版本的修改内容。2.版本控制的由来:在最初的版本控制软件出现之前,diff patch其实已经有了比较好用的源码对比和打补丁的工具:diff和patch。LinTorvalds(Linux之父)也比较喜欢这两个工具。从1991年到2002年,甚至在CVS出现之后,Linus使用diff和patch来管理Linux代码。差异和补丁是源代码版本控制中使用的两个基本概念。CVS(并行版本系统):协作版本系统。2.1,差异简介
Diff用于比较两个文件或目录之间的差异。2.2、补丁简介
是补丁diff的逆向操作。我们把上面的差分结果保存在一个文件中,比如:diff.txt,那么这个diff.txt就可以用来从left.c计算right.c的内容,反之亦然。通过diff.txt,把left.c变成right.c的内容:
在$ patch left.c diff.txt上面执行的命令意味着diff.txt应用于left.c文件。命令完成后,left.c和right.c中的内容是相同的。通过diff.txt,把right.c改成原来的left.c内容:
$ patch -R right.c diff.txt在上面执行的命令中有一个额外的-R,这意味着diff.txt以相反的方式应用于right.c。命令完成后,right.c和left.c原来的内容是一样的。3.RCS:最早的本地版本控制工具RCS (Revision Control System)是一个很老的版本工具,远在SVN和退役的CVS之前,年龄应该甚至比Web开发的上一代ASP的CGI还要长。如果想深入研究版本管理的实现,从RCS入手是最简单的方法。RCS将RCS自带格式的diff的集合保存到磁盘(RCS格式的diff的内容可以由diff-n left . c right . c生成),通过这些diff的集合,可以返回到文件修改历史中的任意一点。4、CVS SVN:引入集中式版本控制工具CVS
CVS(Concurrent Versions System)诞生于1985年,是第一个大规模使用的版本控制工具。CVS的出现让工程师们可以一起工作。CVS中存在的问题
不支持原子提交会导致客户端提交给服务器的数据不完整,网络传输效率低。SVN出生了
SVN(Subversion)的目的是创建一个更好的版本控制来取代CVS。优化了内容在服务器上的存储,实现了原子提交。SVN存在的问题
在局域网外使用SVN,检查日志、提交数据等的延迟。光是这一点,就足以把基于广域网的协同工作团队逼疯。集中式版本控制的问题
提交渠道狭窄排队提交,不能同时修改,提交缺乏质量控制。缺少代码访问控制,缺少本地代码提交到服务器之间的检查保护。一种解决方案:Rietveld提供旁路检查,数据安全性差,单点故障hacking 5,Git:Linus的第二部巨著5.1,Git origin
Linux之父Linus是CVS的坚定反对者,他也反对SVN。2002年,Linus不顾开源社区精英们的批评,选择了商业版本控制系统BitKeeper作为Linux内核的代码管理工具。与CVS/SVN不同,BitKeeper是一个分布式版本控制系统。Git诞生于2005年4月3日,Git的发展由此开始。2005年4月6日,项目发布。2005年4月7日,Git可以作为自己的版本控制工具。2005年4月18日,发生了第一次多分支机构合并。2005年4月29日,Git的性能达到了Linus的预期。2005年6月16日,Linux内核2.6.12发布。当时Git已经在维护Linux内核的源代码了。5.2、集中式与分布式
集中式与分布式(1):记录差异或快照
Git和其他版本控制系统(包括Subversion和approximation工具)的主要区别在于Git处理数据的方式。从概念上讲,大多数其他系统以文件更改列表的形式存储信息。这样的系统(CVS,Subversion,Perforce,Bazaar等。)把保存的信息看成是一组基本文件和每个文件随时间逐渐积累的差异。Git不会以上述方式处理或保存数据。相反,Git更像是将数据视为一个小型文件系统的一组快照。每次提交更新或者在Git中保存项目状态时,主要是对当时的所有文件进行快照,并保存这个快照的索引。为了提高效率,如果文件没有被修改,Git将不会重新存储该文件,而只会保留一个指向之前存储的文件的链接。Git更像快照流一样处理数据。集中式与分布式(2):弱中央图书馆与强分布式图书馆
脆弱的中央存储库备份的重要性集中式CVS存在单点故障,因此备份极其重要。服务器压力基本上所有操作都需要和服务器交互,操作受带宽限制,无法移动办公。安全CVS假设服务器是安全的。假设成立吗?存在
单点故障,黑客攻击等。不适合开源项目强调集中管理,适合人数不多的项目。强壮的分布库全是服务器数据最安全;无带宽和性能瓶颈。提交为本地操作快;全离线操作;编码不会被冲突打断;能够移动办公。数据的完整性Git数据、提交全部使用SHA1哈希,以保证完整性,甚至提交可以使用PGP签名。工作模型适合分布式开发,强调个体。Git容灾示例kernel.org 2011 attack(2011.8-2011.11)宇宙射线反转磁盘一个比特的数据修复
5.3,选择合适的版本控制工具
SVN不适合的领域跨地域的协同开发对代码的高质量追求和代码门禁Git不适合的领域不适合Word等二进制文档的版本控制,因为:Git无锁定/解锁模式,故不能排他式修改。整体的读授权,不能将读授权精细到目录级别,解决方案:版本库按照目录拆分。6,结语:Git是什么Git是一个版本控制工具,而且是一个开源的分布式版本控制工具。按照Linus本人的描述,Git的很多命令设计是来源于BitKeeper,但是Git有更多属性:极快的速度简单的设计对非线性开发模式的强力支持(允许成千上万并行开发的分支)完全分布式有能力高效管理类似Linux内核一样的超大规模项目(速度和数据量)7,小结版本控制工具的发展历史经过:原始人工维护状态,本地RCS,集中式如CVS、SVN和分布式如Git。版本控制工具提供了协作开发的能力,借助它们我们可以回到任何时间的代码状态。集中式版本控制工具,几乎所有的动作都需要服务器参与,并且数据安全性与服务器关系很大。Git是分布式版本控制工具,除了与服务器之间进行按需同步之外,所有的提交操作都不需要服务器。