990 likes | 1.4k Vues
版本控制简介. 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命令