slide1 n.
Download
Skip this Video
Loading SlideShow in 5 Seconds..
版本控制简介 PowerPoint Presentation
Download Presentation
版本控制简介

Loading in 2 Seconds...

play fullscreen
1 / 92

版本控制简介 - PowerPoint PPT Presentation


  • 121 Views
  • Uploaded on

版本控制简介. Introduction to Version control Software 蒋琨. 提纲. 什么是版本控制 版本控制 —— 基本使用 SVN 介绍 版本控制 —— 高级问题 学习资源. 版本控制. 版本控制,英文叫 Revision control 或者 Source control. 适用于管理文档,计算机程序或者其他计算机文件修改的应用。 版本控制工具软件很常见 专用软件, CVS 、 SVN 、 GIT 、 Hg 包含 Revision control 功能的软件.

loader
I am the owner, or an agent authorized to act on behalf of the owner, of the copyrighted work described.
capcha
Download Presentation

PowerPoint Slideshow about '版本控制简介' - kylan-vance


An Image/Link below is provided (as is) to download presentation

Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.


- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -
Presentation Transcript
slide1

版本控制简介

Introduction to Version control Software

蒋琨

slide2
提纲
  • 什么是版本控制
  • 版本控制——基本使用
  • SVN介绍
  • 版本控制——高级问题
  • 学习资源
slide3
版本控制
  • 版本控制,英文叫Revision control或者Source control.
  • 适用于管理文档,计算机程序或者其他计算机文件修改的应用。
  • 版本控制工具软件很常见
    • 专用软件,CVS、SVN、GIT、Hg
    • 包含Revision control功能的软件
slide4

Software tools for revision control are essential for the organization of multi-developer project!

-- wikipedia

slide5
软件基本组成
  • 版本控制软件是C/S结构的
    • Repository 为服务端
    • Working Directory

为客户端

    • commit和update

为数据存取操作

    • Edit 为客户端本地

修改数据

repository

update

commit

Working Directory

A

Working Directory

B

Edit

slide6
功能小结
  • 帮助协作
    • 文件共享
    • 文件同步
  • 跟踪改变
    • 记录所有的修改历史
slide7
文件共享
  • 版本控制软件是client/Server结构

repository

commit

update

update

Working Directory

A

Working Directory

B

Working Directory

C

slide8
文件同步
  • 文件同步会协调多个client的修改内容

repository

修改文件A

commit

update

Working Directory

1

Working Directory

2

slide9
跟踪历史
  • 保存和查看历史
    • 保存某一时刻的文档内容
    • 查看某一时刻的文档内容
slide10
朴素的方法
  • 重命名文件备份

手动备份

手动备份

这时候文件夹内有多个版本的A文件

时刻2修改

时刻1修改

文件A1

文件A

文件A

文件A1

文件A2

文件A

slide11
朴素的方法
  • 手动备份
    • 如果存在大量的修改,手动备份的方式使得文件组织会比较混乱
    • 查看历史和恢复工作比较低效
    • 不容易看到两个版本之间的修改内容,而这一点往往很重要
slide12
优雅的方法
  • 让工具来做那些重复而且繁杂的保存修改历史的事情!

repository

版本1

版本2

版本3

A

A’

A’’

commit

  • Client提交后,版本控制软件不会将新提交的文件覆盖服务器上原有的相同的文件,而是让它们同时在服务端存在。
  • 服务端会同时保留同一文件的不同提交时期的内容。这样Client可以在未来查看文件的历史内容。

Edit文件A

Working Directory

slide13
优雅的方法
  • 版本控制软件
    • 不用人工备份历史,人工操作只要向仓库发送简单几个命令即可
    • 方便的浏览版本历史和版本信息
    • 比较版本之间不同之处非常方便
slide14
优雅的方法(浏览历史)
  • 存在大量文件时,版本控制会以目录为单位。所谓版本就是一个目录在用户某次提交的内容快照。
  • 版本控制软件使用线性的方式(svn)或者树形的方式(git)来管理版本。左图为git保存的android源码的版本信息。图中最左边的圆点为版本号,右边为版本的描述信息。
  • 通过版本号,可以访问某个时期某个目录下的文件内容。左图的例子中,可以访问最新源码android-2.3,也可以访问09年开发的的android-1.6版本。还可以使用比较工具看到两个版本的区别,了解每次做的具体修改。
  • 版本控制软件无疑比手工整理更加高效和可靠。
