990 likes | 1.36k Views
版本控制简介. Introduction to Version control Software 蒋琨. 提纲. 什么是版本控制 版本控制 —— 基本使用 SVN 介绍 版本控制 —— 高级问题 学习资源. 版本控制. 版本控制,英文叫 Revision control 或者 Source control. 适用于管理文档,计算机程序或者其他计算机文件修改的应用。 版本控制工具软件很常见 专用软件, CVS 、 SVN 、 GIT 、 Hg 包含 Revision control 功能的软件.
E N D
版本控制简介 Introduction to Version control Software 蒋琨
提纲 • 什么是版本控制 • 版本控制——基本使用 • SVN介绍 • 版本控制——高级问题 • 学习资源
版本控制 • 版本控制,英文叫Revision control或者Source control. • 适用于管理文档,计算机程序或者其他计算机文件修改的应用。 • 版本控制工具软件很常见 • 专用软件,CVS、SVN、GIT、Hg • 包含Revision control功能的软件
Software tools for revision control are essential for the organization of multi-developer project! -- wikipedia
软件基本组成 • 版本控制软件是C/S结构的 • Repository 为服务端 • Working Directory 为客户端 • commit和update 为数据存取操作 • Edit 为客户端本地 修改数据 repository update commit Working Directory A Working Directory B Edit
功能小结 • 帮助协作 • 文件共享 • 文件同步 • 跟踪改变 • 记录所有的修改历史
文件共享 • 版本控制软件是client/Server结构 repository commit update update Working Directory A Working Directory B Working Directory C
文件同步 • 文件同步会协调多个client的修改内容 repository 修改文件A commit update Working Directory 1 Working Directory 2
跟踪历史 • 保存和查看历史 • 保存某一时刻的文档内容 • 查看某一时刻的文档内容
朴素的方法 • 重命名文件备份 手动备份 手动备份 这时候文件夹内有多个版本的A文件 时刻2修改 时刻1修改 文件A1 文件A 文件A 文件A1 文件A2 文件A
朴素的方法 • 手动备份 • 如果存在大量的修改,手动备份的方式使得文件组织会比较混乱 • 查看历史和恢复工作比较低效 • 不容易看到两个版本之间的修改内容,而这一点往往很重要
优雅的方法 • 让工具来做那些重复而且繁杂的保存修改历史的事情! repository 版本1 版本2 版本3 A A’ A’’ commit • Client提交后,版本控制软件不会将新提交的文件覆盖服务器上原有的相同的文件,而是让它们同时在服务端存在。 • 服务端会同时保留同一文件的不同提交时期的内容。这样Client可以在未来查看文件的历史内容。 Edit文件A Working Directory
优雅的方法 • 版本控制软件 • 不用人工备份历史,人工操作只要向仓库发送简单几个命令即可 • 方便的浏览版本历史和版本信息 • 比较版本之间不同之处非常方便
优雅的方法(浏览历史) • 存在大量文件时,版本控制会以目录为单位。所谓版本就是一个目录在用户某次提交的内容快照。 • 版本控制软件使用线性的方式(svn)或者树形的方式(git)来管理版本。左图为git保存的android源码的版本信息。图中最左边的圆点为版本号,右边为版本的描述信息。 • 通过版本号,可以访问某个时期某个目录下的文件内容。左图的例子中,可以访问最新源码android-2.3,也可以访问09年开发的的android-1.6版本。还可以使用比较工具看到两个版本的区别,了解每次做的具体修改。 • 版本控制软件无疑比手工整理更加高效和可靠。
优雅的方法(检查修改) 红色部分为不同之处
小结 • 版本控制软件非常简单实用! • 再也不要用U盘来拷代码了 • 再也不怕代码改错了,错了马上可以恢复 • 研究修改历史来学习优秀软件开发过程 • 版本历史相当于日记本,知道自己每天做了什么 • 观察团队工作进度 return
基本问题 • 版本控制的基本问题 • 基本开发过程 • 分支(branch) • 文件并行访问的基本问题:一致性 • 合并(Merge)
递增过程 repository 版本1 版本2 版本3 commit A A’ A’’ 分支(branch) commit commit update update 获取版本2的内容 获取版本1的内容 Working Directory 1 Working Directory 2 Working Directory 3 Edit A Edit A Edit A
基本开发过程 • 多个working directory合作,使得仓库内容逐步增加。 • 逐步增加的过程使得仓库内的版本组成一条线,被称为分支branch。 • 工作目录必须获取分支的最新的版本,在此基础上才能提交给仓库更新版本。
repository 版本1 版本2 版本3 版本4 A A’ A’’ A’’’ Check out version 2 Check out version 3 commit 获取到版本3 获取到版本2 Working Directory
递增开发过程 • 仓库中的版本是递增添加的,不建议删除版本信息(比如在存在版本1,2,3,4的仓库中删除版本3和4)。部分软件根本不提供删除版本信息的方法,因为删除版本在多人协作方面存在一些问题。 • 如果需要回到旧的版本继续开发,即回滚操作。不同的软件有不同的解决方案。这个问题稍后会说明。
递增开发过程 • 依据前面的内容,似乎版本只能线性的递增,注意前面描述中提到了一个分支的概念 • 如果仓库中存在多个分支,是可以达到非线性递增版本的效果的,而且分支在某些版本控制软件中很重要。
分支(branch) • 线性递增版本,只有一个分支 • 非线性版本,有多个分支 分支1 1 2 3 4 5 分支2 分支1 1 2 • 3 4
分支 • 分支在如下场合很有用 • 多人以同一个项目为基础继续开发,而且使用的方法不一样。使用不同的分支会避免相互干扰。 • 为了避免影响正常的开发流程,使用分支来做试验或者探索开发 • 版本控制的分支合并功能使得分支变得非常有用
分支和复制 3 4 上图为使用分支的情况,下图为对版本1和版本2进行复制的项目内容,明显使用分支可以节省存储空间 1 2 5 6 1 2 3 4 1 2 5 6
分支合并 分支1 3 4 同时包含了版本4和6相对于版本2的修改 1 2 分支2 5 6 7 Merge 分支1和分支2
文件串行修改 Repository A 版本2 版本3 版本1 A’ A A’’ commit update Working directory A和B所做的修改都在 A’’中,很和谐的情况! update commit Edit Working Directory A Working Directory B Edit A’ A’’
文件并行修改 Repository A A 版本1 版本2 版本3 A A’ A’’ 文件A’’只有客户B的修改,而不包含A的修改,很不和谐!不符合递增开发。 commit update update commit Edit Working Directory A Working Directory B Edit 要把客户A的修改也添加到A’’中提交,这样才和谐! A’ A’’
共享文件的问题 • 多个client同时修改一个文件的冲突,互斥来保证一致性! • 互斥的粒度 • Lock-modify-unlock: • 互斥的粒度是文件,适用于二进制文件。微软vss全部操作采用这种方式。其他的软件也有些提供lock机制处理非文本文件。 • Copy-Modify-Merge: • 互斥的粒度是文件的一行内容,适用于文本文件,比如程序源文件。大多数软件如svn,cvs,git都采用此方式。
Copy-modify-merge Repository A A 版本1 版本2 版本3 A A’ A’’’ commit update update commit Merge A’ and A’’ Edit Working Directory A Working Directory B Edit A’’’ A’ A’’
合并(Merging) • 两个或以上的人同时修改同一个文件,使用合并操作可以把所有人的修改都应用到文件中 A and B修改内容 Merge File B修改内容 A修改内容 Working Directory B Working Directory A
Merge 举例 • file.cpp 被working directory A修改了第二行内容 • file.cpp 被 working directory B修改了第三行内容 • Merge A 和 B的修改的结果就是file.cpp第二行和第三行都被修改了。
Merge conflict • Merging 减少了互斥操作的粒度 • 如果多人同时修改了互斥粒度内的同一内容,冲突便产生了。
Merge Conflict • file.cpp 被working directory A修改了第二行内容 • file.cpp 被 working directory B也修改了第二行内容 • Merge 算法不知道结果文件file.cpp第二行到底用A的修改还是B的修改,所以它会报告冲突,提示人来做出选择。
Merge conflict • 冲突的情况产生于团队协作不和谐的时候,所以情况会比较不容易出现 • 各种软件都有对应的冲突解决的方法 • 因为存在冲突,所以Merge操作在working directory进行,而不是repository进行。因为working directory可以解决冲突。
小结 Repository • 解决Merge操作的冲突是难点! A A 版本3 版本1 版本2 A’’’ A A’ commit update update commit Merge A’ and A’’ Edit Working Directory A Working Directory B Edit A’’’ A’ return A’’
SVN • SVN是subversion的简称,它是一种版本控制的标准,符合subversion规范的软件可以通用。 • 各种操作系统平台都有SVN客户端软件,所以可以在不同平台上用SVN管理同一个工程。
TortoiseSVN的操作 • TortoiseSVN是一种容易使用的Windows平台的SVN客户端。 • 在Windows平台,需要安装Svn客户端,安装完成后,在资源管理器中点击鼠标右键,会发现两个与TortoiseSVN相关的条目。
SVN基本操作 • SVN有命令行模式和GUI操作模式,GUI操作模式比较简单,只介绍GUI模式。命令行下的命令使用方法可以在svn帮助文档中找到。
svn的操作流程 Initilize repository checkout Edit; Add, delete, move,copy Check for modifications Update; 手动解决冲突 revert submmit
Repo-browser 是浏览服务端的文件目录功能。 7室已经有一个svn服务器,选择Repo-browser后,在输入框中输入地址http://svn.ipp.ac.cn/svn/test输入临时的用户名plasma 和密码solaris就能方便的浏览服务端的工程了。
服务器目录也有权限管理。访问目录需要输入用户名和密码,不同的目录对不同的用户有不同的权限。为了测试提供了一个test账户。账户名:plasma密码:solaris服务器目录也有权限管理。访问目录需要输入用户名和密码,不同的目录对不同的用户有不同的权限。为了测试提供了一个test账户。账户名:plasma密码:solaris • http://svn.ipp.ac.cn/svn是服务器的root目录。目录下有两个子目录,test和works。Test账户拥有test目录的读写权限,Test账户只有works目录的读权限,不能写入。
2 Checkout • 通过浏览器,点击要下载的工程,右键选择Checkout,选择版本,默认是head,head表示服务器上最新版本,确认后,服务器上最新版本的代码就拷贝到了本地文件夹内了。这个文件夹拷贝(working copy)自动与服务器仓库对应起来了。可以修改内部文件内容,然后再通过命令更新到服务器中。
3 基本操作 • 建立了本地文件拷贝目录后,进入目录,再点击右键会多很多基本操作。
3.1 更新本地拷贝目录update • 当我们从服务器获取了一个工程拷贝后,考虑到别人会更新服务器的内容,所以要通过更新操作来将服务器最新内容同步到本地工作文件夹中。在本地工作文件夹中点击鼠标右键,选择update选项就可以完成更新。
3.2 修改本地拷贝目录 • 在向当仓库提交添加新文件和目录的之前。需要先在本地拷贝目录添加,通过鼠标右键的多选菜单选择add命令,通过界面选择要添加的文件和目录。 • 如果要向仓库提交删除文件和目录,需要先在本地拷贝目录删除文件,选中需要删除的文件,右键选择delete命令