【SVN】
【SVN】
一、SVN安装与介绍
1.1 项目协同开发
我们在公司中,由于项目的庞大,通常都是由多人协作进行开发,每个人负责部分业务代码的开发,一起推进项目的进度。多人协作开发会存在很多的问题,例如代码共享、代码合并、历史回退、权限控制、日志记录等问题。
- 代码共享:建立一个专门的服务器管理代码;
- 代码合并:复制粘贴,肉眼观察,极易出错;
- 历史回退:在修改代码之前,都做好每次修改前的备份(复制粘贴)
- 权限控制:人为控制,非常麻烦;
- 日志记录:人为控制,非常麻烦;
为了解决上述问题,我们急需一款软件能够帮助我们进行项目的协同开发;
1.1.1 什么是版本控制
- 版本控制系统(Version Control System):
你可以把一个版本控制系统(缩写VCS)理解为一个“数据库”,它可以帮你完整地保存一个项目的快照。当你需要查看一个之前的快照(称之为“版本”)时,版本控制系统可以显示出当前版本与上一个版本之间的所有改动的细节。

Tips:版本控制系统会记录所有对项目文件的更改。这就是版本控制;
1.1.2 版本控制的好处
试想一下,如果没有版本控制系统,当你需要处理那些共享文件夹中的文件时,你必须告知办公室里的所有人,你正在对哪些文件进行编辑;与此同时,其他人必须要避免与操作相同的文件。这是一个不现实和完全错误的流程。当你花了很长时间完成你的编辑后,可能这些文件早已经被团队里的其他开发成员修改或者删除了。
如果使用了版本控制系统,每一个团队成员都可以在任何时间对任何文件毫无顾虑的进行修改,版本控制系统可以把之后所有的改动合并成一个共同的版本,不论是一个文件还是整个项目。这个共同的中心平台就是我们的版本控制系统。
1.2 SVN简介
Subversion简称SVN,是apache旗下的一款版本控制工具;它将文件存放在中心版本库里, 这个版本库很像一个普通的文件服务器, 不同的是, 它可以记录每一次文件和目录的修改情况, 这样就可以借此将数据恢复到以前的版本, 并可以查看数据的更改细节。另外SVN还提供版本冲突解决、权限控制、集中式的代码管理、日志记录等功能;

Subversion官方网站:https://subversion.apache.org/
1.3 SVN的安装
SVN也是一个C/S架构的软件,我们首先需要安装SVN服务端;
1)双击SVN服务端安装程序:

2)接受协议:

3)添加环境变量:

4)选择标准安装:

5)选择SVN安装路径、仓库路径以及端口

6)开始安装:

7)安装成功

8)SVN服务端窗口:

1.4 SVN操作介绍
1.4.1 SVN的操作流程

checkout:从远程仓库(SVN)中拉取代码,初始化本地项目;此时本地项目和svn中的一模一样(最新版本的代码)。update:从服务器获取最新的代码(最新的版本),我们每天来到公司的第一件事就是更新到最新代码,提交代码前也要先更新一下代码,防止使用旧版本提交;commit:将代码提交到服务器,此时服务器的最新代码以我们电脑当前的代码为准,每次提交后,版本号都会累加;
1.4.2 代码提交产生的问题
多人在协同开发时,可能会出现如下问题:
1) 旧版本冲突
用户在提交代码时,必须要使用最新的版本进行提交,不能使用旧版本提交代码;

- ①小灰更新代码到最新版本(10)
- ②小蓝更新代码到最新版本(10)
- ③小灰新增一行111
- ④小蓝新增一行222
- ⑤小灰提交代码到svn仓库,svn仓库中的文件版本为11,小灰本地文件的版本也变为11
- ⑥小蓝提交代码到svn仓库,提交失败,使用了旧版本的数据进行提交。
Tips:我们在提交代码前应该养成习惯,首先更新一下本地代码,即将本地代码的版本更新到最新,然后再提交;
2) 代码编辑冲突
我们前面说到过,我们在提交代码前应该更新(update)一下代码,确保本地文件的版本是最新版本,然后再提交;那万一在更新代码时,svn中的代码和我们当前本地的代码不一样呢?此时就会产生代码冲突问题:

- ①小灰更新代码到最新版本(10)
- ②小蓝更新代码到最新版本(10)
- ③小灰修改文件内容为aaa
- ④小蓝修改同一个文件,将内容修改为bbb
- ⑤小灰提交代码到svn仓库,svn仓库中的文件版本为11,小灰本地文件的版本也变为11
- ⑥小蓝更新代码(确保本地文件是最新版本),此时代码冲突;因为本地文件中的内容和svn仓库中的文件内容不一致;
Tips:svn提供了代码冲突的解决办法,我们在后面介绍,本章了解代码冲突的情况即可;
3) 代码覆盖
我们提交代码之前,必须要保证本地空间是最新版本才能提交成功;也就是说,我们每次提交代码之前都需要先执行update命令将本地工作空间更新到最新版本。
在执行更新时,如果当前工作空间代码与SVN服务器中的代码不一致时会出现冲突,这主要是因为在更新时,有可能将本地的代码给覆盖掉。当我们解决冲突之后,就可以提交代码了,此时SVN认为本地提交的代码是经过了开发人员确认的,无异议的。
可如果其他开发人员在更新代码时,如果当前工作空间的代码与SVN服务器的代码不一致时,将会被SVN服务器中的代码所覆盖,这将是比较危险的行为;
有可能开发人员A编写了一天的代码,另一个开发人员B在更新这代码时与A冲突了,于是自己就解决冲突并且提交SVN服务器。等到A更新SVN服务器中的代码到本地时,A的代码就会被SVN服务器中的代码所覆盖;

在上述案例中,小灰的代码在更新时被SVN服务器中的代码所覆盖了;
二、SVN的使用
2.1 项目库配置
2.1.1 创建项目库
svn可以通过命令行的方式帮我们创建一个项目的版本库,在一个空白文件夹中打开cmd窗口,输入命令:
svnadmin create ./test_oa

Tips:在当前目录下创建
test_oa项目版本库;
查看完整项目版本库目录:

- conf:版本库配置文件目录
- db:版本数据存储目录
- hooks:存放版本库勾子目录
- locks:存储库锁目录,用来跟踪库的访问者
- format:存储一个整数的文件,此整数代表库层次结构版本
2.1.2 开启服务仓库监听
服务器监听:
- 语法:
svnserve -d -r 目录 --listen-port 端口号
- 示例:
svnserve -d -r d:\000 --listen-port 8888
Tips:服务端口默认是3690
2.1.3 权限配置
修改版本库中conf目录下的svnserver.conf文件:
D:\000\test_oa\conf\svnserver.conf

anon-access:匿名用户拥有的权限;auth-access:认证后的用户拥有的权限;
权限可选值有:
read:默认值,只允许读write:允许读/写none:不可读,不可写
2.2 SVN的命令操作
我们前面配置好了项目库,接下来我们就模拟多个用户协同开发的情况;
创建两个空目录(模拟两个用户):

