SVN全名Subversion,即版本控制系统。
版本模型
所有的版本控制系统都需要解决一个基础问题:怎样让系统允许用户共享信息,而不会让他们因意外而互相干扰?版本库里意外覆盖别人的更改非常的容易。
- 拷贝-修改-合并方案
每一个客户联系项目版本库建立一个个人工作拷贝―版本库中文件和目录的本地映射。用户并行工作,修改各自的工作拷贝,最终,各个私有的拷贝合并在一起,成为最终的版本,这种系统通常可以辅助合并操作,但是最终要靠人工去确定正误。
新建了一个Subversion版本库,从修订版本号0开始,每一次成功的提交加1,当你提交成功,Subversion告诉客户端这个新版本号:
linux 日常使用
-
svn checkout
svn checkout svn://xxxx --username xxx --password xxx
上面的操作会svn会询问是否将验证信息缓存在磁盘上面,用脚本拉取代码时不合适
svn checkout svn://xxxx --username xxx --password xxx --no-auto-cache
- 检出某个版本的代码
检出20版本的代码。svn checkout -r 20 svn://xxxx
- 检出某个版本的代码
-
svn export
检出的项目仍然被SVN进行管理,有.svn隐藏的文件夹,和版本库仍然关联,导出的项目相当于一些普普通通的文件,不再和版本库、SVN有任何关系。svn export -r 版本号 svn://xxxx 本地目录 --username xxx --password xxx
-
svn update
svn update . # 将当前目录更新到最新版本
-
U foo
文件foo更新。 -
A foo
文件或目录foo被添加到版本库中。 -
D foo
文件或目录foo在版本库被删除了。 -
R foo
foo被删除,而一个新的同样名字的项目添加进来,它们具有同样的名字,但是版本库会把它们看作具备不同历史的不同对象。 -
G foo
文件foo接收到版本库的更改,你的本地版本也已经修改,但改变没有互相影响,svn成功的将版本库和本地文件合并,没有发生任何问题。 -
C foo
文件foo的修改与服务器冲突,服务器的修改与你的修改交迭在一起。
-
-
svn add foo
将文件、目录或者符号链foo添加到版本库,当你下次 提交后,foo会成为其父目录的一个子对象。注意,如果foo是目录,所有foo中的内容也会预定添加进去,如果你只想添加foo本身,使用--non-recursive(-N)参数。
-
svn delete foo
将文件、目录或者符号链foo从版本库中删除掉,如果foo是文件,它马上从工作拷贝中删除,如果是目录,不会被删除,但是Subversion准备好删除了,当你提交你的修改,foo就会在你的工作拷贝和版本库中被删除。 -
svn move
svn status
svn diff
-
svn commit
svn commit -m "upload test.log"
-
svn revert
- 修改过的东西没有提交
svn revert [-R] file or dir
如果回滚的是一个目录,
-R
选项表示递归。- 修改过的东西已经提交
这种情况下,需要用svn merge
命令来进行回滚。
第一步,先将自己修改备份一下。
第二步,执行svn update
保证工作区文件是最新的。
第三步,利用svn log
找出要回滚的确切版本号,比如版本号是10。
第四步,利用svn merge
回滚到具体版本
第四步,提交回滚svn merge -r 20:10 file or dir
svn commit -m "..."
- 修改过的东西没有提交
-
重命名
-
查看版本日志
- 查看某一文件的版本变化
svn log test.log # 查看这个文件的所有修改记录,及其版本号的变化。
- 查看一段日期的日志
svn log -r {2018-07-03}:{2018-07-09}
- 查看某一版本所修改的文件列表及说明
svn log -r r196674 -v
- 查看某一文件的版本变化
冲突
如果两个程序员同时修改了同一个文件,SVN可以合并这两个程序员的改动。
实际上SVN管理源代码是以行为单位的,就是说两个程序员只要不是修改了同一行程序,SVN都会自动合并两种修改。如果是同一行,SVN会提示文件Confict冲突,需要手动确认。
分支
SVN 新建资源仓库时,可选择默认创建3个文件夹,这3个文件夹分别是:trunk,branches,tags。
- trunk
一般用于存放目前项目主线,也就是项目所有功能模块的集合体,一整个项目所有代码库。一般来说,存放在trunk中的代码都是稳定可正常运行的。 - branches
分支,其实也就是主线的拷贝,主要应用于在项目需要有新的开发时,不针对主线进行,而是在主线的基础上,拷贝一份或者多份。针对每个模块小组,均可根据自己的开发情况,创建自己的分支进行开发,最后将分支一起合并到trunk上来,从而最后合并为一个项目。 - tags
标记是主线中一个特定版本的定型版。比如一个系统1.0开发完成,就会将主线的代码打一个tag,标记1.0开发完成。所以Tags中的代码只读的,也就是tags中的版本是不允许再动了。
trunk负责保存当前稳定版本。
branches 负责保持你分支版本,进行新需求开发。
tags则保存最终发布上线版本,所以不可再修改。
各司其职,各尽其责,使得开发过程中版本控制有条不紊。
开发工作流
日常开发过程其实就是这样的,(假设你已经Checkout并且已经工作了几天):Update(获得最新的代码) -->作出自己的修改并调试成功 --> Commit(大家就可以看到你的修改了)
windows 日常使用
-
检出代码
右键菜单中点击 SVN Checkout。 -
更新到最新版本
更新本地代码与SVN服务器上最新的版本一致,只要在需要更新的文件夹上点击右键或者在文件下空白处点击右键,选择”SVN Update” (获取指定版本中的内容,点击右键执行SVN菜单中的“Update to reversion“),就可以了。 -
提交
- 加入版本库
右键SVN菜单执行“Add“操作提交到”变更列表中 - 提交更新
右键SVN菜单执行”SVN Commit”提交到版本库中
- 加入版本库
-
回退至某个版本
右击想要回退的文件或者文件夹,在TortoiseSVN弹出菜单中选择"Update to reversion…"。 -
删除
方法1:选择被删除文件,右键svn菜单执行”delete”操作,然后选择被删除文件的父目录,右键svn菜单执行”SVN Commit”。方法2:使用操作系统的删除操作删除该文件,然后选择被删除文件的父目录,右键svn菜单执行”SVN Commit”,在变更列表中选择被删除的文件
-
重命名
选中需要重命名的文件或文件夹,然后右键“TortoiseSVN->Rename“,在弹出的对话框中输入新名称,点击”ok”按钮,并将修改文件名后的文件或文件夹通过 “SVN Commit”提交到SVN服务器上。
参考资料
网友评论