slide15
优雅的方法(检查修改)

红色部分为不同之处

slide16
小结
  • 版本控制软件非常简单实用!
    • 再也不要用U盘来拷代码了
    • 再也不怕代码改错了,错了马上可以恢复
    • 研究修改历史来学习优秀软件开发过程
    • 版本历史相当于日记本,知道自己每天做了什么
    • 观察团队工作进度

return

slide17
基本问题
  • 版本控制的基本问题
    • 基本开发过程
    • 分支(branch)
    • 文件并行访问的基本问题:一致性
      • 合并(Merge)
slide18
递增过程

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

slide19
基本开发过程
  • 多个working directory合作,使得仓库内容逐步增加。
  • 逐步增加的过程使得仓库内的版本组成一条线,被称为分支branch。
  • 工作目录必须获取分支的最新的版本,在此基础上才能提交给仓库更新版本。
slide20

repository

版本1

版本2

版本3

版本4

A

A’

A’’

A’’’

Check out version 2

Check out version 3

commit

获取到版本3

获取到版本2

Working Directory

slide21
递增开发过程
  • 仓库中的版本是递增添加的,不建议删除版本信息(比如在存在版本1,2,3,4的仓库中删除版本3和4)。部分软件根本不提供删除版本信息的方法,因为删除版本在多人协作方面存在一些问题。
  • 如果需要回到旧的版本继续开发,即回滚操作。不同的软件有不同的解决方案。这个问题稍后会说明。
slide22
递增开发过程
  • 依据前面的内容,似乎版本只能线性的递增,注意前面描述中提到了一个分支的概念
  • 如果仓库中存在多个分支,是可以达到非线性递增版本的效果的,而且分支在某些版本控制软件中很重要。
branch
分支(branch)
  • 线性递增版本,只有一个分支
  • 非线性版本,有多个分支

分支1

1

2

3

4

5

分支2

分支1

1

2

  • 3

4

slide24
分支
  • 分支在如下场合很有用
    • 多人以同一个项目为基础继续开发,而且使用的方法不一样。使用不同的分支会避免相互干扰。
    • 为了避免影响正常的开发流程,使用分支来做试验或者探索开发
    • 版本控制的分支合并功能使得分支变得非常有用
slide25
分支和复制

3

4

上图为使用分支的情况,下图为对版本1和版本2进行复制的项目内容,明显使用分支可以节省存储空间

1

2

5

6

1

2

3

4

1

2

5

6

slide26
分支合并

分支1

3

4

同时包含了版本4和6相对于版本2的修改

1

2

分支2

5

6

7

Merge 分支1和分支2

slide28
文件串行修改

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’’

slide29

文件并行修改

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’’

slide30
共享文件的问题
  • 多个client同时修改一个文件的冲突,互斥来保证一致性!
  • 互斥的粒度
    • Lock-modify-unlock:
      • 互斥的粒度是文件,适用于二进制文件。微软vss全部操作采用这种方式。其他的软件也有些提供lock机制处理非文本文件。
    • Copy-Modify-Merge:
      • 互斥的粒度是文件的一行内容,适用于文本文件,比如程序源文件。大多数软件如svn,cvs,git都采用此方式。
slide32

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
合并(Merging)
  • 两个或以上的人同时修改同一个文件,使用合并操作可以把所有人的修改都应用到文件中

A and B修改内容

Merge

File

B修改内容

A修改内容

Working Directory B

Working Directory A

merge
Merge 举例
  • file.cpp 被working directory A修改了第二行内容
  • file.cpp 被 working directory B修改了第三行内容
  • Merge A 和 B的修改的结果就是file.cpp第二行和第三行都被修改了。
merge conflict
Merge conflict
  • Merging 减少了互斥操作的粒度
  • 如果多人同时修改了互斥粒度内的同一内容,冲突便产生了。
merge conflict1
Merge Conflict
  • file.cpp 被working directory A修改了第二行内容
  • file.cpp 被 working directory B也修改了第二行内容
  • Merge 算法不知道结果文件file.cpp第二行到底用A的修改还是B的修改,所以它会报告冲突,提示人来做出选择。
merge conflict2
Merge conflict
  • 冲突的情况产生于团队协作不和谐的时候,所以情况会比较不容易出现
  • 各种软件都有对应的冲突解决的方法
  • 因为存在冲突,所以Merge操作在working directory进行,而不是repository进行。因为working directory可以解决冲突。