2.2.1 检出操作
checkout:检出操作;在SVN中,检出操作会将版本库中的内容复制到本地一份,同时建立与版本库之间的关系,纳入到版本库体系中进行监管;
在cmd窗口中执行:
- xiaohui:
PS D:\000\workspace\xiaohui> svn checkout svn://localhost:8888/test_oa ./test_oa
Checked out revision 0.
./test_oa:代表检出到当前目录下的test_oa目录
- xiaolan:
PS D:\000\workspace\xiaolan> svn checkout svn://localhost:8888/test_oa ./test_oa
Checked out revision 0.

Tips:检出完成后,当前目录会出现一个
.svn文件夹,该文件夹默认是隐藏状态,.svn所在的目录就是副本目录,也叫工作副本;我们以后要进行版本控制相关的操作都需要在工作副本目录执行;
2.2.2 添加操作
我们首次提交任何文件到服务器之前都应该先使用add命令将其添加到版本控制体系中,让svn服务器对其进行版本的控制管理;
在xiaohui工作空间下新建一个aaa.txt文件,文件内容:
111
然后执行add命令:
PS D:\000\workspace\xiaohui\test_oa> svn add .\aaa.txt
A aaa.txt

2.2.3 提交操作
作用:提交操作用于将已经被纳入到版本控制的文件提交到svn服务器;
- 格式:
svn commit -m '日志信息' 文件名
注意:提交时必须写日志信息,否则不能提交;
- 示例:
PS D:\000\workspace\xiaohui\test_oa> svn commit -m "初始化aaa.txt文件,文件内容111" .\aaa.txt
Adding aaa.txt
Transmitting file data .done
Committing transaction...
Committed revision 1.
PS D:\000\workspace\xiaohui\test_oa>

注意1:必须开放访问权限(anon-access=write):

注意2:只有当执行了add操作后,才可以进行提交到服务器,直接提交将会出现如下错误:

2.2.4 更新操作
作用:将服务器的最新文件(版本)更新到本地
- 格式:
svn update 文件名
- 示例:
使用xiaolan工作空间更新hello.txt文件:
PS D:\000\workspace\xiaolan\test_oa> svn update aaa.txt
Updating 'aaa.txt':
A aaa.txt
Updated to revision 1.

2.2.5 删除操作
当我们需要删除svn服务器中的文件时不能使用windows进行删除,那样只是删除工作副本的文件,当我们执行更新操作时,被删除的文件又会被重新下载下来;因为我们并没有删除svn服务器中的文件,要删除svn服务器中的文件,必须使用svn提供的命令来删除;
- 格式:
svn delete 文件名
svn commit -m 日志 删除的文件
Tips:删除文件之后,需要提交删除的文件,代表更新到服务器;
首先在xiaohui工作空间创建一个test.txt文件;
将test.txt提交到项目库:
PS D:\000\workspace\xiaohui\test_oa> svn add .\test.txt # 使用add命令添加到版本库控制
A test.txt
PS D:\000\workspace\xiaohui\test_oa> svn commit -m '测试删除文件' .\test.txt # 提交文件
Adding test.txt
Transmitting file data .done
Committing transaction...
Committed revision 2.
PS D:\000\workspace\xiaohui\test_oa> svn list svn://localhost:8888/test_oa # 查看svn服务器文件列表
aaa.txt
test.txt
PS D:\000\workspace\xiaohui\test_oa>

xiaolan执行update操作(执行完毕后,小蓝的工作目录下多了一个test.txt):
PS D:\000\workspace\xiaolan\test_oa> svn update test.txt
Updating 'test.txt':
A test.txt
Updated to revision 2.

回到xiaohui工作空间删除文件:
PS D:\000\workspace\xiaohui\test_oa> svn delete .\test.txt # 删除文件
D test.txt
PS D:\000\workspace\xiaohui\test_oa> svn list svn://localhost:8888/test_oa # 查看文件列表
aaa.txt
test.txt
PS D:\000\workspace\xiaohui\test_oa> svn commit -m "删除test.txt" test.txt # 提交删除操作
Deleting test.txt
Committing transaction...
Committed revision 3.
PS D:\000\workspace\xiaohui\test_oa> svn list svn://localhost:8888/test_oa # 再次查看文件列表(文件已经被删除)
aaa.txt
PS D:\000\workspace\xiaohui\test_oa>

xiaolan用户更新当前文件夹(会发现删除了test.txt)
PS D:\000\workspace\xiaolan\test_oa> dir # 查看当前目录
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 2023/11/30 17:59 3 aaa.txt
-a---- 2023/11/30 18:03 0 test.txt
PS D:\000\workspace\xiaolan\test_oa> svn update test.txt # 执行更新操作
Updating 'test.txt':
D test.txt
Updated to revision 3.
PS D:\000\workspace\xiaolan\test_oa> dir # 再次查看当前目录(test.txt文件已经被删除)
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 2023/11/30 17:59 3 aaa.txt
PS D:\000\workspace\xiaolan\test_oa>

2.3 冲突
2.3.1 旧版本冲突
我们在提交前,必须保证当前版本是最新的版本,不可使用旧版本提交;
1) 演示冲突
- 案例:
1)在xiaohui创建文件bbb.txt,文件内容如下:
111
222
333
444
2)然后提交:
PS D:\000\workspace\xiaohui\test_oa> svn add .\bbb.txt
A bbb.txt
PS D:\000\workspace\xiaohui\test_oa> svn commit -m 'bbb' .\bbb.txt
Adding bbb.txt
Transmitting file data .done
Committing transaction...
Committed revision 4.

Tips:当前项目库文件版本已经更新到了4;
3)在xiaolan空间更新bbb.txt到本地仓库:
PS D:\000\workspace\xiaolan\test_oa> svn update bbb.txt
Updating 'bbb.txt':
A bbb.txt
Updated to revision 4.

Tips:xiaolan的工作空间版本也更新到了4;
4)使用xiaohui编辑文件,然后提交;
编辑文件内容:
111aaa
222
333
444
提交:
PS D:\000\workspace\xiaohui\test_oa> svn commit -m '新增一行aaa' .\bbb.txt
Sending bbb.txt
Transmitting file data .done
Committing transaction...
Committed revision 5.

Tips:xiaohui工作空间变为了5版本;
5)使用xiaolan工作空间更改文件内容,提交;
文件内容:
111
222bbb
333
444
提交(此时xiaolan工作空间的版本还是4,处于旧版本):
PS D:\000\workspace\xiaolan\test_oa> svn commit -m "新增一行bbb" .\bbb.txt
Sending bbb.txt
Transmitting file data .done
Committing transaction...
svn: E160028: Commit failed (details follow):
svn: E160028: File '/bbb.txt' is out of date

提交失败;
2) 解决冲突
需要将xiaolan工作空间的代码更新到最新版本;
PS D:\000\workspace\xiaolan\test_oa> svn update .\bbb.txt # 从svn服务器更新最新的代码
Updating 'bbb.txt':
G bbb.txt
Updated to revision 5.
PS D:\000\workspace\xiaolan\test_oa> cat .\bbb.txt # 查看文件内容
111aaa
222bbb
333
444
PS D:\000\workspace\xiaolan\test_oa>

