如果你对版本控制很有兴趣,但还没有真正使用,最可能的原因是版本控制让人困惑。如果你是新手的话,了解一下版本控制的基本概念是个不错的主意。
为什么版本控制很重要
如果没有使用版本控制,很有可能你还在使用类似“index-v12-old2.html”的方法更新文档,其实还有一些其它的方式不仅能够让你控制源代码和文件,而且让团队变得更有成效。如果如下内容听起来很耳熟:
- 通过邮件同团队沟通升级更新的信息
- 直接在生产环境里升级
- 不小心覆盖了一些文件,但再也不能恢复
其实可以做得更好:
- 文件名和目录结构在所有团队成员那里都是始终一致的
- 有信心做任何修改,甚至在必要的时候恢复原状
- 在团队里使用源代码控制系统作为交流方式
- 容易地部署代码的不同版本到staging或production服务器
- 知道谁在什么时候做了哪些改变
基本概念
跟踪变更
版本控制系统主要基于一个概念:跟踪发生在目录或文件里的变更。跟踪变更的特点因版本控制系统而异,从仅仅知道文件发生了更改到知道文件里具体的字符或字节发生的变化。
大多数情况下,我们设定一个目录或一组文件被版本控制跟踪变更,通过从某个主机check out(或clone)一个代码仓库、或告知软件哪个软件被置于版本控制之下。
这些置于版本控制下的文件或目录一般被称为代码仓库。
当我们做出更改时,版本控制会在幕后记录变化,这个过程对我们来说是透明的,直到我们准备提交哪些变更为止。
提交
当我们工作在版本控制之下的文件时,每个变更都被自动记录,变更包括修改文件、删除文件或目录、增加文件、移动文件或任何能够改变文件状态的操作。版本控制不会孤立地记录每一个变更,它将等待我们递交变更的一个集合,版本控制里这组集合的递交动作被称为commit。
修订版本和变更集
提交完成后,发生变更的记录被当作一个变更集(changeset),并为其分配一个唯一的修订版本号(revision)。这个修订版本号可能是自增型的数字(1、2、3),也可能是唯一的哈希字串(比如846eee7d92415cfd3f8a936d9ba5c3ad345831e5),具体是什么类型取决与版本控制系统,我们要知道的是变更集的修订版本号非常便于未来对变更集进行引用。变更集也包含了提交变更的人员、变更发生的时间、受到影响的文件或目录、对变更的注释说明、甚至也有文件里面发生变更的代码行数等信息。
这些信息对协同开发非常有价值,通过查看过往的修订版本和变更集可以但到项目进化的轨迹、可以评审组员的代码,每个版本控制系统都有查看完整修订历史或日志的工具和格式。
获取更新
在进行提交的时候,确保自己具有最新的版本非常重要,可以减少代码冲突的几率。从代码库获取最新变更的操作相当简单,通常就是执行pull或update操作,当执行pull或update操作时,只会下载你上次请求后发生变更的内容。
冲突
当获取最新的变更或进行提交时发生了冲突怎么办?或者说,当你的变更跟代码仓库里其他组员的变更内容非常相似,以至于版本控制系统不能决定哪个正确或更有权威时,该怎么办?大部分情况下,版本控制系统都会提供一些途径,让我们查看发生冲突版本的具体差异,提供决策依据。我们要么可以修改这些文件以合并更改的内容,要么抉择某一个作为正确的版本。解决冲突时,有必要跟提交了冲突代码的同事协作,避免丢失他们的工作成果。
差异对比
由于每个提交都记录了针对具体文件或目录的更改,有时查看修订版本之间的具体差异就非常有用。比如,如果最近的一次部署的网站出现了问题,通过排查发现某个特定的文件是罪魁祸首,最好的办法就是看看这个文件最近发生了什么更改。通过查看差异,可以比较两个文件发生便行的代码行,看看何人何时修改了这个文件。大多数版本控制系统可以查看提交历史里任意两个修订版本的差异。
分支与合并
分支跟合并是VCS的关键概念,这里就不翻译解释了。用好分支能够提高研发的效率和研发结果的健壮性。
版本控制系统的类型
版本控制系统主要分两个类别:中心式和非中心式,非中心式通常被称为分布式。
中心式
当前最流行的版本控制系统Subversion就是中心式的,它有一个中心服务器,向所有客户端提供服务。所有的变更、用户、提交和信息都必须通过这个中心服务器中转。
Subversion的主要优点:
- 容易理解
- 易于控制用户和权限
- 大量的GUI和IDE客户端
- 上手容易
同时,它也有一些劣势:
- 依赖对服务器的访问能力
- 所有的命令都要连接服务器
- 分支和合并工具难于使用
分布式
分布式下,每个用户都拥有整个代码库的完整拷贝,不只是文件,也包括提交历史。当前流行的分布式版本控制系统是GIT和Mercurial。
分布式系统的主要优点:
- 更强大和详细的变更追踪能力
- 可以不需要服务器,能够离线提交
- 分支和合并更文档
- 速度快
主要缺点:
- 分布式模型有点难于理解
- 新事物,GUI少一些
- 修订版本不是自增型数字,引用不便
- 不熟悉这个模型的时候容易犯错误
建议大家直接切换到GIT上。
注意:本文归作者所有,未经作者允许,不得转载