一、版本控制
1.1 概念
什么是"版本控制"?版本控制就是一种记录一个或多个文件内容变化、以便开发者 或者其他用户将来对特定版本的文件进行查阅、备份、恢复等操作的系统,即版本控制系统。(VCS,version control system)。
1.2 为何需要版本控制
想象一下,你编辑了一个名为"可行性分析报告.docx"的文件,在特殊情况下可能需要保存这个文件不同时间的版本,很多人可能会像下图这样来命名,通过在文件名称后不同的后缀的方式,有的还会加上备份时间的后缀。这样做简单但只限于数据量少的文件,但特别容易出现错误,而且对于庞大数据量且进行过多次改变的源代码文件来说,无法人性化的记录和管理,也无法得知何时在某个版本上做了哪些改变。所以迫切需要一个科学化、人性化的管理系统来满足这方面的需求。
此时如果有一个系统,能满足我们这些需求:
1、记录文件的一切修改行为。
2、能够将文件回溯到某个被记录的修改任意时间点的状态,甚至将整个项目都回退到过去某个时间点的状态。
3、在用户编辑文件的同时记录何人、何时在何处做了何种改变。
4、比较不同版本文件的变化细节,查询何人在何处做了何种修改,达到查出问题根源的目的。
5、满足不同用户或开发者跨区域对同一个文件或者项目进行编辑协同工作的效果。
二、 SVN&Git
2.1 集中式版本控制系统
如何让在不同系统上的开发者协同工作? 于是集中式版本控制系统(Centralized Version Control Systems,简称 CVCS)应运而生。 这类系统,诸如 CVS、Subversion 以及 Perforce 等,都有一个单一的集中管理的服务器,保存所有文件的修订版本,而协同工作的人们都通过客户端连到这台服务器,取出最新的文件或者提交更新。
集中式版本控制系统的优缺点:
优点: 1、操作简单易上手、易用性高。 相对于CVS来说,每个项目成员都可以在一定程度上了解到其他项目成员的工作。
2、项目库管理员可以掌控项目组每个开发者的权限。
缺点:
1、版本库存放在中央服务器,首先需要从中央服务器获取最新版本,中央服务器如果发生单点故障宕机了,那么谁都无法提交更新,也就无法协同工作。
2、如果中心数据库的磁盘发生了损坏且没有进行过实时备份,将会导致丢失所有数据,包括项目的更新历史,只剩下每个人各自机器上保留的单独快照。
3、当想要协同工作或提交代码时,如果项目组成员碰巧刚刚在同一分支更新他们的工作,可能会发生冲突导致你的操作可能无法完成。
4、集中式版本控制要求客户端必须先与服务器同步代码,然后才能创建新版代码,具有限制性。
2.2 集中式版本控制系统-SVN
subversion 官网
Github SVN 源码
SVN
Apache Subversion 通常被缩写成 SVN,是一个开放源代码的版本控制系统,Subversion 在 2000 年由
CollabNet Inc 开发,现在发展成为 Apache 软件基金会的一个项目,同样是一个丰富的开发者和用户社区的一部分。SVN相对于的RCS、CVS,采用了分支管理系统,它的设计目标就是取代CVS。互联网上免费的版本控制服务多基于Subversion。
Subversion 使用情况
虽然在 2006年 时 Subversion 的使用族群仍然远少于传统的 CVS,但已经有许多开放源码团体决定将 CVS 转换为 Subversion。已经转换使用 Subversion 的包括了 FreeBSD、Apache Software Foundation、KDE、GNOME、GCC、Python、Samba、Mono 以及许多团体。有许多的团队换用 Subversion 是因为 Trac 所提供的专案管理环境。除此之外,一些自由软件开发的协作网如SourceForge除了提供 CVS 外,现在也提供专案开发者使用 Subversion 作为源码管理系统, JavaForge、Google Code以及 BountySource 则以 Subversion 作为官方的源码管理系统。
2.3 分布式版本控制系统
在分布式版本控制系统(Distributed Version Control System, DVCS)中,客户端(开发者)每次不只是提取最新版本的文件快照, 而是把代码仓库和完整的历史操作记录完整的复制克隆下来。这样就能解决集中式版本控制系统无法解决的在中央服务器单点故障等情况下丢失历史记录和数据的问题。如果发生了故障,只要客户端(开发者)将下载好的项目文件,同步到远程仓库即可。
2.4 分布式版本控制系统-Git
提到Git,就一定要提到一个人,林纳斯·本纳第克特·托瓦兹(Linus Benedict Torvalds),就是Linux内核的发明人及该计划的合作者。
Git如何诞生的?
同生活中的许多伟大事物一样,Git 诞生于一个极富纷争大举创新的年代。 Linux 内核开源项目有着为数众多的参与者。 绝大多数的Linux 内核维护工作都花在了提交补丁和保存归档的繁琐事务上(1991-2002年间)。 到 2002 年,整个项目组开始启用一个专有的分布式版本控制系统BitKeeper 来管理和维护代码。 到了 2005 年,开发 BitKeeper的商业公司同 Linux 内核开源社区的合作关系结束,他们收回了 Linux 内核社区免费使用 BitKeeper 的权力。 这就迫使 Linux 开源社区(特别是 Linux 的缔造者 Linus Torvalds)基于使用BitKeeper时的经验教训,开发出自己的版本系统。 他们对新的系统制订了若干目标:• 速度
• 简单的设计
•对非线性开发模式的强力支持(允许成千上万个并行开发的分支)
• 完全分布式
• 有能力高效管理类似 Linux内核一样的超大规模项目(速度和数据量)
自诞生于 2005 年以来,Git 日臻成熟完善,在高度易用的同时,仍然保留着初期设定的目标。
它的速度飞快, 极其适合管理大项目,有着令人难以置信的非线性分支管理系统(参见 Git 分支)。
Git是一个免费的开源分布式版本控制系统,旨在以快速和高效的方式处理从小型到超大型项目的所有内容。
Git易于学习,性能快如闪电。它超越了像Subversion、CVS、Perforce和ClearCase这样的配置管理工具,具有廉价的本地分支、方便的staging区域和多个工作流等特性。
Git 是分布式版本控制系统,这意味着项目的本地克隆是完整的版本控制存储库。 通过这些功能齐全的本地存储库,无论脱机还是远程都能轻松工作。 开发人员在本地提交工作,然后将存储库的副本与服务器上的副本同步。 这种范例不同于集中式版本控制,集中式版本控制要求客户端必须先与服务器同步代码,即需要服务器端软件的支持然后才能创建新版代码。
经过近二十年的发展,Git目前已经成为最先进、最主流的免费、开源的分布式控制系统。
Git官网
2.5 Git与SVN的区别
Git的优势:
1、直接记录快照、而非差异比较(SVN为基于差异的版本控制)
2、近乎所有操作都是本地执行(不需要外联到服务器去获取历史)
3、Git保证完整性(Git中所有的数据在存储前都计算校验和,以校验和来引用,意味着无法在Git不知道的情况下更改任何文件内容或目录内容;如果你在传送过程中损坏文件或丢失信息,Git会就可以发现。Git用以计算校验和的机制叫做SHA-1散列 )
4、Git一般只添加数据,Git几乎不会执行任何可能导致文件不可恢复的操作。你执行的Git操作,几乎只往Git数据库里添加数据。
Git的缺点:
1、Git复杂概念多,对新手不太友好,没有SVN易用性高。
2、Git学习周期长,深入学习需要多实践,但掌握后,就能感受到它的强大之处。
三、官方站点一览
subversion 官网
Git官网
About Version Control
about
microsoft-什么是 Git?