再次提交:
PS D:\000\workspace\xiaolan\test_oa> svn commit -m "新增一行bbb" .\bbb.txt
Sending bbb.txt
Transmitting file data .done
Committing transaction...
Committed revision 6.
PS D:\000\workspace\xiaolan\test_oa>

我们也可以使用xiaohui更新最新的代码:
PS D:\000\workspace\xiaohui\test_oa> svn update .\bbb.txt
Updating 'bbb.txt':
U bbb.txt
Updated to revision 6.
PS D:\000\workspace\xiaohui\test_oa>

2.3.2 代码编辑冲突
在"旧版本编辑冲突"案例中,xiaohui和xiaolan两个用户编辑的不是同一行记录,万一两个用户编辑的是同一行记录,那么这个时候就会出现代码编辑冲突;
1) 演示冲突
使用xiaohui编辑bbb.txt文件,文件内容:
111aaa
222bbb
333ccc
444
提交:
PS D:\000\workspace\xiaohui\test_oa> svn commit -m '新增第三行ccc' .\bbb.txt
Sending bbb.txt
Transmitting file data .done
Committing transaction...
Committed revision 7. # 版本号已经变为7
使用xiaolan编辑bbb.txt文件,文件内容:
111aaa
222bbb
333ddd
444
更新代码:
PS D:\000\workspace\xiaolan\test_oa> svn update .\bbb.txt
Updating 'bbb.txt':
C bbb.txt
Updated to revision 7.
Summary of conflicts:
Text conflicts: 1
Conflict discovered in file 'bbb.txt'.
Select: (p) postpone, (df) show diff, (e) edit file, (m) merge,
(mc) my side of conflict, (tc) their side of conflict,
(s) show all options:
出现代码冲突:

注意:文件版本变为7了;
可选值如下:
- p:推迟处理
- df:显示差异
- e:编辑文件
- m:合并
- mc:显示我的版本
- tc:显示他人的版本
- s:其他选项
2) 解决冲突
我们选择p,表示推迟处理,在xiaolan工作空间中在出现冲突的文件同级目录中出现如下几个文件:

bbb.txt:出现冲突的文件内容
111aaa
222bbb
<<<<<<< .mine
333ddd
||||||| .r6
333
=======
333ccc
>>>>>>> .r7
444
bbb.txt.mine:我们的文件内容
111aaa
222bbb
333ddd
444
bbb.txt.r6:6版本的文件内容
111aaa
222bbb
333
444
bbb.txt.r5:7版本的文件内容
111aaa
222bbb
333ccc
444
我们可以选择自己需要的内容填充到bbb.txt中,然后直接提交;
最终将bbb.txt文件内容修改为:
111aaa
222bbb
333ddd
333ccc
444
提交:
PS D:\000\workspace\xiaolan\test_oa> svn commit -m "更新代码出现冲突,解决了冲突" bbb.txt
Sending bbb.txt
Transmitting file data .done
Committing transaction...
Committed revision 8.
PS D:\000\workspace\xiaolan\test_oa>

使用xiaohui更新SVN服务器最新的代码(8版本的代码):
PS D:\000\workspace\xiaohui\test_oa> svn update .\bbb.txt
Updating 'bbb.txt':
U bbb.txt
Updated to revision 8. # 更新到8版本
PS D:\000\workspace\xiaohui\test_oa> cat .\bbb.txt # 查看文件内容
111aaa
222bbb
333ddd
333ccc
444

2.3.2 代码覆盖
需要注意的是:在某一方出现代码冲突时,解决冲突并提交后,SVN服务器则认为本次提交的代码是开发者确定的,等到其他开发者在更新本次代码到本地空间时即使本地代码与SVN服务器不一致也会被SVN服务器的代码所覆盖;
1) 代码冲突
在xiaohui工作空间新增ccc.txt,并提交:
PS D:\000\workspace\xiaohui\test_oa> vim ccc.txt # 创建并编辑ccc.txt文件
PS D:\000\workspace\xiaohui\test_oa> cat .\ccc.txt # 查看ccc.txt的文件内容
111
222
333
PS D:\000\workspace\xiaohui\test_oa> svn add ccc.txt # 执行add命令
A ccc.txt
PS D:\000\workspace\xiaohui\test_oa> svn commit -m 'ccc' ./ # 提交
Adding ccc.txt
Transmitting file data .done
Committing transaction...
Committed revision 9.
PS D:\000\workspace\xiaohui\test_oa>
使用xiaolan更新ccc.txt到本地:
PS D:\000\workspace\xiaolan\test_oa> svn update ccc.txt
Updating 'ccc.txt':
A ccc.txt
Updated to revision 9.
在xiaohui工作空间编辑代码,并提交:
PS D:\000\workspace\xiaohui\test_oa> vim .\ccc.txt # 编辑ccc.txt文件
PS D:\000\workspace\xiaohui\test_oa> cat .\ccc.txt # 查看ccc.txt文件内容
111aaa
222
333
PS D:\000\workspace\xiaohui\test_oa> svn commit -m '第一行aaa' ./ # 提交到SVN服务器
Sending ccc.txt
Transmitting file data .done
Committing transaction...
Committed revision 10.
在xiaolan工作空间编辑代码,然后更新(出现冲突):
PS D:\000\workspace\xiaolan\test_oa> vim .\ccc.txt # 编辑ccc.txt文件
PS D:\000\workspace\xiaolan\test_oa> cat .\ccc.txt # 查看ccc.txt文件内容
111bbb
222
333
PS D:\000\workspace\xiaolan\test_oa> svn update .\ccc.txt # 更新SVN服务器的代码
Updating 'ccc.txt':
C ccc.txt
Updated to revision 10. # 版本已经更新到了10
Summary of conflicts:
Text conflicts: 1
Conflict discovered in file 'ccc.txt'.
Select: (p) postpone, (df) show diff, (e) edit file, (m) merge,
(mc) my side of conflict, (tc) their side of conflict,
(s) show all options:
2) 解决冲突
输入p,延迟处理,然后编辑ccc.txt文件内容,删除其他的冲突文件,提交:
PS D:\000\workspace\xiaolan\test_oa> svn update .\ccc.txt
Updating 'ccc.txt':
C ccc.txt
Updated to revision 10.
Summary of conflicts:
Text conflicts: 1
Conflict discovered in file 'ccc.txt'.
Select: (p) postpone, (df) show diff, (e) edit file, (m) merge,
(mc) my side of conflict, (tc) their side of conflict,
(s) show all options: p # 输入p延迟处理(删除掉其他冲突文件)
PS D:\000\workspace\xiaolan\test_oa> vim .\ccc.txt # 编辑ccc.txt文件
PS D:\000\workspace\xiaolan\test_oa> cat .\ccc.txt # 查看ccc.txt文件
111bbb # 将第一行冲突的代码改为bbb
222
333
PS D:\000\workspace\xiaolan\test_oa> svn commit -m "更新代码出现冲突,解决了冲突-ccc.txt文件" ccc.txt
Sending ccc.txt
Transmitting file data .done
Committing transaction...
Committed revision 11.
注意:此时向SVN服务器提交了ccc.txt文件,第一行内容为111bbb,SVN服务器会认为这是开发者经过确认后得出的结果,下次使用xiaohui来更新代码时,bbb将会覆盖xiaohui工作空间的aaa;
3) 代码覆盖
PS D:\000\workspace\xiaohui\test_oa> cat .\ccc.txt # 查看ccc.txt文件的内容(10版本的)
111aaa
222
333
PS D:\000\workspace\xiaohui\test_oa> svn update .\ccc.txt # 将ccc.txt文件更新到最新版本(11版本)
Updating 'ccc.txt':
U ccc.txt
Updated to revision 11.
PS D:\000\workspace\xiaohui\test_oa> cat .\ccc.txt # 发现自己的内容被SVN服务器中的内容覆盖了
111bbb
222
333
2.4 svn其他操作命令
2.4.1 log命令
- 作用:log命令用于查看svn版本库的版本变更日志:
- 格式:
svn log [-r 起始版本:终止版本] [仓库地址]
Tips:仓库地址可以省略
- 示例:
svn log -r 5:10 svn://localhost:8888/test_oa
svn log svn://localhost:8888/test_oa
svn log -r 1:HEAD # 从1版本查询到最新版本