slide38
小结

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’’

slide39
SVN
  • SVN是subversion的简称,它是一种版本控制的标准,符合subversion规范的软件可以通用。
  • 各种操作系统平台都有SVN客户端软件,所以可以在不同平台上用SVN管理同一个工程。
tortoisesvn
TortoiseSVN的操作
  • TortoiseSVN是一种容易使用的Windows平台的SVN客户端。
  • 在Windows平台,需要安装Svn客户端,安装完成后,在资源管理器中点击鼠标右键,会发现两个与TortoiseSVN相关的条目。
slide41
SVN基本操作
  • SVN有命令行模式和GUI操作模式,GUI操作模式比较简单,只介绍GUI模式。命令行下的命令使用方法可以在svn帮助文档中找到。
slide42
svn的操作流程

Initilize repository

checkout

Edit; Add, delete, move,copy

Check for modifications

Update;

手动解决冲突

revert

submmit

slide44

Repo-browser 是浏览服务端的文件目录功能。

7室已经有一个svn服务器,选择Repo-browser后,在输入框中输入地址http://svn.ipp.ac.cn/svn/test输入临时的用户名plasma 和密码solaris就能方便的浏览服务端的工程了。

slide45

服务器目录也有权限管理。访问目录需要输入用户名和密码,不同的目录对不同的用户有不同的权限。为了测试提供了一个test账户。账户名:plasma密码:solaris服务器目录也有权限管理。访问目录需要输入用户名和密码,不同的目录对不同的用户有不同的权限。为了测试提供了一个test账户。账户名:plasma密码:solaris

  • http://svn.ipp.ac.cn/svn是服务器的root目录。目录下有两个子目录,test和works。Test账户拥有test目录的读写权限,Test账户只有works目录的读权限,不能写入。
2 checkout
2 Checkout
  • 通过浏览器,点击要下载的工程,右键选择Checkout,选择版本,默认是head,head表示服务器上最新版本,确认后,服务器上最新版本的代码就拷贝到了本地文件夹内了。这个文件夹拷贝(working copy)自动与服务器仓库对应起来了。可以修改内部文件内容,然后再通过命令更新到服务器中。
slide47
3 基本操作
  • 建立了本地文件拷贝目录后,进入目录,再点击右键会多很多基本操作。
3 1 update
3.1 更新本地拷贝目录update
  • 当我们从服务器获取了一个工程拷贝后,考虑到别人会更新服务器的内容,所以要通过更新操作来将服务器最新内容同步到本地工作文件夹中。在本地工作文件夹中点击鼠标右键,选择update选项就可以完成更新。
slide50
3.2 修改本地拷贝目录
  • 在向当仓库提交添加新文件和目录的之前。需要先在本地拷贝目录添加,通过鼠标右键的多选菜单选择add命令,通过界面选择要添加的文件和目录。
  • 如果要向仓库提交删除文件和目录,需要先在本地拷贝目录删除文件,选中需要删除的文件,右键选择delete命令
slide51
3.3 检查本地目录修改情况
  • 修改了本地目录后,用status命令可以显示本地工作间修改的情况。选择目录,右键弹出菜单中选择check for modifications
slide52
3.4 放弃修改
  • 如果在本地目录修改不满意,在本地拷贝目录下点击鼠标右键,选择revert命令,本地拷贝目录的文件将会放弃任何修改,直接恢复为本地拷贝目录当前版本对应的内容。
slide53
3.5 解决冲突
  • 在提交的时候,服务器可能会报告提交冲突,冲突不容易出现,但是最难的一个概念,如果遇到了,必须要解决冲突。
  • 有两种类型的冲突,内容冲突和目录冲突。处理的方法不一样。
conflict content conflict
Conflict: Content conflict
  • Merge模式不可避免的问题
  • SubVersion文本文件的互斥粒度是文件的行,
conflict content conflict1
Conflict: Content conflict
  • 前面说的只是说明一个概念,不是很严谨。实际的Merge程序并不是单单根据行号来判断是否冲突的,它还会根据文件内容,做出更加有效的冲突分析。
conflict tree conflict
Conflict: Tree Conflict
  • 如果一个人呢在仓库中删除了一个文件或者对文件进行重命名,但另外一个人依然想对这个文件进行修改并更新到仓库去。你想对这个文件进行修改,但是仓库中这个文件已经不在了或者位置已经改变,这种情况,会出现Tree conflict的情况。
