SVN作为源代码文件版本管理的工具,在日常项目中,经常使用到。上一篇文章主要介绍了客户端TortoiseSVN基本操作,可以让新入坑的小伙伴,快速的上手SVN。但是基本操作并不能覆盖全,日常开发的工作场景。本篇文章紧接上一篇,是上一篇的进阶内容。所以小伙伴们,一定要先跟着上一篇内容完成的操作,打好基础了。本篇文章依然是图文教程,加入了个人的看法和注释,需要的朋友们下面随着我来一起学习吧。

四、版本冲突

       至此为止,lipengfei和wangqiang两个人,他们本地目录中的version全是9,lipengfei和wangqiang两人本地的工作目录的内容,和SVN代码库中的内容,一模一样的。

1、lipengfei在本地修改hello.txt

  一步一步搭建Svn服务之TortoiseSVN日常操作_版本管理

2、lipengfei做SVN Commit

一步一步搭建Svn服务之TortoiseSVN日常操作_git_02一步一步搭建Svn服务之TortoiseSVN日常操作_apache_03一步一步搭建Svn服务之TortoiseSVN日常操作_java_04

3、wangqiang在本地修改hello.txt

一步一步搭建Svn服务之TortoiseSVN日常操作_git_05

4、wangqiang做SVN Commit

一步一步搭建Svn服务之TortoiseSVN日常操作_版本管理_06一步一步搭建Svn服务之TortoiseSVN日常操作_svn_07一步一步搭建Svn服务之TortoiseSVN日常操作_版本管理_08

一步一步搭建Svn服务之TortoiseSVN日常操作_git_09一步一步搭建Svn服务之TortoiseSVN日常操作_版本管理_10

查看wangqiang本地目录

一步一步搭建Svn服务之TortoiseSVN日常操作_版本管理_11

       为什么会产生冲突代码呢?原因很简单就是因为不同的人,同时修改了同一个文件的同一个地方,这时候,他提交了,我没有提交,我就提交不了,这个时候我们要进行先更新,然后在进行提交即可,那如果产生冲突,会生成如上的一些文件。

hello.txt.mine文件:是冲突前自己的文件

hello.txt.r9文件:是冲突前本地的版本文件

hello.txt.r10文件:是别人赶在你之前提交的版本


查看hello.txt

一步一步搭建Svn服务之TortoiseSVN日常操作_java_12

上面内容说明:

<<<<<<<<.mine

这一块是你自己的代码 r.9

=======

别人与你冲突的代码部分

>>>>>>> r.10


       上面的内容,不可能直接提交上去,这是SVN给你的提示,这不单纯是你编写的代码。当前这种情况,有2种解决办法:

4.1、解决冲突方法1

一步一步搭建Svn服务之TortoiseSVN日常操作_java_13一步一步搭建Svn服务之TortoiseSVN日常操作_git_14

一步一步搭建Svn服务之TortoiseSVN日常操作_apache_15

       此处代码的处理,就需要人为参与了,看看代码是保留哪些代码为准。假设我取两面的内容,全保留下来。

一步一步搭建Svn服务之TortoiseSVN日常操作_git_16一步一步搭建Svn服务之TortoiseSVN日常操作_git_17一步一步搭建Svn服务之TortoiseSVN日常操作_apache_18

查看SVN中代码库

一步一步搭建Svn服务之TortoiseSVN日常操作_java_19

一步一步搭建Svn服务之TortoiseSVN日常操作_svn_20

查看lipengfei用户本地工作目录文件

一步一步搭建Svn服务之TortoiseSVN日常操作_apache_21

       发现lipengfei本地目录中的文件,内容还是旧的,没有和SVN同步。在lipengfei本地目录中,做SVN Update操作。

一步一步搭建Svn服务之TortoiseSVN日常操作_git_22一步一步搭建Svn服务之TortoiseSVN日常操作_apache_23

现在lipengfei本地目录中的version也是11了,查看本地目录中文件

一步一步搭建Svn服务之TortoiseSVN日常操作_java_24

       可以看出来,当前这种解决冲突方法,就是人为的参与,和冲突的同事商量,保留哪些代码。