2.4.2 list命令
- 作用:查看当前服务器文件列表:
svn list svn://localhost:8888/test_oa

2.4.3 diff命令
diff命令有多种用法,主要用于比较两个版本的不同
1) 用法1
用法1:对比两个版本的不同
【语法】
svn diff -r 版本1:版本2 要对比的文件
【示例】
svn diff -r 14:13 111.txt

2) 用法2
用法2:对比当前工作副本中的文件内容与svn服务器文件内容
格式:
svn diff -r head 文件名
示例:
PS D:\000\workspace\xiaohui\test_oa> vim .\ccc.txt # 编辑ccc.txt文件
PS D:\000\workspace\xiaohui\test_oa> cat .\ccc.txt # 查看ccc.txt文件
111bbb
222
333aabb
PS D:\000\workspace\xiaohui\test_oa> svn diff -r head .\ccc.txt
Index: ccc.txt
===================================================================
--- ccc.txt (revision 11)
+++ ccc.txt (working copy)
@@ -1,3 +1,3 @@
111bbb
222
-333 # 11版本的ccc.txt文件
+333aabb # 当前工作空间的ccc.txt文件

2.4.4 merge命令
merge命令用于版本的回退
- 格式:
svn merge -r 当前最新版本:需要回退到的版本 文件名
- 示例:
PS D:\000\workspace\xiaohui\test_oa> cat .\ccc.txt
111bbb
222
333aabb
PS D:\000\workspace\xiaohui\test_oa> svn commit -m '新增aabb' .\ccc.txt # 将更改提交
Sending ccc.txt
Transmitting file data .done
Committing transaction...
Committed revision 12. # 版本变为12
PS D:\000\workspace\xiaohui\test_oa> svn diff -r 11:12 # 对比11和12版本的区别
Index: ccc.txt
===================================================================
--- ccc.txt (revision 11)
+++ ccc.txt (revision 12)
@@ -1,3 +1,3 @@
111bbb
222
-333
+333aabb
PS D:\000\workspace\xiaohui\test_oa> svn merge -r 12:11 ccc.txt # 回退到11版本(只是将工作空间的ccc.txt文件回退到了11版本)
--- Reverse-merging r12 into 'ccc.txt':
U ccc.txt
--- Recording mergeinfo for reverse merge of r12 into 'ccc.txt':
U ccc.txt
--- Eliding mergeinfo from 'ccc.txt':
U ccc.txt
PS D:\000\workspace\xiaohui\test_oa> cat .\ccc.txt # 查看工作空间
111bbb
222
333
PS D:\000\workspace\xiaohui\test_oa> svn commit -m "回退到11版本" ccc.txt # 提交到SVN服务器
Sending ccc.txt
Transmitting file data .done
Committing transaction...
Committed revision 13. # 文件变成了13版本(13版本和11版本的内容是一样的)
PS D:\000\workspace\xiaohui\test_oa>
2.5 revert撤销
revert命令用于撤销一系列动作,例如文件被执行了删除可以撤销、提交后出现冲突也可以撤销,回退到了指定版本也可以撤销;
- 格式:
svn revert 文件名
2.5.1 删除撤销
示例:
PS D:\000\workspace\xiaohui\test_oa> svn delete .\aaa.txt
D aaa.txt
PS D:\000\workspace\xiaohui\test_oa> svn revert aaa.txt
Reverted 'aaa.txt'
PS D:\000\workspace\xiaohui\test_oa>

2.5.2 冲突撤销
在xiaohui工作空间创建demo01.txt文件,并提交:
PS D:\000\workspace\xiaohui\test_oa> vim demo01.txt # 创建并编辑demo01.txt文件
PS D:\000\workspace\xiaohui\test_oa> cat .\demo01.txt # 查看demo01.txt文件内容
111
222
333
PS D:\000\workspace\xiaohui\test_oa> svn add .\demo01.txt # 执行add操作
A demo01.txt
PS D:\000\workspace\xiaohui\test_oa> svn commit -m 'demo01 create' .\demo01.txt # 提交
Adding demo01.txt
Transmitting file data .done
Committing transaction...
Committed revision 14.
在xiaolan工作空间执行update:
PS D:\000\workspace\xiaolan\test_oa> svn update demo01.txt
Updating 'demo01.txt':
A demo01.txt
Updated to revision 14.
PS D:\000\workspace\xiaolan\test_oa> cat .\demo01.txt
111
222
333
Tips:目前最新版本为14
1)xiaohui编辑demo01.txt,提交:
PS D:\000\workspace\xiaohui\test_oa> vim .\demo01.txt # 编辑demo01.txt文件
PS D:\000\workspace\xiaohui\test_oa> cat .\demo01.txt # 查看demo01.txt文件内容
111aaa
222
333
PS D:\000\workspace\xiaohui\test_oa> svn commit -m 'demo01-aaa' .\demo01.txt # 提交更改
Sending demo01.txt
Transmitting file data .done
Committing transaction...
Committed revision 15.
2)xiaolan编辑demo01.txt,然后更新(出现冲突):
PS D:\000\workspace\xiaolan\test_oa> vim .\demo01.txt # 编辑demo01.txt文件
PS D:\000\workspace\xiaolan\test_oa> cat .\demo01.txt # 查看demo01.txt文件内容
111bbb
222
333
PS D:\000\workspace\xiaolan\test_oa> svn update .\demo01.txt # 更新SVN服务器的文件到本地
Updating 'demo01.txt':
C demo01.txt
Updated to revision 15. # 版本更新了,变为了15
Summary of conflicts: # 出现冲突
Text conflicts: 1
Conflict discovered in file 'demo01.txt'.
Select: (p) postpone, (df) show diff, (e) edit file, (m) merge,
(mc) my side of conflict, (tc) their side of conflict,
(s) show all options:
输入p,出现冲突文件:

5)撤销冲突:
PS D:\000\workspace\xiaolan\test_oa> svn revert demo01.txt # 撤销冲突
Reverted 'demo01.txt'
PS D:\000\workspace\xiaolan\test_oa> cat .\demo01.txt # 查看文件内容
111aaa
222
333
Tips:需要注意的是,撤销冲突后,demo01.txt文件版本变为15(最新版本),也就是xiaohui提交的内容。自己刚刚编写的内容将会丢失;
图解:

2.5.3 回退撤销
1)xiaohui新建demo02.txt,提交:
PS D:\000\workspace\xiaohui\test_oa> vim .\demo02.txt # 创建并编辑demo02.txt文件
PS D:\000\workspace\xiaohui\test_oa> cat .\demo02.txt # 查看demo02.txt文件
111
222
333
PS D:\000\workspace\xiaohui\test_oa> svn add demo02.txt # 执行add
A demo02.txt
PS D:\000\workspace\xiaohui\test_oa> svn commit -m "demo02 create" .\demo02.txt # 提交
Adding demo02.txt
Transmitting file data .done
Committing transaction...
Committed revision 16.
2)编辑demo02.txt,提交(产生一个新的版本):
PS D:\000\workspace\xiaohui\test_oa> vim .\demo02.txt # 编辑demo02.txt文件
PS D:\000\workspace\xiaohui\test_oa> cat .\demo02.txt # 查看demo02.txt文件
111
222
333
444
PS D:\000\workspace\xiaohui\test_oa> svn commit -m 'demo02-444' .\demo02.txt # 提交
Sending demo02.txt
Transmitting file data .done
Committing transaction...
Committed revision 17.
3)xiaohui进行版本回退:
PS D:\000\workspace\xiaohui\test_oa> svn merge -r 17:16 .\demo02.txt # 回退到16版本
--- Reverse-merging r17 into 'demo02.txt':
U demo02.txt
--- Recording mergeinfo for reverse merge of r17 into 'demo02.txt':
U demo02.txt
--- Eliding mergeinfo from 'demo02.txt':
U demo02.txt
PS D:\000\workspace\xiaohui\test_oa> cat .\demo02.txt # 查看demo02.txt文件
111
222
333
PS D:\000\workspace\xiaohui\test_oa> svn revert .\demo02.txt # 撤销回退
Reverted 'demo02.txt'
PS D:\000\workspace\xiaohui\test_oa> cat .\demo02.txt # 查看demo02.txt文件
111
222
333
444
三、VisualSVN
3.1 VisualSVN简介
VisualSVN是Subversion的一款图形化界面工具,提供了图形化方式来辅助我们管理仓库、用户、组信息,另外VisualSVN还帮我们提供了svn的windows服务,http服务等;
Tips:如果直接使用Subversion,那么在Windows 系统上,要想让它随系统启动,就要封装SVN Server为windws service,还要通过修改配置文件来控制用户权限,另外如果要想以web方式【http协议】访问,一般还要安装配置web服务器,非常的麻烦,而VisualSVN Serve集成了Subversion和web服务器,省去了以上所有的麻烦。安装的时候SVN Server已经封装为windws service,web服务器的配置也只是在图像界面上,指定认证方式、访问端口等简单操作;另外,用户权限的管理也是通过图像界面来配置。
- VisualSVN操作界面:

3.2 VisualSVN的使用
3.2.1 创建仓库
1)创建一个新的仓库

2)选择本地仓库模式

3)输入仓库名

4)创建一个标准工程:

5)设置权限

6)完成

7)查看项目

关于仓库中三个文件夹的解释:
branches:仓库分支;tags:可以理解为项目的里程碑,也可以说是快照,凡是放在tag里的代码都不变了。凡是放在tag里的代码都是经过测试,认定稳定之后才放进去的;trunk:主干分支;
Tips:关于分支的概念我们后面再介绍;
3.2.2 用户和组
SVN仓库是针对于某个用户开放read/write权限的,我们可以在仓库上右击选择properties查看仓库的权限信息:

Tips:当前仓库是任何都具备read/write权限
我们可以通过组来管理多个用户,在仓库设置访问权限时,就可以针对组来设置;
右击Users--->Create User...创建用户:

右击Groups--->Create Group...:

我们把zhangsan、lisi设置为test组;
xiaohui、xiaolan设置为dev组;

将项目设置dev组可以访问(读写),那么项目只有xiaohui、xiaolan两个人可以读写;zhangsan、lisi不能操作;
3.2.3 检出VisualSVN项目库
- 格式:
svn checkout [--username 用户名 --password 密码] 仓库地址
- 使用xiaohui检出项目:
PS D:\000\workspace\xiaohui> svn checkout --username xiaohui --password admin https://LAPTOP-OC90J78H/svn/test_01/ ./test_01
A test_01\branches
A test_01\tags
A test_01\trunk
Checked out revision 1.
PS D:\000\workspace\xiaohui>
- 使用zhangsan检出项目:
PS D:\000\workspace\xiaohui> svn checkout --username zhangsan --password admin https://LAPTOP-OC90J78H/svn/test_01/ ./test_01
svn: E170013: Unable to connect to a repository at URL 'https://laptop-oc90j78h/svn/test_01'
svn: E175013: Access to '/svn/test_01' forbidden
PS D:\000\workspace\xiaohui>
Tips:zhangsan不在dev组,无法检出,权限不足;
四、TortoiseSVN
4.1 TortoiseSVN简介
TortoiseSVN是一款基于windows系统的svn客户端工具,TortoiseSVN可以很好的帮助我们操作SVN仓库,例如检出、添加、更新、提交、删除、撤销、日志记录、回滚版本、解决冲突、文件忽略等功能;
安装好TortoiseSVN之后,查看右键菜单:

选择Repo-browser,输入仓库的地址:

输入用户名和密码:

在线浏览仓库

4.2 TortoiseSVN的使用
4.2.1 检出
首先将test_01的仓库权限设置为xiaohui、xiaolan用户可读/写;

1)创建两个工作空间目录,xiaohui、xiaolan:

2)在空白地方右击鼠标,选择SVN Checkout...进行项目检出:

3)选择地址进行检出

4)检出成功

查看目录:

绿色勾图标:当前工作副本和svn服务器完全一致;
使用xiaolan用户重新检出一份到xiaolan目录:
首先需要清除之前保存的用户信息:

清除用户信息:

重复刚刚xiaohui检出的步骤,期间需要重新输入用户名和密码,我们输入xiaolan的用户名和密码:

检出之后:

Tips:我们去到团队开发后,通常只会有一个账号,一个账号也可以检出多份项目副本。使用xiaohui账号检出的项目编辑之后,也可以使用xiaolan账号进行提交,此时SVN服务器将会记录该版本是xiaolan提交的。
4.2.2 添加

添加成功后:

蓝色小加号:刚纳入到版本控制中,还未提交
4.2.3 提交

填写日志信息:

提交完成后,文件左下角出现绿色勾勾图标,代表与服务器端的版本一模一样(是最新版本):