conflict tree conflict1
Conflict: Tree conflict
  • 和Content Conflict一样,造成Tree conflict的原因也是由于多人协作不和谐引入的。团队中有一个人修改了文件名,其它成员却还在更新这个文件,Subversion还是把解决冲突的事情交给人来做,让人来解决人的冲突。它只是在有冲突的时候做出提示。在稍后将会介绍SubVersion如何解决Tree Conflict。
slide58
冲突解决
  • 如果存在冲突,进行commit操作是不能够成功的。在commit之前,都需要进行一次update操作。因为update操作会报告冲突。
  • 执行了update操作后,如果存在了冲突,会提示冲突发生
resolve
resolve
  • 解决冲突要使用resolve命令
  • Resolve命令会得到所有有冲突的文件列表
slide60
编辑冲突内容
  • 从冲突文件列表选择文件,右键鼠标弹出菜单中选择” Edit Conflict “ 命令
slide61
完成冲突编辑
  • 使用工具编辑冲突内容直到没有冲突为止
  • 保存文件
  • 再执行一次commit操作就可以提交了
slide62
3.6 提交修改
  • 修改成功后,右键选择commit 命令,写好commit的原因和记录更新的内容,以便以后查看方便。
  • 提交修改后,服务器会在仓库中生成一个新的版本号,同时本地拷贝目录的版本号也相应的更新为最新的版本号。
  • 选择目录或者文件后,鼠标右键选择log命令,可以看到选择的文件和目录的版本修改记录。
slide63
应用场景

新建工程

正常递增开发

回滚版本

slide64
应用场景: 新建工程
  • 项目最开始,要在参考中创建一个新的工程。使用repo browser浏览服务器目录,就像用资源管理器浏览本地目录一样方便。
slide65
目录约定
  • 为了支持branch和tag操作,需要约定新工程的目录,这也是SVN的贯用法
  • 主目录需要三个子目录
    • trunk:存放主要代码
    • branch: 存放分支的代码
    • tag: 存放标签
slide66
新建工程
  • 将新建的文件夹checkout到本地目录,然后在本地目录add file  commit,就相当于往服务器添加了新文件了。
slide67
应用场景: 正常递增开发
  • 在正常情况下,新的内容不断的加入仓库中,版本号从0开始随着开发时间的推移而递增。要注意一点,高版本只能基于比它第一个版本号的版本得到。就是说版本5只能从版本4的修改提交得到,这个结论在回滚版本的时候很重要。
slide68
应用场景:回滚版本(1)
  • 考虑这样的情况,目前项目已经开发到了版本5,但是却发现版本5完全是个错误的选择,不能再在版本5的基础上继续了。必须考虑到回到之前的版本,比如说版本3,然后在版本3的基础上重新开发。我们要进行回滚操作。

4

5

1

2

3

slide69
应用场景:回滚版本(2)
  • 简单使用的update to version回到版本3并不能解决问题,因为还是没有办法继续往服务器提交,从版本3不能直接提交生成到版本6的。
  • 唯一的方法就是在版本5上修改,修改得到版本3的内容。再提交修改得到版本6,其实版本6和版本3内容是一样的,版本号不同而已,但是从版本6我们可以继续开发。
slide70
应用场景:回滚版本(3)
  • Svn没有直接的回滚操作,大部分版本控制工具都不提倡回滚操作。可以使用Merge来回滚操作。

回滚Merge到版本3

4

5

6

1

2

3

版本6内容和版本3一致

slide72

在From版本选择 Head Revision, To的版本中选择要恢复到的版本号,继续操作

确定,就可以把本地拷贝的内容变成恢复版本号的内容了,再提交即可。

slide73
小结

return

slide74
高级话题
  • 操作状态机
    • 版本控制器的版本是如何组织的
    • 合并算法
    • 手动解决冲突
slide75
基本状态
  • 版本控制涉及的三个对象

repository

本地修改会造成其工作目录当前目录内容和仓库内容不一致,本地目录为local changed状态

edit

Local Working Directory

remote

Working Directory

Local changed

Current

slide76

commit

repository

  • 远端commit会造成本地内容与仓库内容不一致,本地目录为out of date & Unchanged状态。

Local Working Directory

remote

Working Directory

edit

Unchanged

Out of date

slide77

commit

repository

  • 本地进行修改,而且远端进行commit,本地目录为out of date & local changed 状态