4.2、解决冲突方法2

       使用revert(回滚)操作

一步一步搭建Svn服务之TortoiseSVN日常操作_svn_25

       该操作表示用户放弃自己的更新代码,然后直接提交,这个时候你的代码就会是服务器上最新的代码,即以同事提交的新代码为准,你的代码不会被提交,直接放弃你的修改了。

一步一步搭建Svn服务之TortoiseSVN日常操作_apache_26

一步一步搭建Svn服务之TortoiseSVN日常操作_apache_27

一步一步搭建Svn服务之TortoiseSVN日常操作_java_28

       点击ok按钮后 可以看到其他三个文件都自动删掉了

5、解决冲突的选择

(1)、放弃自己的更新,使用svn revert回滚,然后提交。在这种方式下不需要使用svn resolved解决。

(2)、放弃自己的更新,使用别人的更新。使用最新获取的版本覆盖目标文件,执行resolved filename并提交(选择文件--->右键--->解决)

(3)、手动解决:冲突发生时,通过和其它用户沟通后,手动更新目标文件。然后resolved filename并来解决冲突,最后提交。

6、降低冲突解决的复杂度

(1)、当文档编辑完成后,尽快提交,频繁的提交/更新,可以降低在冲突生的概率,以及发生时解决冲突的复杂度。

(2)、在提交时,写上明确的注释,方便以后查找用户更新的原因,毕竟随着时间的推移,对当初的更新原因,可能会有遗忘。

(3)、养成良好的使用习惯,使用SVN时每次都是先提交,后更新。每天早上打开后,首先要从版本库获取最新版本。每天下班前,必须将已经编辑过的文档,都提交到版本库中。


7、大白话版本冲突总结

       在上面演示的冲突案例,它是我们工作中最常见的,多个同事修改了同时修改同一个文件。为了防止冲突,可以增加Commit代码的频率。不要你写了一整天代码,都不Commit一次。

       假如你一天没提交,马上下班了,你一提交,发现有几十个冲突,一下子死的心都有了。假设你有30个文件冲突,你提交了30次,冲突了30次。但是你每一次,只有一个文件冲突,你每一次解决一个文件冲突,你要解决30次。这可和你一次解决30个冲突文件,不一样的。

       而且冲突的情况,一般都是后Commit的人产生冲突。所以日后编程,可以增加Commit的频率,但也不要是你每写一行代码,就Commit一次。通过是每1-2小时提供一次,或者写完一个小功能,提交一次。

       不要一天只提交一次,除非这个项目就是你一个人在开发,你可以这样玩。因为就是你一个人在开发,没有别人会和你冲突。其实也会有冲突的情况,就是后面的版本和前面的版本,也会产生冲突。

五、版本回滚

       最近一次代码提交使版本更新到10,测试组发来消息10版本有问题。就在此时,你的老板要求现在要对外发布一个产品版本,问这种情况该怎么办?

打脸解决不了问题,正确的操作是回滚生产分支到9版本。

1、使用版本log功能回滚

1.1、CheckOut最新版本到本地

       

一步一步搭建Svn服务之TortoiseSVN日常操作_apache_29

可以看了当前SVN的最新version是9

1.2、Show log操作

       执行TortoiseSVN的Show log操作,在新签出的文件夹上右键,TortoiseSVN -> Show log, 如下图:

一步一步搭建Svn服务之TortoiseSVN日常操作_apache_30

一步一步搭建Svn服务之TortoiseSVN日常操作_java_31

1.3、回滚

   SVN有2种类型的回滚:Revert to this revision和Revert chages from these revision。

       我现在这个项目在SVN上,有九个版本,版本号是1,2,3,4,5,6,7,8,9。

1.3.1、Revert to this revision

       直接回滚到某个旧的版本,这个版本之后的变更都会被删除。比如:如果是在版本7这里点击"Revert to this revision",表示8~9的修改全部作废,回退到了版本7那个结果。

       查看本地当前当前工作目录

一步一步搭建Svn服务之TortoiseSVN日常操作_版本管理_32

       查看SQLQuery1.sql