查看VisualSVN服务器:

4.2.4 更新
来到xiaolan工作空间,空白处右击SVN Update:

4.2.5 删除
删除:

点击delete后,磁盘中的aaa.txt文件已经被删除,但是SVN服务器中的aaa.txt文件依旧存在;
空白处右击,选择提交:

填写日志:

提交后再次查看VisualSVN,发现aaa.txt没有了;
4.2.6 日志
在空白处右键--->TortoiseSVN--->show log

查看日志:

4.3 TortoiseSVN的回退
4.3.1 revert回退
revert回退是将当前工作空间的代码回退到之前的版本,回退之后当前工作空间仍然是最新版本,因此使用revert回退到之前的版本之后,可以立即提交到SVN服务器,又产生一次新版本。因此revert可能会产生一次"空版本",即SVN服务器有两次版本的内容是一样的。
创建bbb.txt,并提交:
| 操作 |
|---|
| 创建bbb.txt,文件内容111 |
| 执行add、commit(版本为4) |
| 修改bbb.txt,新增文件内容222 |
| commit(版本为5) |
查看日志,在指定的版本上右击--->Revert to this revision:

查看bbb.txt文件:

此时只是本地文件内容被回退到了111,SVN服务器上的bbb.txt文件内容并没有被回退;我们可以将本次回退的内容提交,以改变SVN服务器中的bbb.txt文件内容:

本次提交产生了一个新的版本。
查看日志:

4.3.2 update回退
update回退会将当前工作空间的版本真正的回退到之前的某个版本(工作空间的内容也会随之回退),使用update回退如果回退之后的文件没有做任何修改,则不能提交。必须要基于以前的版本修改才可以提交,但是需要注意的是,update回退将当前工作空间回退到了之前版本,因此想要提交之前必须先将代码更新到最新版本,否则会出现旧版本冲突。
因而,update回退只适用于回退到之前的版本然后查看之前版本的内容,并不想要修改内容然后提交。如果真的想要回退到之前的某个版本然后提交我们应该使用revert回退,只回退当前的工作空间内容;
在bbb.txt文件上右击--->TortoiseSVN--->Show log:

我们知道,此时只是本地空间的bbb.txt文件被回退到了4版本,SVN服务器中的bbb.txt文件并没有回退到4版本的内容;如果我们要修改SVN服务器中的bbb.txt的内容,必须要提交到SVN服务器,但是如果使用的使用update来回退,如果本次没有对文件做任何的修改,那么文件是不可以提交的;

4.4 TortoiseSVN演示冲突
4.4.1 模拟冲突
模拟冲突:
| xiaohui | xiaolan |
|---|---|
| 创建demo01.txt | |
| 内容为: | |
| 111 | |
| 222 | |
| 333 | |
| 执行add | |
| 执行commit(版本为5) | |
| 执行update(版本也为5) | |
| 修改内容为: | |
| 111aaa | |
| 222 | |
| 333 | |
| 执行commit(版本为6) | |
| 修改内容为: | |
| 111bbb | |
| 222 | |
| 333 | |
| 执行update(将当前工作空间版本更新为6,出现冲突) |

查看产生冲突的文件夹:

黄色感叹号:提交的文件与svn服务器冲突时的状态;
4.4.2 解决冲突
1)选择冲突的文件,右击--->TortoiseSVN--->Edit conflicts

冲突界面:

解决完毕冲突后点击Save,选择是否要清空冲突文件:

我们选择Mark as resolved,冲突文件全部消失:

红色感叹号:工作副本有修改但未提交;
在xiaolan工作空间提交:

Tips:此时使用xiaohui账号更新最新版本的代码(7版本),xiaohui工作空间的代码将会被SVN服务器中的代码覆盖;
4.5 TortoiseSVN的撤销
4.5.1 删除撤销
创建一个demo02.txt文件,执行add、commit等操作;
在demo02.txt文件上右击--->TortoiseSVN--->Delete:

文件从磁盘中被删除了,但是SVN服务器中的文件依旧存在;
在工作副本空白处右击--->TortoiseSVN--->Revert...


发现工作空间的文件又回来了;

4.5.2 冲突撤销
模拟冲突:
| xiaohui | xiaolan |
|---|---|
| 创建demo03.txt | |
| 内容为: | |
| 111 | |
| 222 | |
| 333 | |
| 执行add | |
| 执行commit(版本为9) | |
| 执行update(版本也为9) | |
| 修改内容为: | |
| 111aaa | |
| 222 | |
| 333 | |
| 执行commit(版本为10) | |
| 修改内容为: | |
| 111bbb | |
| 222 | |
| 333 | |
| 执行update(将当前工作空间版本更新为10,出现冲突) |

冲突文件:




需要注意的是:撤销冲突后,demo03.txt文件版本变为10(最新版本),也就是xiaohui提交的内容。自己刚刚编写的内容将会丢失;
4.5.3 回退撤销
将demo03.txt回退到9版本:

查看文件内容:

回退:


再次查看文件内容:

五、分支
5.1 分支概念
分支在SVN中其实就是一个文件夹(仓库);到目前为止,我们所有的项目文件都是统一放在SVN仓库的根目录下的。在SVN中一个仓库可以管理多个项目或者说多个模块的。比如一个oa系统会有人事模块、会议模块、部门模块、财务模块等;再或者我们建立一个mine仓库一个external仓库,mine代表存放的是我内部自研项目,external代表承接其他公司的项目;总而言之我们可以建立多个文件夹来管理我们的项目。

我们上面的mine、external、CRM系统、OA系统就是分支,多分支的第一个好处当然就是方便管理项目了,项目结构清晰明了;
5.1.1 分支的版本隔离
在版本控制中,分支还有另一个巨大的好处,那就是提供了版本控制的隔离;
目前为止,我们所有项目、模块都存储在一个分支(文件夹)中,我们知道,任意模块的代码提交都会产生一个版本的更新,并且这个版本属于此分支,这样一来当有某个模块需要回退到历史的某个版本时,在同一个仓库的其他模块的代码也必定会回退到这个版本的时期,原因是他们都属于一个分支(文件夹);

我们建立分支后,在指定分支中触发的版本更新是属于这个分支的,当进行版本回退时,也只是回退当前分支的代码,并不会影响其他分支的开发;

5.1.2 分支项目迭代开发
在项目开发中,当系统老的版本基于稳定时,如果此时要将系统进行迭代更新,那么为了不影响当前版本,我们会在当前版本上开发一个新的分支,基于新的分支进行更新开发,这样就算新版本的开发中途废弃也不影响上一个版本。虽然SVN提供的版本回退功能也可以将系统还原到任意一个版本,但总规不如在一个新的分支上开发方便;
SVN分支协同开发的本质其实就是对稳定的代码不动,要开发新的功能就将当前项目代码重新复制一份到新的文件夹(分支),基于当前代码开发新功能;