edit

Local Working Directory

remote

Working Directory

Local changed

Out of date

slide78

New version

状态机

Local changed

Current

Local edit

commit

Unchanged

Current

Remote Commit

Unchanged

Current

update

Local changed

Out of date

Local edit

update

Remote commit

Unchanged

Out of date

slide79
版本组织
  • 树形(Tree)组织和图有向无环图(DAG)
    • SVN 采用tree
    • Git采用DAG
  • 版本如何组织对branch 和merge的操作效率来说很重要。除非是要深入理解版本控制软件工作流程的人,一般的使用者可以不关心。
slide80
合并算法
  • 2-way Merging algorithm
  • 比较要合并的文件内容,用一种近似猜的策略确定出两边的修改内容。

File version1

File version 2

Compare

File version 3

slide81
合并算法

File version 0

  • 3-way Merging algorithm
  • 如果两个输入文件为同一个版本修改而成,将它们相对源文件的修改合并得到结果文件

Compare

Compare

File version1

File version 2

合并各自的修改

File version 3

slide82
合并算法
  • 使用3-way Merging algorithm的版本控制软件拥有强大的代码合并能力。这是多人协作的基础。
  • 少数时候,合并操作会导致冲突。
content conflicts
手动解决Content conflicts冲突
  • Sally获取了a.txt的r1版本号的文件,她在本地修改了,但是Hally在Sally提交之前提交了a.txt的版本,此时服务器上a.txt的版本为r2了。如果Sally提交a.txt出现了冲突,Sally执行update操作后,注意目录下多了3个文件,
  • a.txt.mine从r1版本修改的需要提交的文件
  • a.txt.r1 r1版本的a.txt
  • a.txt.r2 r2版本的a.txt
  • a.txt 冲突文件
slide84
操作四个文件
  • 在解决冲突的时候,hally和Sally要协商,是决定要某人的修改,放弃另外一个人的修改,还是是手动的合并两个人的修改内容。
  • 如果已经决定了要hally修改后的版本,删除其它三个文件,保留a.txt.mine,并将a.txt.mine改名为a.txt.
  • 如果决定要r1或者r2版本,同样删除其它三个文件,把留下的文件改名为a.txt.
  • 如果决定合并两个人的修改内容,那么直接保留a.txt,同时删除其余三个文件。但是要修改a.txt的内容。
slide85
手动合并
  • A.txt文件内容冲突的内容会是类似如下的形式:
  • <<<<<< .mine
  • Contents modified by sally
  • ==============
  • Contents modified by Hally
  • >>>>>> .r2
slide86
手动合并
  • 说明:

Contents modified by sally是Sally修改的文件内容,Contents modified by Hally是hally修改的文件内容,<<<<< ===== >>>>>是分割线

  • 手动操作要保留需要保留的文件内容,把决定不要的文件内容和分割线去掉。
slide87
完成冲突解决
  • 将四个文件处理得只剩下一个文件的时候,

就完成了Conflict的解决,表示可以进行提交操作了。

tree conflicts
Tree Conflicts 手动冲突解决
  • 解决Tree Conflicts也需要先执行update命令。考虑到文件重命名相当于先删除再新建一个文件,所以考虑文件重命名的情况。考虑这样的情况,Sally获取了版本r1的文件a.txt,修改之后,在提交之前,Hally操作把a.txt改名为b.txt了,Sally提交的时候就会出现Tree Conflict了。
slide89

这是后执行update命令有如下效果:

1 Subversion会检查Sally的a.txt文件内容

2 如果Sally没有修改a.txt内容,那Sally目录下的a.txt就被删除。如果Sally修改了,那么Sally的a.txt会被保留在文件系统中,但是不在本地拷贝目录中保留。A.txt变成了一个自由的文件,不被服务器跟踪了。

3 Sally的本地拷贝目录会新建b.txt。Sally文件系统中同时有a.txt和b.txt

slide90
学习资源
  • 本演示稿内容主要来自subversion帮助文档《Version control with subversion》,书中有更加系统和详细的介绍,书籍和相关软件可以在所ftp服务器上获取。
  • 地址是 \\202.127.207.17\incoming\06-软件上传区\04-软件与程序设计\版本控制
slide91

还有一些git的经典教程也可以在ftp获取

    • git-internal.pdf (这个官方下载需要9美元)
    • git-magic.pdf
    • Git Community Book.pdf
slide92
谢谢!

return