一步一步搭建Svn服务之TortoiseSVN日常操作_版本管理_33

       通过浏览器,查看历史记录的详细


一步一步搭建Svn服务之TortoiseSVN日常操作_git_34一步一步搭建Svn服务之TortoiseSVN日常操作_java_35一步一步搭建Svn服务之TortoiseSVN日常操作_版本管理_36

Revert to this revision操作

一步一步搭建Svn服务之TortoiseSVN日常操作_apache_37

一步一步搭建Svn服务之TortoiseSVN日常操作_版本管理_38

一步一步搭建Svn服务之TortoiseSVN日常操作_apache_39一步一步搭建Svn服务之TortoiseSVN日常操作_git_40

一步一步搭建Svn服务之TortoiseSVN日常操作_apache_41

       查看本地工作目录

一步一步搭建Svn服务之TortoiseSVN日常操作_git_42

       查看SQLQuery1.sql文件内容

一步一步搭建Svn服务之TortoiseSVN日常操作_svn_43

1.3.2、Revert chages from these revision

       删除中间的几个版本 (假如提交错误了,也可以使用这个方法删掉)。比如:如果是在版本7这里点击"Revert changes from this revision",表示版本7这个历史事件被消除了,只剩下除版本7外的8个历史操作了。

Revert changes from this revision 单个版本操作

一步一步搭建Svn服务之TortoiseSVN日常操作_svn_44

一步一步搭建Svn服务之TortoiseSVN日常操作_git_45

       Revert changes from these revisions多个版本操作

一步一步搭建Svn服务之TortoiseSVN日常操作_svn_46

一步一步搭建Svn服务之TortoiseSVN日常操作_java_47

       如果同时选择6,7,8 Revert changes from these revisions那么6、7、8这3个版本的所做的修改都会被消除。

1.4、确认提交

       这是最后一步,也是最重要的一步。前面的操作,都只是在本地电脑上进行的操作,必须要做SVN Commit后才能真正提交到SVN服务器。

2、使用merge功能

2.0、查看本地工作目录中文件内容

一步一步搭建Svn服务之TortoiseSVN日常操作_apache_48

2.1、右击需要回滚的文件或文件夹,选择 TortoiseSVN → Merge

一步一步搭建Svn服务之TortoiseSVN日常操作_apache_49

2.2、在Merge Type 对话框中选择Merge a range of revisions

一步一步搭建Svn服务之TortoiseSVN日常操作_java_50

2.3、在From字段输入仓库的url路径,一般默认就行

一步一步搭建Svn服务之TortoiseSVN日常操作_git_51

2.4、在Revision range to merge 字段输入回滚的版本列表(或者使用log对话框选择)一步一步搭建Svn服务之TortoiseSVN日常操作_git_52

2.5、确认Reverse merge选项被勾选上

一步一步搭建Svn服务之TortoiseSVN日常操作_git_53

2.6、在Merge option对话框上接受默认配置

一步一步搭建Svn服务之TortoiseSVN日常操作_apache_54

一步一步搭建Svn服务之TortoiseSVN日常操作_svn_55

2.7、单击Merge完成合并。

一步一步搭建Svn服务之TortoiseSVN日常操作_git_56

2.8、查看本地工作目录中文件内容

一步一步搭建Svn服务之TortoiseSVN日常操作_svn_57

3、总结

(1)、上面的回滚操作,主要叙述了修改已经提交,需要roll back版本的情况。如果修改没有commit,请直接revert即可。

(2)、如果你回滚操作后,发现本地操作的过程中有失误。把本地的代码删除,再从SVN中下载一份,重新修改即可。

(3)、回滚的操作,都只是在本地电脑上进行的操作,必须要commit后才能真正提交到SVN服务器。

(4)、TortoiseSVN绝不会丢弃数据,所以那些被回滚的版本仍然以中间版本的形式被保留在版本库里。只是最新版本已经回到了以前的状态。

六、主干分支操作

