SVN 简要介绍

Subversion(SVN) 是一个开源的版本控制系統, 也就是说 Subversion 管理着随时间改变的数据。 这些数据放置在一个中央资料档案库(repository) 中。SVN管理源代码是以“行”为单位的,如果两个程序员修改的不是同一行程序,SVN会自动合并两种修改。如果是同一行,SVN 会提示文件 Conflict, 冲突,需要手动确认。

SVN 基本概念

  • repository(源代码库):源代码统一存放的地方。
  • Checkout(提取):没有源代码时,就需要从repository checkout一份源码。
  • Commit(提交):你对代码进行了修改后,就需要Commit到repository进行保存。
  • Update (更新):当你Checkout了一份源代码, Update一下你就可以和Repository上的源代码同步,代码就会有最新的变更。

SVN的优势

 相对于CVS,SVN有很多改进,使用更方便,优于CVS之处如下:

  1. 原子提交。不管是单个还是多个文件,一次提交都是作为一个整体提交的。在这当中发生的意外例如传输中断,不会引起数据库的不完整和数据损坏。
  2. 重命名、复制、删除文件等动作都保存在版本历史记录中。
  3. 对于二进制文件,使用了节省空间的保存方法,就是只保存和上一版本不同之处。
  4. 目录也有版本历史。整个目录树可以被移动或者复制,操作很简单,而且能够保留全部版本记录。
  5. 分支的开销非常小。
  6. 优化过的数据库访问,使得一些操作不必访问数据库就可以做到,减少了很多不必要的和数据库主机之间的网络流量。 

SVN 生命周期

 创建版本库

版本库相当于一个集中的空间,用于存放开发者所有的工作成果。版本库不仅能存放文件,还包括了每次修改的历史,即每个文件的变动历史记录。Create 操作是用来创建一个新的版本库,大多数情况下这个操作只会执行一次。当你创建一个新的版本库时,你的版本控制系统会让你提供一些信息来标识版本库,例如创建的位置和版本库的命名。

检出

Checkout 操作是用来从版本库创建一个工作副本。工作副本是开发者私人的工作空间,可以进行内容的修改,然后提交到版本库中。

更新

update 操作用来更新版本库。将工作副本与版本库进行同步,由于版本库是由整个团队共用的,当其他人提交了他们的改动之后,你的工作副本就会过期。

例如,现在有两个程序员 明明 和 涛涛,是一个项目的两个开发者,他们同时从版本库中检出了最新的版本并开始工作。此时,工作副本是与版本库完全同步的。然后,Jerry 很高效的完成了他的工作并提交了更改到版本库中。这时明明 的工作副本就过期了,更新操作将会从版本库中拉取 Jerry 的最新改动并将明明的工作副本进行更新。

执行变更

当检出之后,就可以做很多操作来执行变更。可以编辑已存在的文件,例如进行文件的添加/删除操作,可以添加文件/目录。但是这些添加的文件目录不会立刻成为版本库的一部分,而是被添加进待变更列表中,直到执行了 commit 操作后才会成为版本库的一部分。也可以删除文件/目录,删除操作立刻将文件从工作副本中删掉,但该文件的实际删除只是被添加到了待变更列表中,直到执行了 commit 操作后才会真正删除。Rename 操作可以更改文件/目录的名字,"移动"操作用来将文件/目录从一处移动到版本库中的另一处。

检出工作副本或者更新工作副本后,你的工作副本就跟版本库完全同步了。但是对工作副本进行一些修改之后,你的工作副本会比版本库要新,在 commit 操作之前复查下你的修改是一个很好的习惯。

Status 操作列出了工作副本中所进行的变动。正如我们之前提到的,你对工作副本的任何改动都会成为待变更列表的一部分,Status 操作就是用来查看这个待变更列表。Status 操作只是提供了一个变动列表,但并不提供变动的详细信息,可以用 diff 操作来查看这些变动的详细信息。

修复错误 冲突

如果对工作副本已经做了许多修改,但又不需要这些修改了,这时 使用Revert 操作重置对工作副本的修改。它可以重置一个或多个文件/目录,也可以重置整个工作副本。在这种情况下,revert 操作将会销毁待变更列表并将工作副本恢复到原始状态。

合并时可能会发生冲突。Merge 操作会自动处理可以安全合并的东西,其它的会被当做冲突。例如:"hello.c" 文件在一个分支上被修改,在另一个分支上被删除了。这种情况就需要人为处理,Resolve 操作就是用来帮助用户找出冲突并告诉版本库如何处理这些冲突。

提交更改

Commit 操作用来将更改从工作副本提交到版本库,会修改版本库的内容,其它开发者可以通过更新他们的工作副本来查看这些修改。在提交之前,你必须将文件/目录添加到待变更列表中,列表中记录了将会被提交的改动。在提交时,通过注释来说明为什么会进行这些改动,该注释也会成为版本库历史记录的一部分。Commit 是一个原子操作,也就是说要么完全提交成功,要么失败回滚,不会出现成功提交一半的情况。