3.4 冲突的解决办法
在前面的章节中,如果发生冲突可以使用TortoiseMerge工具来手动编辑文件去解决这个冲突,其实还有多种办法也可以解决冲突。
Step01:将模板仓库a导出Checkout到桌面test1和test2文件夹中,查看一下这2个文件夹的属性信息如图3.93所示。
图3.93 文件夹test1和test2的属性信息
Step02:在test2文件夹中编辑a.txt文件,如图3.94所示。
图3.94 编辑test2文件夹中的a.txt文件
Step03:再将test2进行Commit提交操作,结果如图3.95所示。
图3.95 将test2文件夹进行提交
Step04:提交后的test2文件夹中的a.txt的属性信息如图3.96所示。
图3.96 文件a.txt的属性信息
提交后的test2文件夹中的a.txt的revision值为5。
Step05:继续查看一下编辑前的test1文件夹中的a.txt属性如图3.97所示。
图3.97 文件夹test1中的a.txt属性信息
文件夹test1中的a.txt的revision版本号是4。
Step06:这时编辑test1文件夹中的a.txt文件内容如图3.98所示。
图3.98 编辑test1中的a.txt文件内容
Step07:到这步骤,一定要把test1工作副本进行备份,如图3.99所示。
图3.99 将test1工作副本备份到新建文件夹
Step08:当对桌面路径中的test1文件夹执行Commit提交菜单时,出现错误如图3.100所示。
图3.100 提交test1文件夹时出现错误
Step09:从出错信息中可以看到,有文件发生了超时out of date。单击OK按钮后弹出界面如图3.101所示。
图3.101 是否更新test1工作副本的状态
在此界面中的2个按钮“Update”和“Cancel”就是两个分支了。
Step10:在单击“Update”或“Cancel”按钮前先来查看一下test1文件夹中的a.txt文件的revision版本号,如图3.102所示。
图3.102 单击按钮前test1文件夹中的a.txt版本号为4
Step11:这时单击“Update”按钮,出现界面如图3.103所示。
图3.103 工作副本和仓库内容有冲突
Step12:再来查看一下test1文件夹中的a.txt文件的版本号如图3.104所示。
图3.104 发生了冲突并且revision更新至5
通过此步骤可以说明单击“Update”按钮可以改变revision的值,但冲突还是存在。
在前面的章节中是通过TortoiseMerge工具来解决冲突,还有其它办法也可以解决。
3.4.1 使用Revert菜单解决
Step01:解决这个冲突可以使用“Revert”菜单,如图3.105所示。
图3.105 使用Revert菜单来解决冲突
Step02:在继续操作之前,先要知道当前test1文件夹中的a.txt的revision版本号是5。
Step03:单击Revert菜单后弹出界面如图3.106所示。
图3.106 冲突文件列表
Step04:在此列表中可以双击a.txt文件,来打开TortoiseMerge来手动解决冲突,如图3.107所示。
图3.107 使用TortoiseMerge来手动解决冲突
Step05:也可以在“图3.4.1 冲突文件列表”中对a.txt文件复选,如图3.108所示,再单击OK按钮使用revision值是5的版本内容,也就是test1文件夹中的a.txt文件与仓库a中的a.txt文件内容一致。
图3.108 对文件a.txt复选
Step06:单击OK按钮后还原并更新到最新版成功,如图3.109所示。
图3.109 还原并更新到最新版成功
Step07:文件夹test1中的a.txt文件内容及revision版本如图3.110所示。
图3.110 文件夹test1中的内容与仓库a中的内容一致并且revision是5最新版
上面的步骤是在界面图3.111中单击“Update”按钮的分支走向,此走向改变了test1文件夹中的a.txt文件的revision版本号为5。
图3.111 分支按钮Update与Cancel
Step08:那如果单击“Cancel”按钮会出现什么样的效果呢?
将桌面test1文件夹彻底删除,将刚才“新建文件夹”文件夹中呈冲突状态的test1文件夹复制到桌面中,而test1文件夹的a.txt内容如图3.112所示。
图3.112 回顾一下test1中a.txt文件内容
Step09:这时当对桌面的test1文件夹执行Commit时还会出现界面如图3.113所示。
图3.113 继续Commit时发生冲突
Step10:单击OK按钮后弹出分支界面如图3.114所示。
图3.114 按钮Update与Cancel分支界面
Step11:先不单击这2个按钮中的任何一个,查看一下test1中的a.txt文件的版本号如图3.115所示。
图3.115 再次查看revision值为4
Step12:在此步骤中,不再单击“Update”按钮,转而单击“Cancel”按钮,这时又将Commit界面进行弹出如图3.116所示。
图3.116 界面Commit被还原显示了
Step13:单击Commit界面中的Cancel按钮关闭Commit窗口。再次查看test1中的a.txt文件版本号如图3.117所示。
图3.117 单击分支按钮Cancel不改变revision版本号
Step14:对test1文件夹调用revert菜单如图3.118所示。
图3.118 对test1文件夹调用revert菜单
Step15:弹出界面如图3.119所示。
图3.119 将a.txt复选处理
Step16:单击OK按钮后将test1文件夹中的a.txt还原到改变前的版本,如图3.120所示。
图3.120 还原到revision值为4的版本内容
通过此实验可以得知revert菜单的作用要根据当前发生冲突文件的revision版本号来决定还原到哪个revision版本中,菜单revert的主要作用就是还原。
3.4.2 使用Resolved菜单解决
Step01:将桌面的test1文件夹删除,将“新建文件夹”中的test1再复制到桌面中,此时对test1文件夹执行Commit提交菜单后出现超时界面,再单击“Update”按钮将test1的revision版本更新到5,如图3.121所示。
图3.121 文件夹test1中的a.txt的revision是5而且状态为冲突
Step02:这时可以单击“Resolved”菜单如图3.122所示。
图3.122 单击Resolved菜单
Step03:弹出界面如图3.123所示。
图3.123 欲对a.txt解决冲突
Step04:从图中可以发现a.txt呈冲突的状态,而且桌面中的test1文件夹的内容如图3.124所示。
图3.124 桌面test1文件夹中多了几个文件
先来查看一下a.txt中的内容如下:
<<<<<<< .mine
a_3
1=======
a_3
2>>>>>>> .r5
在文本文件中<<<<<<< .mine后面的内容是当前的内容,而=======后面的内容是revision值是5的内容,他们都修改了第2行,所以发生了冲突。
再来查看一下a.txt.mine的内容如下:
a_3
1
也就是当前a.txt的内容。
再来查看一下a.txt.r4的内容如下:
a_3
也就是revision值为4的a.txt内容。
再来查看一下a.txt.r5的内容如下:
a_3
2
也就是revision值为5的a.txt内容。
TortoiseSVN产生出这么多文件就是为了便于程序员解决这个冲突,所以要保留旧的和新的文件内容。
Step05:继续解决冲突,在图3.123界面双击a.txt文件,启动TortoiseMerge手动解决冲突,如图3.125所示。
图3.125 手动解决冲突
Step06:解决之后单击TortoiseMerge工具左上角的save保存按钮,再单击一下解决冲突按钮。当回到图3.126所示界面中单击OK按钮后,冲突得以解决如图3.127所示。
图3.126 显示Resolve窗口
图3.127 成功解决冲突
并且桌面的test1文件夹中的多余的文件被删除,当前的revision版本号为5,状态不是冲突了,而是修改modified状态,如图3.128所示。
图3.128 删除多余文件而不呈冲突状态
Step07:当对test1文件夹执行Commit提交菜单时,成功提交进仓库a中,如图3.129所示。
图3.129 成功提交revision值是6
3.5 获得锁与释放锁
SVN版本控制一直在推崇“复制-修改-合并”的方法,在这种情况下Subversion通常不需要锁就可以很好的工作,但是,在某些情况下可能还是需要使用锁定策略,比如在一个平面设计公司使用图形文件,图形文件属于二进制的文件,是不能合并的文件,如果两个人修改同一个文件,合并是不可能的,在这种情况下,就必须放弃其中一个人的修改。
Step01:添加2个用户ghy及newghy,在本测试中将实验锁定文件的效果。
Step02:使用http://localhost:7070/svn/a路径访问仓库,并用ghy用户将仓库a导出Checkout到桌面locktest1文件夹中,再使用newghy用户将仓库a导出Checkout到桌面locktest2文件夹中。
Step03:对桌面locktest1文件夹进行锁定的操作,操作菜单如图3.130所示。
图3.130 对locktest1文件夹执行锁定
Step04:弹出界面如图3.131所示。
图3.131 对locktest1文件夹执行锁定的界面配置
Step05:选择所有的文件对它们执行锁定,默认的界面配置即可,直接单击OK按钮,成功锁定如图3.132所示。
图3.132 成功对locktest1文件夹中的文件执行锁定
Step06:对locktest1文件夹调用“Check for modifications”菜单查看一下哪些文件被锁定了,如图3.133所示。
图3.133 查看哪些文件被锁定
Step07:这时对locktest2文件夹中的a.txt文件进行编辑内容如图3.134所示。
图3.134 编辑locktest2文件夹中的a.txt文件
Step08:对locktest2文件夹执行Commit菜单后报错,如图3.135所示。
图3.135 有文件被锁定不能Commit
从图中根据提示可以得知locktest2\a.txt文件被其它人锁定不能提交,这样的效果完全合乎用户ghy所期待的效果,也就是不允许其它人更新自己锁定的文件,保护自己的工作果实。
Step09:继续操作,对locktest1文件夹调用“Release lock”菜单,如图3.136所示。
图3.136 对locktest1文件夹调用Release lock菜单
Step10:弹出界面如图3.137所示。
图3.137 对所有文件执行释放锁操作
Step11:单击OK按钮释放所有文件的锁,这时再对locktest2文件夹执行Commit操作后成功提交,如图3.138所示。
图3.138 将locktest2文件夹中的新内容成功提交
在上面的操作步骤中可以总结出几个情况:
(1)如果locktest1呈锁定文件的状态,并且不更改文件不提交locktest1工作副本时,当locktest2提交时会报错。
(2)如果locktest1呈锁定文件的状态,而更改locktest1文件夹中的内容还将locktest1文件夹中的内容进行提交,这时locktest1中的锁将会自动释放。
3.5.1 偷窃锁的使用
Step01:将桌面的locktest1和locktest2文件夹删除。
Step02:再将仓库a重新Checkout到桌面locktest1和locktest2文件夹中。
Step03:在locktest1文件夹上调用Get lock菜单,使locktest1文件夹获得仓库中所有文件的锁。
Step04:继续更改locktest2文件夹中的a.txt文件内容后再Commit肯定是呈报错的状态,因为其它用户已经将仓库a中的文件进行了锁定,这时如果locktest2还想强制提交该怎么办呢?
Step05:对locktest2文件夹调用Get lock菜单如图3.139。
图3.139 对Steal the locks选项复选
Step06:对Steal the locks选项复选也就是借用locktest1文件夹持有用户的锁,单击OK后用户newghy成功借锁成功,如图3.140所示。
图3.140 newghy成功借锁成功
这时再对locktest2执行Commit提交即可以成功,不会出现异常与错误。
3.6 工作副本的重置
在开发项目时,对工作副本做了N多种改动,想恢复成工作副本原来的状态时可以使用Clean up菜单来进行工作副本的清理,还有因为网络的问题,在工作副本与仓库之间的命令不能得到彻底的执行时,工作副本的状态就不能和仓库进行同步,这时也可以使用Clean up菜单来清理还原这种状态。
调用Clean up菜单后弹出界面如图3.141所示。
图3.141 清理的选项
Step01:使用模板仓库a,将仓库a导出到桌面cleanuptest文件夹。
Step02:向cleanuptest工作副本中复制1个体积较大的文件,如图3.142所示。
图3.142 添加体积为1G大小的exe文件
Step03:下一步对cleanuptest工作副本执行Commit操作,如图3.143所示。
图3.143 正在Commit的进度
Step04:这时按下Ctrl+Alt+Delete键,弹出界面如图3.144所示。
图3.144 在任务管理器中将cleanuptest结束进程
Step05:结束进程是模拟网络情况不好,结束任务成功后再一次对cleanuptest文件夹执行Commit提交任务时出现如图3.145所示界面:
图3.145 不能提交出现异常
这时就需要Clean up菜单来初始化工作副本的状态了。
3.6.1 重置工作副本的状态
Step01:对cleanuptest文件夹执行Clean up菜单,弹出界面配置如图3.146所示。
图3.146 初始化工作副本的状态
Step02:单击OK按钮后弹出界面如图3.147所示。
图3.147 成功初始化工作副本
Step03:这时再对cleanuptest文件夹执行Commit时正确上传了,如图3.148所示。
图3.148 初始化状态后可以正确上传了
3.6.2 还原所有的修改
更改a.txt文件内容如图3.149所示。
图3.149 更改a.txt文件内容
这时如果想还原工作副本原来未修改前的状态时,也可以使用Clean up菜单,对cleanuptest文件夹执行Clean up菜单,弹出界面配置如图3.150所示。
图3.250 还原到未修改前的状态
单击OK后的效果如图3.151所示。
图3.151 成功还原
文件夹cleanuptest中的内容被还原,如图3.152所示。
图3.152 cleanuptest中的内容被还原
3.6.3 删除无版本的文件和文件夹
继续操作,在cleanuptest文件夹中添加1个没有版本信息的txt文件和1个文件夹,效果如图3.153所示。
图3.153 新添加文件及文件夹
当想删除这些没有版本的文件及文件夹时调用Clean up菜单如图3.154所示。
图3.154 删除没有version版本的文件及文件夹
单击OK按钮后的cleanuptest工作副本的内容如图3.155所示。
图3.155 无版本的对象在cleanuptest工作副本中被删除
3.6.4 删除忽略的文件及文件夹和添加忽略资源
Step01:将仓库a删除,重新将模板仓库a复制到svn_repository文件夹中,再将仓库a导出Checkout到桌面atest文件夹中。
Step02:在atest文件夹中创建ghy.o及ghydir文件夹,如图3.156所示。
图3.156 添加txt及文件夹
Step03:对atest文件夹调用Clean up选项如图3.157所示。
图3.157 删除忽略的文件及文件夹
Step04:单击OK后atest文件夹中的内容如图3.158所示。
图3.158 ghy.o文件被删除
Step05:那如果想在当前的工作副本中使ghydir也变成一个忽略的文件夹该如何配置呢?先来配置工作副本的属性,在atest文件夹单击鼠标右键属性菜单中的Subversion选项卡,再单击其中的按钮来弹出配置属性界面,在弹出的界面中单击“Advanced”子菜单,如图3.159所示。
图3.159 单击Advanced菜单
Step06:弹出界面如图3.160所示。
图3.160 配置ghydir文件夹为忽略
Step07:其中选项“Apply property recursively”的作用为是否将当前的配置设置为所有的文件夹,也就是递归设置所有的文件夹中的ghydir子文件夹都为忽略的文件夹,设置完成后单击OK按钮完成设置。
Step08:这时工作副本的属性被更改,如图3.161所示。
图3.161 工作副本属性被更改
Step09:先把工作副本的属性设置Commit到仓库中,在仓库a中应用属性设置,成功Commit后的提示如图3.162所示。
图3.162成功Commit属性设置
Step10:提交后atest文件夹的属性内容如图3.163所示。
图3.163 对文件夹atest添加ghydir为忽略的文件夹
Step11:这时再对atest文件夹调用Clean up菜单,配置如图3.164所示。
图3.164 想要将ghydir忽略掉删除掉
Step12:单击OK按钮后文件夹atest中的内容如图3.165所示。
图3.165 将ghydir文件夹删除了
Step13:上面的步骤是用属性界面添加忽略文件夹ghydir,步骤比较繁琐,其实还有更加方便的操作来实现忽略文件夹的功能,在atest文件夹中创建aa和bb及cc文件夹,如图3.166所示。
图3.166 将aa添加到忽略列表
Step14:用同样的方式将cc也添加到忽略列表,添加完成后atest的属性内容被设置成图3.167所示。
图3.167 文件夹atest有3个忽略的文件夹
Step15:下一步对atest文件夹执行Clean up菜单配置界面如图3.168所示。
图3.168 删除忽略的文件夹及文件
Step16:单击OK后atest中的内容如图3.169所示。
图3.169 仅剩bb文件夹没有被删除
3.6.5 刷新图标
在操作SVN版本控制的过程中,有可能中途出现一些错误,那么图标的状态有可能就会出现混乱,使用选项“Refresh shell overlays”的目的就是将当前工作副本图标的状态进行初始化与重置。
3.6.6 包含引用的项目
如果“Include externals”选项复选,那么上面的选项也应用到引用项目中的文件与文件夹的重置操作。