5.2 分支的操作
5.2.1 分支的命令
分支真正意义上就是一个文件夹而已,这个文件夹中保存着这里面代码的版本体系,因此创建分支、删除分支等其实就是创建一个文件夹、删除一个文件夹而已;
创建分支:
- 格式:
svn copy [--username 用户名 --password 密码] [文件夹地址] [新地址] -m "创建日志"
- 示例:
svn copy --username xiaohui --password admin https://LAPTOP-OC90J78H/svn/test_01/trunk https://LAPTOP-OC90J78H/svn/test_01/branches/t1 -m "创建测试分支"
在test_01项目下创建了一个t1分支(实质上就是把trunk目录下的文件复制了一分到branches目录下的t1目录)

- 通过
VisualSVN创建分支:

5.2.2 分支开发的好处
1) 没有分支开发
创建一个新的项目,test02,在test项目中创建一个demo01分支;

检出项目:

在demo01分支中,准备两个文件:pay.txt、login.txt
| 操作1 | 操作2 |
|---|---|
| 创建pay.txt文件,文件内容: | |
| 初始化支付业务 | |
| 提交(此时版本为3) | |
| 创建login.txt文件,文件内容: | |
| 初始化登录业务 | |
| 提交(此时版本为4) | |
| 新增支付宝支付 | |
| 提交(版本为5) | |
| 新增QQ登录 | |
| 提交(版本为6) | |
| 新增微信支付 | |
| 提交(版本为7) | |
| 新增微信登录 | |
| 提交(版本为8) |
注意:上述操作都是同一个用户针对同一个工作空间操作,因此不需要update;
查看日志:

Tips:最新版本为8
将当前项目(分支)回退到版本7(新增微信支付):

查看login.txt:

发现连同login.txt一起回退到之前版本了;
2) 使用分支开发
创建一个新的项目,test_03,在test_03项目中创建一个demo01分支,在demo01分支下创建login和pay分支;

检出项目:

在pay分支中,创建pay.txt,在login分支中创建login.txt
| 操作1 | 操作2 |
|---|---|
| 在pay分支中创建pay.txt文件,文件内容: | |
| 初始化支付业务 | |
| 提交pay分支(此时版本为5) | |
| 在login分支创建login.txt文件,文件内容: | |
| 初始化登录业务 | |
| 提交login(此时版本为6) | |
| 新增支付宝支付 | |
| 提交(版本为7) | |
| 新增QQ登录 | |
| 提交(版本为8) | |
| 新增微信支付 | |
| 提交(版本为9) | |
| 新增微信登录 | |
| 提交(版本为10) |
需要注意的是,即使有多个分支,多个分支也是共享同一个版本号体系;任意分支的提交,会导致整个项目的版本号向前推进一次;
- 查看pay分支的日志(在pay分支的工作空间右击):

- 查看login分支的日志(在login分支的工作空间右击):

需要注意的是,即使有多个分支,多个分支也是共享同一个版本号体系;任意分支的提交,会导致整个项目的版本号向前推进一次;目前最新版本为10
在pay使用回退,回退到7版本(新增支付宝支付),会发现login分支的代码并不会受影响;

查看pay.txt(回退到了7版本):

查看login.txt(还是在10版本,并没有回退到7版本):

5.2.3 SVN分支的本质
有了分支之后,让我们进行项目开发更加方便,对某一个功能的回退,不会影响到其他功能;
但我们从本质上去理解分支,其实分支本身就是一个文件夹,在上述案例中,分支之所以能够帮助我们进行"版本隔离",其根本原因就是因为多个分支不在同一个文件夹(分支),我们回退版本是对整个文件夹(分支)的回退,如果两个文件都处于一个文件夹(分支),那么其他文件必定会受本次回退的影响。
因此通过我们从本质上理解分支,可以得出如下两个结论:
- 1)在案例1中(文件都在同一个分支),我们将整个文件夹(分支)都回退到了指定版本,那么当前文件夹(分支)中的所有文件必定会连同一起回退到之前版本,那如果我们在回退版本时,只选择固定的文件,则其他文件并不会受本次回退的影响。
首先将案例1(test_02)中的login.txt和pay.txt都更新到最新版本;

查看pay.txt和login.txt:

将pay.txt回退到7版本(新增微信支付),查看login.txt文件内容:
Tips:注意是将pay.txt回退到7版本,不是把当前分支回退到7版本。

回退到7版本:

查看login.txt文件:

- 2)在案例2中(文件在不同分支),我们将pay分支回退到之前的版本,login分支不会受到影响,但是如果我们回退的是父级分支(父级文件夹)demo01,则pay分支和login分支都会受本次回退的影响。
首先将案例2(test_03)的两个分支都更新到最新版本
然后回到demo01分支(pay分支和login分支的父级分支),在空白处右键,代表回退demo01分支的内容:


此时回退的是整个demo01分支,pay和login分支里面的文件都回退到了7版本:

5.4 合并分支
建立好分支后,我们可以使用分支进行功能开发,开发功能趋于成熟稳定后,我们可以将主线分支与当前分支进行合并,这样其他分支的功能就集成到主分支上了。

5.4.1 打分支
打分支其实就是基于分支的复制,把当前分支打到(复制)其他分支去;
创建一个新的项目test04,在branches分支下创建一个login分支,该分支作为普通开发分支;

将项目检出到本地:

开发一些功能:
创建login.txt文件,文件内容:
| 操作 |
|---|
| 创建login.txt文件,初始内容: |
| 初始化登录业务 |
| 执行add、commit(版本为3) |
| 新增QQ登录 |
| commit(版本为4) |
将/branches/login分支打包到/trunk分支下:
首先在/branches/login分支的空白处右键--->TortoiseSVN--->Branch/tag...:


To path中输入或选择要打分支到哪一个文件夹下,如果是输入的是不存在的分支(文件夹)的话,那么会自动在SVN中创建该分支(文件夹)。

在trunk分支中执行update:


5.4.2 分支合并
使用/trunk/login分支开发一些功能(目前项目的最新版本为5):
| 操作 |
|---|
| 新增微信登录 |
| 执行add、commit(版本为6) |
在需要合并的文件/文件夹上右击--->TortoiesSVN--->Merge...,在branches/login分支中的login.txt文件右键,代表需要合并其他文件的内容到当前文件中


合并成功:

查看/branches/login/login.txt文件内容:

六、idea集成SVN插件
6.1 SVN插件基本使用
在xiaohui工作空间创建一个新的项目:

6.1.1 绑定SVN插件
1)打开Settings--->Version Control--->Subversion;选择SVN命令

2)打开VCS--->Enable Version Control Integration...;开启版本控制:

3)选择Subversion:

4)打开Settings--->Version Control;选择添加需要控制的项目:

5)添加成功:

6.1.2 提交项目
1)在需要提交的项目右键--->Subversion--->Share Directory...

2)选择要提交到的分支:

3)提交项目:

查看VisualSVN:

项目提交成功;
6.2.3 忽略文件
我们在开发工具创建项目或者模块时,开发工具会有一些默认的项目配置文件,如.idea文件夹、.iml文件等,这些都是供idea识别的配置文件,其中内容包含项目所在的磁盘地址、模块信息等;每个开发人员实际的存放的项目磁盘地址很可能是不一样的,我们应该把这些与项目本身无关的文件忽略掉,不应该提交到svn服务器;
- 打开
Settings--->Editor--->File Types:

