版本控制
软件开发 |
---|
核心行动 |
范式与模式 |
方法论与框架 |
支持行为 |
实践 |
工具 |
标准与知识体系 |
版本控制(英语:Version control)是维护工程蓝图的标准做法,能追踪工程蓝图从诞生一直到定案的过程。此外,版本控制也是一种软件工程技巧,借此能在软件开发的过程中,确保由不同人所编辑的同一程序文件都得到同步。
概述
[编辑]透过文档控制(documentation control),能记录任何工程项目内各个模块的改动历程,并为每次改动编上序号。
一种简单的版本控制形式如下:赋给图的初版一个版本等级“A”。当做了第一次改变后,版本等级改为“B”,以此类推。最简单的例子是,最初的版本指定为“1”,当做了改变之后,版本编号增加为“2”,以此类推。
借此,版本控制能提供项目的设计者,将设计恢复到之前任一状态的选择权,这种选择权在设计过程进入死胡同时特别重要。
理论上所有的信息记录都可以加上版本控制,在过去的实务中,除了软件开发的流程,其它的领域中很少有使用较复杂的版本控制技巧与工具。目前已有人开始用版本控制软件来管理CAD电子文件,电路板设计,来补足本来由人手工执行的传统版本控制。
软件版本控制
[编辑]软件工程师常利用版本控制来跟踪、维护源代码、文件以及配置文件等的改动。
有时候,一个程序同时存有两个以上的版本有其必要性,例如:发布版本中程序错误已经被修正,但没有加入新功能;而开发版本则有新的功能正在开发、也有新的错误待解决,于是便需要同时维护两个不同的版本。
此外,为了找出只存在于某一特定版本中的程序错误、或找出程序错误出现的版本,开发人员也必须通过比对不同版本的源代码以找出问题的位置。
软件版本的控制方法
[编辑]在最简单的情况下,软件设计师可以自己保留一个程序的许多不同版本,并且为它们做适当的编号。这种简单的方法已被用在很多大型的软件项目中。该方法虽然可行,但不够有效率。除了必须同时维护很多几乎一样的源码备分外;而且极度依赖软件设计师的自我修养与开发纪律,但这却常是导致错误发生的原因。因此,有人开发出了将部分或全部版本控制工作自动化的版本控制系统。
差分编码
[编辑]大部分的版本控制软件采用差分编码:只保留文件相继版本之间的差异,这个方法可以更有效的存储数个版本的文件。
中央式系统与分布式系统
[编辑]大部分的软件开发案,会有好几个开发人员同时工作。如果两个人员同时要改变同一个文件,而没有管理访问权限,很可能会改写彼此的工作。
所以权限管理控制系统会在两种方法中择一解决:采用中央式系统,由中央权威管理访问权限;或是像分布式系统容许多个单位同时进行,包括同时更动同一文件。
传统上版本控制系统都是采用中央式系统:所有版本控制的工作在一个服务器进行,由中央权威管理访问权限“锁上”文件库中的文件,一次只让一个开发者工作。
2000年后,TeamWare、BitKeeper、和GNU开始用分布式版本控制系统:开发者直接在各自的本地文件库工作,并容许多个开发者同时更动同一文件,而各个文件库有另一个合并各个改变的功能。这个方式让开发者能不靠网络也能继续工作,也让开发者有充分的版本控制能力,而不需经中央权威许可。分布式系统仍然可以有文件上锁功能。
分布式系统Linux内核的发明人林纳斯·托瓦兹就是分布式版本控制系统的支持者,他开发了目前被开源社群广泛使用的分布式版本控制系统Git。
文件上锁
[编辑]文件上锁功能能对高难度的合并(例如大幅更改大文件或文件群的许多部分)提供一些保护,但其它开发者仍然可以绕过版本控制系统改变文件(这本身就是很大的问题)。所以文件上锁功能带来的功效与副作用一直饱受争议。
其它功能
[编辑]有些进步的版本控制工具提供更多功能,例如:
- 管理谁能改变程序的哪个部位,
- 提供某一个人控制权来审查哪些改变可以过关;
- 与开发环境集成。
维基百科用的MediaWiki也有版本控制的功能。
术语
[编辑]此章节需要扩充。 |
- 基线(Baseline)
- 基线是软件文件或源码(或其它产出物)的一个稳定版本,它是进一步开发的基础。[1]
- 仓库(Repository)
- 存储文件的新版本还有历史资料的地方,通常是在服务器上。有时候也叫Depot(像是在SVK、AccuRev还有Perforce中)
- 工作复本(Working copy)
- 从文件库中取出一个客户端的复制,针对一个特定的时间或是版本。所有在文件库中的文件更动,都是从一个工作版本中修改而来的,这也是这名称的由来。观念上,这是一个沙盒。
- 提交(Commit)
- 将客户端的修改送回文件库。(由版本控制软件处理“跟上次更动相比,哪个文件又被更动”的事)
- 变更(Change)
- 对一份文件作的特定更动。
- 变更记录(Change List)
- 取出(Check-Out)
- 从文件库取出文件到客户端。
- 更新(Update)
- 将文件库的修改送到客户端(与提交相反)
- 合并(Merge / Integration)
- 合并各个改变。
- 版次(Revision)
- 一个revision或version指的是一系列版本变迁的其中之一。
- 导入(Import)
- 导出(Export)
- 冲突(Conflict)
- 当两方更动同一份文件会发生冲突。
著名的版本控制软件
[编辑]- BitKeeper
- CVS(Concurrent Versions System)
- Micorosoft Visual SourceSafe/Team Foundation Server/Visual Studio Online
- Perforce
- Rational ClearCase
- 修订控制系统(GNU Revision Control System)
- Serena Dimention
- Subversion
- SVK
- Git
- Monotone (软件)
- GNU Bazaar
- Mercurial
- SourceGear Vault
注:多数不提供中文语言界面包(一部分本身即基于命令行接口),一部分对中文没有有很好的支持,处理中文时有乱码。但一般选用支持UNICODE的软件时,CJK便不成问题。
参看
[编辑]- 软件配置管理
- MEE
- 计算机支持的协同工作
- 协作版本系统
- 版本控制软件列表(List of revision control software)
- Software version
- 相关信息
- 形态管理(Configuration management)
- 源代码
- neutral build
- RevML(http://public.perforce.com/public/revml/index.html)
- SyncML
- WebDAV