2.4 使用TortoiseMerge查看文件差异与合并
在章节2.2中可以发现,使用SVN时会出现版本冲突,更加细致的处理版本冲突可以使用TortoiseMerge工具来进行处理。
使用SVN时每一次提交都在SVN服务端进行记录,所以可以在Commit界面中双击文件来查看文件版本变更的差异。
查看文件的差异使用的是TortoiseMerge工具。它主要的用途是:
- 察看两个文件的差异,合并它们,或者删除不想要的修改。
- 编辑本地修改和修正版本库之间的冲突。
- 应用补丁Patch
2.4.1 图标加号
代码差异的显示在TortoiseMerge工具中使用图标来进行标识,所以后面的章节将一一为大家进行介绍。
Step01:在进行实验之前,首先创建一个实验用的仓库f,在该仓库中执行如下的步骤,来体会一下TortoiseMerge工具是如何查看文件的差异:
Step02:在桌面创建文件夹f_data,并在该文件中创建文件f.txt,该文件默认的内容是空,如图2.41所示。
图2.41 内容为空的文件
Step03:将文件夹f_data导入Import到f仓库中。
Step04:再将仓库f中的所有内容Checkout到桌面的f_checkout文件夹,并编辑f.txt内容如图2.42所示。
图2.42 编辑f.txt内容为12
光标在字符2后面。
Step05:将最新版的数据Commit提交到仓库f中,单击Commit菜单时在弹出的界面中双击f.txt文件,如图2.43所示。
图2.43 TortoiseMerge工具首次出现
TortoiseMerge工具默认情况下分为左右2个窗口,左窗口显示SVN服务器中最新的数据,因为标题是“Working Base”,右窗口显示本地最新版本的数据,也就是SVN服务器中仓库的工作复本,标题为“Working Copy”。
Step06:在右窗口中的第1行出现加号图标,代表本地复本文件与SVN服务器中的文件进行比较后,发现在第1行里加了一些内容。
Step07:继续操作,将文件f.txt提交到仓库f中去。
2.4.2 图标减号
继续前面章节的操作。
Step01:再次编辑f_checkout文件夹中的f.txt文件,内容如图2.44所示。
图2.44 编辑f.txt内容为添加字符34
Step02:将最新版的数据Commit提交到仓库f中,单击Commit菜单时在弹出的界面中双击f.txt文件,如图2.45所示。
图2.45 减加号图标出现
左侧窗口中出现减号图标说明与右侧窗口中的内容相比在第1行上被删除了一些内容,由于TortoiseMerge工具默认是以行为单位来进行比对,所以在左边窗口中会出现
减号的图标。
右侧窗口中出现加号图标说明与左侧窗口中的内容相比在第1行上加入了一些内容。
Step03:继续操作,将最新版的数据Commit提交到仓库f中。
2.4.3 图标等号
Step01:再一次编辑f.txt内容如图2.46所示。
图2.46 对f.txt文件添加回
Step02:将最新版的数据Commit提交到仓库f中,单击Commit菜单时在弹出的界面中双击f.txt文件,如图2.47所示。
图2.47 出现等号
左侧和右侧窗口中都出现了等号图标,说明在1234字符后面加入回车并不认为文档被更改了。
Step03:继续操作,将最新版的数据Commit提交到仓库f中。
Step04:继续更改f.txt文件内容如图2.48所示。
图2.48 在f.txt中的第2行添加文本
Step05:将最新版的数据Commit提交到仓库f中,单击Commit菜单时在弹出的界面中双击f.txt文件,如图2.49所示。
图2.49 还是仅仅添加了新的文本并没有出现删除的情况
Step06:继续操作,将最新版的数据Commit提交到仓库f中。
2.4.4 图标铅笔
出现铅笔图标,代表此行已经使用TortoiseMerge作为文本编辑器进行了手工修改。
Step01:继续编辑f_checkout文件夹中的f.txt文件内容如图2.50所示。
图2.50 加入+加号字符
Step02:对f_checkout文件夹执行Commit操作,然后在TortoiseMerge工具中手动删除+加号,然后在字符5678后面再输入!叹号,如图2.51所示。
图2.51 直接编辑出现铅笔图标
Step03:并单击左上角的Save保存按钮后再对文件f.txt执行Commit命令提交到SVN服务器中。
2.4.5 图标灰色实心圆
Step01:继续编辑f.txt内容,添加一个空格,效果如图2.52所示。
图2.52 添加一个空格
Step02:将最新版的数据Commit提交到仓库f中,单击Commit菜单时在弹出的界面中双击f.txt文件,如图2.53所示。
图2.53 出现灰色实心圆图标
左右窗口分别出现灰色实心圆图标,代表第2行仅仅添加了空格,并没有添加或删除其它的字符。
Step03:继续操作,将最新版的数据Commit提交到仓库f中,仓库中的f.txt文件也有了空格,效果如图2.54所示。
图2.54 叹号!后面有空格字符
2.4.6 同时出现图标减号和加号
的情况
首先声明一下TortoiseMerge是基于行的版本差异和合并的软件,所以它判断有差异的情况也是基于行,也就是说判断差异的最小单位是以“行”计算的。
Step01:把仓库f中的所有内容进行清空,删除桌面f_checkout文件中的所有内容,包括.svn文件夹。
Step02:编辑f_data文件夹中f.txt文件的内容如图2.55所示。
图2.55 文件f.txt内容有初始默认值
Step03:将f_data文件夹Import导入到f仓库中,再把f仓库中的所有内容Checkout到桌面的f_checkout文件夹中,并编辑f.txt内容如图2.56所示。
图2.56 对文件f.txt内容进行添加456字符
Step04:将最新版的数据Commit提交到仓库f中,单击Commit菜单时在弹出的界面中双击f.txt文件,如图2.57所示。
图2.57 左减号右加号
前面介绍过,TortoiseMerge是基于行的版本差异和合并的软件,所以在旧内容123的基础上添加456字符,TortoiseMerge认为是将“Working Base”中的第1行全部删除了,然后又在“Working Copy”中添加了“123456”字符,这时就会出现左减号右加号的效果。
2.4.7 有默认值无空行的情况
Step01:再一次把仓库f中的所有内容进行清空,删除桌面f_checkout文件中的所有内容,包括.svn文件夹。
Step02:编辑f_data文件夹中的f.txt内容如图2.58所示。
图2.58 光标在3的后面无空行
Step03:将f_data文件夹Import导入到f仓库中,再把f仓库中的所有内容Checkout到桌面的f_checkout文件夹中,并编辑f.txt内容如图2.59所示。
图2.59 对文件f.txt内容进行添加45字符无空行
Step04:将最新版的数据Commit提交到仓库f中,单击Commit菜单时在弹出的界面中双击f.txt文件,如图2.60所示。
图2.60 出现等号和加号
等号代表第3行虽然加入了回车,但并不认为内容被更改,而4和5却是真正新添加的字符,所以出现了加号。
2.4.8 有默认值有空行的情况
Step01:再一次把仓库f中的所有内容进行清空,删除桌面f_checkout文件中的所有内容,包括.svn文件夹。
Step02:编辑f_data文件夹中的f.txt内容如图2.61所示。
图2.61 有空行的情况
Step03:将f_data文件夹Import导入到f仓库中,再把f仓库中的所有内容Checkout到桌面的f_checkout文件夹中,并编辑f.txt内容如图2.62所示。
图2.62 对文件f.txt内容进行添加45字符有空行
Step04:将最新版的数据Commit提交到仓库f中,单击Commit菜单时在弹出的界面中双击f.txt文件,如图2.63所示。
图2.63 只出现了加号
仅仅新添加了字符4和5,所以只显示出了加号。
2.4.9 图标冲突
有时当更新Update或提交Commit仓库时会有冲突,冲突产生于两人都修改文件的某一部分,解决冲突只能靠人而不是机器。
图标代表文件有冲突,为了验证在出现文件冲突时此图标会显示出来。
Step01:创建名称为g的仓库,并且在桌面创建文件夹g_data,在其内部创建g.txt文件,初始内容是begin,如图2.64所示。
图2.64 创建仓库g和g_data文件夹及文本文件
Step02:对g_data文件执行Import菜单命令,将文件g.txt导入到仓库g中。
Step03:在桌面创建2个文件夹g_checkout1和g_checkout2,分别对仓库g执行Checkout操作到这2个文件夹中,并更改g_checkout1文件中的g.txt内容如图2.65所示。
图2.65 添加1
Step04:对文件夹g_checkout1执行Commit操作。
Step05:编辑g_checkout2文件夹中的g.txt文件内容如图2.66所示。
图2.66 添加2
Step06:对g_checkout2文件夹执行Commit操作时出现异常如图2.67所示。
图2.67 版本过期
Step07:单击OK按钮弹出界面如图2.68所示。
图2.68 询问是否Update更新
单击Cancel取消更新,再在Commit界面中单击Cancel按钮取消Commit操作。
如何解决这样的冲突情况呢?
Step08:对文件夹g_checkout2执行Update菜单,目的是与SVN服务器中的内容进行同步,弹出界面如图2.69所示。
图2.69 成功发现有冲突的情况
Step09:单击OK按钮关闭窗口。
Step10:再对文件夹g_checkout2执行Commit菜单,弹出界面如图2.70所示。
图2.70 Commit时出现冲突提示
Step11:双击g.txt文件再次弹出TortoiseMerge软件,如图2.71所示。
图2.71 出现冲突图标
在界面中出现3个窗口,左上角窗口代表其它人的代码与SVN服务器中的代码进行对比的结果,而右上角窗口代表现在我的代码与SVN服务器中的代码进行对比的结果,而底部窗口是尝试解决冲突的输出文件。
Step12:手动更改下方窗口中的文本内容如图2.72所示。
图2.72 手动更改冲突
Step13:更改完成后单击左上角的Save按钮进行保存,再单击按钮代表此冲突用手动的方式得以解决。
Step14:关闭TortoiseMerge软件界面后显示Commit界面中的内容如图2.73所示。
图2.73 冲突得到解决,字体变成蓝色
Step15:单击OK按钮进行Commit提交,仓库g中的g.txt内容如图2.74所示。
图2.74 人工解决了冲突问题
2.4.10 可以直接单击冲突界面中的Update按钮
在Commit提交时如果出现文件超时时会出现提示界面如图2.75所示。
图2.75 单击Update按钮
可以直接单击Update按钮来告诉SVN服务器已经有文件发生冲突,单击Update后的界面如图2.76所示。
图2.76 文件发生冲突
单击OK按钮关闭提示,再对Checkout文件夹执行Commit时出现界面如图2.77所示。
图2.77 提示冲突可以使用merge工具进行解决