选择要忽略的文件:

添加忽略后,发现项目中的.idea文件夹不见了:

删除SVN仓库中的项目:

删除项目中的.idea、.svn、.iml、.gitignore等项目相关的配置文件:

重新打开项目,按照我们之前的方式重新分享到SVN服务器中;
重新提交后,查看VisualSVN服务器:

6.1.4 检出项目
一般情况下,我们进入公司项目组开发,都是检出公司中已有的项目进行开发;
我们在打开idea界面时选择Get from VCS,如图所示:



6.1.5 其他操作
SVN的大多数操作都在Subversion菜单中:

6.2 解决冲突
6.2.1 模拟冲突
- 1)在xiaohui工作目录创建Demo01.java
文件内容:
public class Demo01 {
public static void main(String[] args) {
System.out.println(111);
}
}

- 2)执行add、commit操作;

- 3)在xiaolan工作空间执行update:

- 4)在xiaolan工作空间修改文件内容:
public class Demo01 {
public static void main(String[] args) {
System.out.println(111222);
}
}
- 5)提交

- 6)在xiaohui工作目录修改Demo01.java
文件内容:
public class Demo01 {
public static void main(String[] args) {
System.out.println(111333);
}
}

7)执行update(此时与svn服务器中的文件内容不一样),出现冲突



6.2.2 解决冲突


解决冲突之后,记得要提交:

可以在xiaolan工作空间更新最新的代码;
6.3 回退版本
使用VisualSVN重新创建一个项目test_revert,在xiaohui空间创建项目Demo01,并按照之前的方式推送到SVN服务器。

【编辑】
| 操作 |
|---|
| 创建Demo01.java,文件初始内容111 |
| add、commit |
| 新增222 |
| commit |
| 新增333 |
| commit |
6.3.1 查看历史提交版本
1) 查看历史回退
在项目上右击--->Subversion--->Show History:
Tips:如果是单独在某个文件上右击,那么查看的是这个文件的历史记录


作者之所以都是xiaohui,那是因为我们都是通过xiaohui的账号拉取项目到本地空间的;

2) 切换账号
删除xiaolan工作空间的项目,我们使用xiaolan账号来重新检出一份;
关闭所有项目,打开IDEA全局设置:




在xiaolan工作空间编辑代码,提交,查看日志:
/**
* @author lscl
* @version 1.0
* @intro:
*/
public class Demo01 {
public static void main(String[] args) {
System.out.println(111);
System.out.println(222);
System.out.println(333);
System.out.println(444);
}
}
此时idea保存的凭证就是xiaolan的凭证,使用idea进行提交之后(不管是xiaohui还是xiaolan工作空间),作者将会显示xiaolan

6.3.2 回退版本
我们之前在使用TortoiseSVN回退时介绍过,回退分为revert、update两种回退
- update回退:将当前工作空间的版本回退到指定版本,对文件修改后必须更新到最新版本才可以提交,一般用于回退到某个版本查看该版本的代码。
- revert回退:将当前工作空间的代码回退到指定版本,但是工作空间的版本仍然是最新版本,因此使用revert回退到指定版本后就相当于将当前工作空间的代码修改成某个版本,然后立即提交
1) update回退
在xiaolan工作空间进行如下操作:
在项目上右键,更新文件:

选择指定版本回退:

点击OK

将工作空间回退到指定版本:

回退成功后,直接在项目上右击--->Subversion--->Commit Directory...,发现提示不能提交:

修改了文件之后,也不能提交,会出现旧版本冲突(需要先更新到最新版本)

我们将刚刚编辑的代码删除,或者在文件上右键--->Subversion--->Revert...


然后回退到最新版本:


2) revert回退
revert回退之后,即使文件没有修改也可以产生一个新的版本;
在指定文件上右击--->Subversion--->Show History,查看文件的历史版本,在指定的版本上右击--->Get:


编辑Demo01.java:
/**
* @author lscl
* @version 1.0
* @intro:
*/
public class Demo01 {
public static void main(String[] args) {
System.out.println(111);
System.out.println(222);
System.out.println(1212);
}
}

使用xiaohui工作空间,执行update,发现代码被更新到本地了;
6.4 分支操作
使用VisualSVN重新创建一个项目test_demo,在xiaolan工作空间创建Demo01项目,使用之前的方法分享到SVN服务器;

6.4.1 分支打包
首先将trunk分支下的Demo01项目打包到branches/test分支下:

查看VisualSVN:

检出test分支下的Demo01项目到xiaohui工作目录中:

选择检出的磁盘路径:

6.4.2 合并分支
合并分支就是将其他分支的代码合并到指定分支中;
- 1)在xiaolan工作空间,编辑内容如下,并提交:
public class Main {
public static void main(String[] args) {
System.out.println("Hello world!");
System.out.println("111");
}
}
- 2)在xiaohui工作空间合并xiaolan工作空间;
xiaohui工作空间是test分支的代码,xiaolan工作空间是trunk分支的代码,现在需要将truck分支的代码合并到test分支中:
Tips:
- 1)是谁要合并别人的代码,就在谁的项目上右键
- 2)合并分支代码时,必须保证当前工作空间版本是最新的
在xiaohui工作空间的项目右键--->Subversion--->Integrate Director:



合并完成,在xiaohui工作空间提交:

- 3)将test分支的代码合并到trunck分支
修改xiaohui工作空间的代码,然后提交:
public class Main {
public static void main(String[] args) {
System.out.println("Hello world!");
System.out.println("111");
System.out.println("222");
}
}
然后再xiaolan工作空间项目处右键--->Subversion--->Integrate Director:


提交xiaolan工作空间刚刚合并的代码:

6.4.3 合并分支代码冲突
当合并过来的代码与本地工作空间的代码不一样,会出现合并冲突
- 1)修改xiaolan工作空间(trunck分支)的代码:
public class Main {
public static void main(String[] args) {
System.out.println("Hello world!");
System.out.println("111");
System.out.println("222aaa");
}
}
提交项目;
- 2)修改xiaohui工作空间(test分支)的代码:
public class Main {
public static void main(String[] args) {
System.out.println("Hello world!");
System.out.println("111");
System.out.println("222bbb");
}
}
提交项目;
使用trunck分支(xiaolan)合并test分支(xiaohui),在xiaolan工作空间项目处右键:

idea先更新当前工作空间:

更新完毕后,重新合并,发现工作空间的代码被覆盖了:

6.4.4 切换分支
项目存在多个分支后,我们经常需要在当前工作空间切换分支进行开发,而切换分支最简单的方式就是将多个分支上的代码检出到不同的文件夹,而切换分支就是使用idea打开不同文件夹的项目,但这样操作未免过于麻烦。
好在idea支持我们将当前任意分支的代码一键切换到当前工作空间,这样我们想要切换分支就非常方便了,不需要检出到多个文件夹。

点击OK后,当前工作空间的代码就变为了test分支的Demo01项目;

浙公网安备 33010602011771号