项目中为何要创建分支及合并?

       假如我现在项目所有的文件放在主干上(trunk)中,由于需求的变更,需要增加新的需求,但是我们主干上还要继续往下开发,在此我们可以新建一个分支,来做增加新的需求那一块,主干上继续开发,等分支上代码没有问题的时候,再合并到主干上来。创建分支的最大的目的就是跟主线进行并行开发时候不影响主线的开发。

1、前期准备工作

1.1、在服务器上创建好目录

一步一步搭建Svn服务之TortoiseSVN日常操作_apache_58

此处我的项目名叫DataX,提示此项目文件夹中包含3个子目录:

       trunk:主干,一般把项目提交到此文件夹里面,在trunk中开发。

       branches:分支,一般把那些需要打分支,但是有可能会修改的项目代码,打分支到此目录。

       tags:分支,一般把那些阶段性(如迭代各期)的项目代码,打分支到此目录。

一步一步搭建Svn服务之TortoiseSVN日常操作_apache_59

一步一步搭建Svn服务之TortoiseSVN日常操作_svn_60

1.2、把本地项目代码导入到trunk

       来到你本地的workspace,找到你的项目

一步一步搭建Svn服务之TortoiseSVN日常操作_svn_61一步一步搭建Svn服务之TortoiseSVN日常操作_apache_62

一步一步搭建Svn服务之TortoiseSVN日常操作_java_63

       查看SVN上的目录情况

一步一步搭建Svn服务之TortoiseSVN日常操作_git_64

2、提取主干代码到本地

       在本地工作目录中,创建2个目录:trunk和branch目录

一步一步搭建Svn服务之TortoiseSVN日常操作_apache_65

       进入到本地的trunk目录,右键SVN Checkout操作

一步一步搭建Svn服务之TortoiseSVN日常操作_svn_66

一步一步搭建Svn服务之TortoiseSVN日常操作_版本管理_67

一步一步搭建Svn服务之TortoiseSVN日常操作_版本管理_68

       查看本地目录

一步一步搭建Svn服务之TortoiseSVN日常操作_git_69

一步一步搭建Svn服务之TortoiseSVN日常操作_版本管理_70

3、在SVN服务上生成分支代码

       利用本地主干上的代码,给SVN服务端创建分支,操作如下:

一步一步搭建Svn服务之TortoiseSVN日常操作_java_71一步一步搭建Svn服务之TortoiseSVN日常操作_git_72

       查看SVN服务端代码,分支目录代码

一步一步搭建Svn服务之TortoiseSVN日常操作_java_73

4、提取分支代码到本地

       进入到本地的branch目录,右键SVN Checkout操作

一步一步搭建Svn服务之TortoiseSVN日常操作_svn_74

一步一步搭建Svn服务之TortoiseSVN日常操作_java_75

一步一步搭建Svn服务之TortoiseSVN日常操作_svn_76

       查看本地目录

一步一步搭建Svn服务之TortoiseSVN日常操作_apache_77

一步一步搭建Svn服务之TortoiseSVN日常操作_git_78

       分支建立在svn的服务端,如果有其他同事对SVN上的分支代码更新了,本地branch文件夹中 右键-->SVN Update即可,就可以更新到分支代码。

一步一步搭建Svn服务之TortoiseSVN日常操作_版本管理_79一步一步搭建Svn服务之TortoiseSVN日常操作_版本管理_80

5、合并分支到主干上

       我现在对branch分支上新增lipengfei.txt文件,然后提交到SVN上去。

一步一步搭建Svn服务之TortoiseSVN日常操作_java_81

一步一步搭建Svn服务之TortoiseSVN日常操作_svn_82一步一步搭建Svn服务之TortoiseSVN日常操作_apache_83一步一步搭建Svn服务之TortoiseSVN日常操作_apache_84

       查看SVN端分支目录情况

一步一步搭建Svn服务之TortoiseSVN日常操作_svn_85

       查看SVN端主干目录情况

一步一步搭建Svn服务之TortoiseSVN日常操作_版本管理_86

       现在想把分支上新创建的lipengfei.txt,合并到主干上。

       回到本地工作目录中的,鼠标右键trunk文件夹 --> Tortoise SVN --> Merge 如下步骤:

一步一步搭建Svn服务之TortoiseSVN日常操作_java_87

一步一步搭建Svn服务之TortoiseSVN日常操作_svn_88一步一步搭建Svn服务之TortoiseSVN日常操作_apache_89

一步一步搭建Svn服务之TortoiseSVN日常操作_java_90一步一步搭建Svn服务之TortoiseSVN日常操作_git_91

       查看SVN端主干代码目录,并没有在分支中新创建的lipengfei.txt

一步一步搭建Svn服务之TortoiseSVN日常操作_svn_92

       查看本地工作目录

一步一步搭建Svn服务之TortoiseSVN日常操作_git_93

一步一步搭建Svn服务之TortoiseSVN日常操作_版本管理_94

       就可以看到本地trunk文件夹中多了一个lipengfei.txt,就是从分支上合并过来的,它的图标是蓝色+号:说明lipengfei.txt已经被计划加入到版本控制中。

       在本地trunk文件夹中,把lipengfei.txt提交到SVN的主干代码目录中。

一步一步搭建Svn服务之TortoiseSVN日常操作_java_95一步一步搭建Svn服务之TortoiseSVN日常操作_java_96一步一步搭建Svn服务之TortoiseSVN日常操作_git_97

       查看SVN端主干代码目录,在分支中新创建的lipengfei.txt已经有了一步一步搭建Svn服务之TortoiseSVN日常操作_svn_98

6、合并主干到分支

       如果主干上有一些更新,那么这些要更新到分支上去。在主干上新建一个lipengfei_new.txt文件,然后提交到SVN上去。

一步一步搭建Svn服务之TortoiseSVN日常操作_java_99

一步一步搭建Svn服务之TortoiseSVN日常操作_java_100一步一步搭建Svn服务之TortoiseSVN日常操作_java_101一步一步搭建Svn服务之TortoiseSVN日常操作_版本管理_102

       查看SVN端主干目录情况

一步一步搭建Svn服务之TortoiseSVN日常操作_java_103

       查看SVN端分支目录情况

一步一步搭建Svn服务之TortoiseSVN日常操作_git_104

       现在是想把主干上新创建的lipengfei_new.txt,合并到分支上。

       回到本地工作目录中的,鼠标右键branch文件夹 --> Tortoise SVN --> Merge 如下步骤:

一步一步搭建Svn服务之TortoiseSVN日常操作_版本管理_105

一步一步搭建Svn服务之TortoiseSVN日常操作_apache_106一步一步搭建Svn服务之TortoiseSVN日常操作_版本管理_107

一步一步搭建Svn服务之TortoiseSVN日常操作_java_108一步一步搭建Svn服务之TortoiseSVN日常操作_java_109

       查看SVN端分支代码目录,并没有在主干中新创建的lipengfei_new.txt一步一步搭建Svn服务之TortoiseSVN日常操作_apache_110

       查看本地工作目录

一步一步搭建Svn服务之TortoiseSVN日常操作_版本管理_111

一步一步搭建Svn服务之TortoiseSVN日常操作_svn_112

       就可以看到本地branch文件夹中多了一个lipengfei_new.txt,就是从主干上合并过来的,它的图标是蓝色+号:说明lipengfei_new.txt已经被计划加入到版本控制中。

       在本地branch文件夹中,把lipengfei_new.txt提交到SVN的分支代码目录中。

一步一步搭建Svn服务之TortoiseSVN日常操作_版本管理_113一步一步搭建Svn服务之TortoiseSVN日常操作_版本管理_114一步一步搭建Svn服务之TortoiseSVN日常操作_apache_115

       查看SVN端分支代码目录,在主干中新创建的lipengfei_new.txt已经有了一步一步搭建Svn服务之TortoiseSVN日常操作_java_116

       至此,客户端TortoiseSVN的日常操作,就操作演示完毕了,作为潜力股的你,一定可以在日常的工作中上手SVN了。但是由于时间紧,此处主干和分支操作讲得不太详细,后面我还会分享一篇关于主干和分支的详细讲解,欢迎继续关注我!!!