表格清单
当开发一个项目的时候,无论是只有几个人审察你的代码的开源项目还是包括源代码的商业软件,总有一些人或客户会发现错误或希望改进你的项目。因此,他们发送给你补丁,你需要来审查并决定是否使用它们。
TortoiseMerge 可以帮助你完成以下两件事情:
查看补丁
应用补丁
如果你使用源代码控制系统,并且和其他人共同处理相同文件时,TortoiseMerge也能帮助你挑选出发生了冲突的文件。
TortoiseMerge 是免费的。你不需要为它支付任何费用就可以任意使用。它是在GPL许可协议下开发的。
TortoiseMerge is an Open Source project. That means you have full read access to the source code of this program. You can browse it on this link https://osdn.net/projects/tortoisesvn/scm/svn/. The most recent version (where we're currently working) is located under /trunk/
, and the released versions are located under /tags/
.
TortoiseMerge 是一个免费软件/开源软件。通过它你可以查看文本文件之间的差异,并合并这些差异;甚至审查和采用这些标准差异文件——通常称之为 补丁 。
当处理文本文件时,比如用你所喜欢的编程语言写的源代码,或者 Html/Xml 的文档或网站,你经常会碰到需要比较文件的不同版本的情况:有时候你从别人那里得到了一个不同版本的文件,或者有时候干脆就是你想知道你曾经做过什么修改。
如果你使用版本控制系统(如 Subversion)时,当你更新工作副本时你可能会遇到“ 冲突 ”。这种情况通常发生在其他人也修改了你当前正在处理的文件的同一部分。当遇到冲突时,你必须手工来解决它——这就是 TortoiseMerge 能帮助你的地方。
下图说明了存在冲突的文件之间的关系。
While working on TortoiseSVN we found that whenever users sent in patches to enhance the project or just to fix bugs, we had a lot of work just applying those patches. And many times those patches were outdated and couldn't be applied with the command line patch tool https://unxutils.sourceforge.net/ because we were working on those files and had sometimes changed those files already.
这也是最初的 TortoiseSVN 没有实现
→ 的主要理由:我们期望用户发送给我们整个文件,这样容易打补丁。于是我们花费了大量时间,在互联网搜索打补丁的图形工具,但是没有发现。简而言之:既然没有人提供这样的工具,我们决定自行编写。就在那时,TortoiseMerge 出世了。
因为 TortoiseSVN 已经使用了 Subversion 库,它内置了一个很好的差异比较工具。很自然的,我们使用这个库代替 GNU diff。
Subversion 1.7 使用了svn补丁命令,以允许工作副本应用补丁文件。TortoiseMerge 现在使用Subversion的命令来实现相同的功能以避免两者间方法的偏差。
TortoiseMerge 有几个不同的用途:
察看两个文件的差异,合并它们,或者删除不想要的修改。
更新后,编辑本地修改和版本库修改之间的冲突。
应用补丁文件并复核它们
此模式用于比较两个文件。左窗格中的文件认为是原始文件(有时称为 他人的,右窗格中的文件是已修改的文件(有时称为 我的。
你可以在右窗格的文件中做简单的基于行的修改,包含:
撤销这些修改行,恢复到左窗格的状态。
使用所有组合,不是他人的在我的之前,就是我的在他人的之前。
你可以象在文本编辑器中一样编辑在右边窗格中的文件。这些被修改的行用铅笔图标标记。请注意,如果你要做上述基于行/块的修改,最好在开始编辑文件之前完成。因为在你开始编辑之后,TortoiseMerge 已经不能跟踪它与原始文件的关联了。
这有时称为三路合并,用三窗格显示。然而它实际上涉及到四个文件。没有显示的文件是公共基础文件,是现在冲突的两个文件的最后祖先。这三个文件的关系用在下图解释:
基础文件是最旧的版本,你的文件,他人的文件,都是从这个文件开始修改的。我的文件表示你对基础文件的修改结果,他人的文件是其他人对基础文件的修改结果。左边的窗格显示他人对基础文件的修改,右边的窗格显示我对基础文件的修改。底部窗格是你尝试解决冲突的输出文件。
在解决冲突视图,你可以选择使用我的块,或者他人的块,或者两者兼有。此时,修改在底部窗格显示。
TortoiseMerge 有三种主要视图方式:单窗格,两窗格和三窗格。单窗格/两窗格视图用于察看修改,三窗格用来解决冲突。
两窗口方式有单窗口方式不具备的一些特性:
用不同的颜色来显示修改行。增加的部分使用浅色,当然你可以配置使用什么颜色。删除部分使用深褐色删除线显示。检查屏幕快照了解它们如何工作。
代码重构经常意味着许多空白字符(空格,制表,新行)变化,但是没有实际上的代码改变。举例来说,你可以将一个很长的行拆分为几行,或者将几行合并为一行。
这些改变在视图的左边用白色圆形符号标记。如果你看到了这些白色圆形,就立即知道这里没有实际代码改变,不需要进一步检查这个代码块
在两窗格视图中,可以在右边的窗格编辑文件。这些修改用铅笔符号标记。在左边窗格编辑文件也是可行的,只有当左边窗格激活,并且
被按下。如果你要比较/合并三个文件,TortoiseMerge 将会使用三窗口方式显示差异。这个视图也用来解决冲突文件。
左窗口显示他人的文件与基础文件的差异,右窗口显示我的文件与基础文件的差异。底部窗口显示基础文件,我的文件,与 他人的文件 的合并结果,以及可能的冲突。
如果你的鼠标在窗格的标题栏逗留,会有工具提示显示此窗格用于比较的文件名称。
只有当窗格激活,并且
按下后,在左边或者右边窗格编辑才是可行的,依赖于你的设置,你可以用很多按钮来选择工具条或者缎带。当你把鼠标悬停在它们上面的时候,这些按钮都显示了提示来解释各自的功能。
窗口的左边是定位拉杆。它提供了对文件改变的位置的快速可视化引用。这个拉杆有三列。左列引用左边的窗口,右列引用右边的窗口,中间列引用底部窗口(如果存在)。在单窗口模式下,只使用了左列。定位拉杆也可以作为滑杆使用,让所有窗口同时滑动。
当你双击一个单词时,在主界面和定位条中,文档的每个相关单词都会被高亮。再次双击单词以取消高亮。
如果你单击左窗口,或者在一行中单击三次,那么整行都会被选中。
窗口底部是状态条。它显示了他们的
和我的
添加删除的行数,以及剩余未解决冲突的数量。
状态条也包含文件如何被处理的选项框:
The encoding specifies how the characters in the views are loaded/saved and shown. The most common encoding in English is ASCII (which means the local encoding of the OS language), but you can change this to be UTF8, UTF16LE, UTF16BE, UTF32LE and UTF32BE, both with or without a byte order mark (BOM).
The most common line endings on Windows is CRLF, but you can change the line endings to whatever you like. Note that if you change the line endings, then all line endings in the whole file will change, even if when loaded the line endings were not all the same.
The option at the top of the combo box menu indicates whether tabs or spaces are inserted when you press the tab key. The smart tab char option if enabled uses an algorithm to determine whether one or the other is best used.
The tab size specifies how many space chars are inserted when editing and pressing the tab char, or how many chars the next word is indented when a tab char is encountered.
已经修改的行用图标指示发生了什么类型的修改。
已经增加一行。
已经删除一行。
此行已经通过恢复到原始内容而撤销修改。
此行只有空白的修改。当有几行连续被标记时,此段可能被重新排版,从而造成修改。
此行已经使用 TortoiseMerge 作为文本编辑器手工修改。
此行处于冲突状态。
此行处于冲突状态,但是被空白或行结束符的设置掩盖。
这行已经被检测到从另一个地方移动到这里或者移往其他地方。
TortoiseMerge 不仅 显示 了你文件间的不同,而且还能让你解决存在的冲突或者采用修改。
If you're in two pane view, then you can only edit the file in the right pane (Mine
). To apply changes made in the left file (Theirs
), right click on the changed lines and select → . Then the changes from the left file are added to the right file.
有时候,你实际上需要双方的文本块,
→ 和 → 可以满足你的要求。你可以象在文本编辑器中一样编辑输出文件。这些被修改的行用铅笔图标标记。请注意,如果你要做上述基于行/块的修改,最好在开始编辑文件之前完成。因为在你开始编辑之后,TortoiseMerge 已经不能跟踪它与原始文件的关联了。
If you're in three pane view (sometimes called merge view) you can only edit the file in the bottom view (Merged
). As in two pane view, you can right click on conflicted lines and either select → or → . In addition, if you want both blocks, you can select → or → . According to the command you've selected, the changes are used in the resulting Merged
file.
有时候在 Subversion 中的文件会被标记为冲突,但是当你用 TortoiseMerge 察看时,却没有显示冲突。这可能是你选择的空白处理方式造成的。如果你选择忽略行结束符或空白改变,这些行会用 冲突被忽略 图标标记。为了解决冲突,你仍旧需要选择你要使用的版本。
注意:如果你在同一文件重新使用 TortoiseMerge,你对工作版本做的任何修改,无论是 TortoiseMerge,还是手工编辑,都将被丢弃,文件恢复到开始冲突编辑时的状态。
当不使用任何命令行参数启动 TortoiseMerge 时,你必须使用
→ 来手工打开文件。你要作的第一件事,就是决定是否比较/合并文件,或者是否使用补丁。根据你的选择,相应的编辑框和浏览按钮会被激活。
如果你要比较/合并文件,必须设置两个路径,或三个路径,即基础文件路径, 我的文件路径与别人的文件路径。如果你只选择两个文件,那么 TortoiseMerge 会使用两窗口方式或单窗口方式,来显示这两个文件的差异。
如果你要合并三个文件,TortoiseMerge 将会使用三窗口方式显示差异。这个视图也用来解决冲突文件。输出文件没有命名,你必须使用
→ 来保存结果。多数选项是不需要过多解释,只需要稍微明确一下。
备份原始文件 在保存修改后的版本时,先将工作拷贝中的原始文件重命名为filename.bak
。
默认UTF-8 编码设置后,ANSI文件将按 UTF-8编码导入,编辑后也以此保存。
Max line length for inline diffs TortoiseMerge can get slow when showing inline diffs for very long lines. Because of that only lines that are shorter than 3000 chars are shown with inline diffs. You can change this value here.
忽略换行类型 隐藏换行类型的改变。
忽略大小写变化 隐藏仅文本大小写变化的差异。这对于像 Visual Basic 等忽略变量大小写的应用程序比较有用。
这个对话框允许你选择一个背景颜色代码,它们用于高亮被修改的行。
目录
列出所有的快捷键和命令。
退出程序
复制选定的文本到剪贴板
剪切至剪贴板
从剪贴板粘贴所选内容
撤销当前操作
打开文本查找和替换的对话框
打开需要比较/合并的文件
保存改变
另存为...
跳转到下一个不同点
跳转到上一个不同点
重新载入文件并放弃所做的任何改变
切换是否显示空白字符
未修改部分显示切换
切换自动换行
跳转到行号
选取所有文本
滚动左右两边的显示
切换视图左侧/右侧/底部视图
Toggles between marking the selected change
切换单窗口方式或双窗口方式
Toggles between marking the selected change
切换视图
使用左边文件块
TortoiseMerge 可以通过命令行选项指定参数运行,而不必非通过打开对话框来选择文件。这便于其它程序调用 TortoiseMerge。
Most switches require additional information like a path or some other string. In those cases, append an ':' to the switch and put the string/path after it. Example:
/base:"c:\folder\my base file.txt"
表 B.1. 命令行选项列表
命令 | 描述 |
---|---|
/? | 弹出一个显示常用命令行参数的对话框。 |
/help | 同 ? 一样。 |
/base | 指定三路比较的文件 基础版本文件。这是所有参与比较文件的祖先,尽管它不在单独的窗口显示。对于两路比较,它是左边的文件。 |
/basename | 基础版本文件名称。它代替文件路径在窗口标题栏显示。在三窗口方式时,它出现在窗口标题的提示中。 |
/basereflectedname | 编辑配置模板所使用的名称 |
/theirs | 指定用于三窗口方式的 他人的文件,显示在左窗口。 |
/theirsname | 他人的文件名称。代替文件路径在窗口标题栏显示。 |
/theirsreflectedname | 编辑配置模板所使用的名称 |
/mine | 指定用于三窗口方式的 我的文件,它显示在右窗口。对于双面板方式,是指右边的文件。 |
/minename | 我的文件名称。代替文件路径在窗口标题栏显示。 |
/minereflectedname | 编辑配置模板所使用的名称 |
/merged |
在diffs中指定合并文件结果。它是保存合并/解决冲突的结果的文件路径。 如果不同于三向区分,TortoiseMerge会询问用户保存结果的位置。 如果不是设置未双向区分,TortoiseMerge会自动使用在右边显示的文件路径作为保存路径。 |
/mergedname | 合并结果的文件名称。显示在窗口标题显示路径的地方。 |
/mergedreflectedname | 编辑配置模板所使用的名称 |
/patchpath | 使用补丁文件的路径。如果你不设置此路径,TortoiseMerge 将自己查找匹配补丁文件的路径,但会花费很长时间。 |
/saverequired | 如果指定了,将强制 TortoiseMerge在退出前询问保存文件,即便用户没有更改文件。 |
/saverequiredonconflicts | 如果指定了,将强制 TortoiseMerge在发现冲突,退出前询问保存文件,即便用户没有更改文件。 |
/patchoriginal | 对应补丁的原始文件。用于窗口标题。 |
/patchpatched | 对应补丁的文件名称。用于窗口标题。 |
/diff | 将要应用补丁的目录 |
/oneway | 强制 TortoiseMerge 以单窗口视图启动,忽略用户的配置。 |
/reversedpatch | 左右交换两个需要比较差异的文件。 |
/createunifieddiff | 为指定的两个文件 /origfile:"path_to_original_file" 和 /modifiedfile:"path_to_modified_file" 创建统一差异文件(补丁文件)。目标路径设置为 /outfile:"path_to_resulting_patchfile" 。如果没有设置 /outfile ,会显示文件保存对话框,从而用户可以选择保存补丁文件的位置。注意:如果设置了 /createunifieddiff ,所有其它参数都会被忽略。 |
/line | 指定加载文件后调至行号 |
/readonly | 防止文件被修改。这意味着TortoiseMerge 的编辑功能被禁用。 |
/nosvnresolve | 在SVN中保存后,防止TortoiseMerge 询问是否将一个文件标记为已解决。 |
为了兼容其它差异比较程序,你也可以在命令行提供简单的文件名。这种简化命令行格式是
TortoiseMerge BaseFilePath MyFilePath [ TheirFilePath ]
如果给出两个文件,它们会互相比较。如果给出三个文件,那么第一个文件被视为基础文件,其它两个文件采用三路比较算法。
向你的工作副本中增加文件或者目录时使用的 Subversion 命令。在你提交的时候新的项就会被加入到版本库中。
当前工作副本里的文件或目录的基础版本。是文件或目录最后被检出、更新或者提交时的版本。基础版本通常和HEAD版本不一致。
这个命令只能用于文本文件,它将会标记每一行来显示版本库修订版本的最后修改的修订和作出修改的人。我们的GUI实现叫做TortoiseBlame,在你将鼠标移到修订版本号码上时,它也会显示时间和日志信息。
一个经常被开发者在特定时期跟踪两个独立路径时使用的术语,它描述了在版本控制系统中发生的事情。你可以从主开发线创建分支,从而开发新特性,不会使主开发线陷入不稳定状态。或者你创建一个稳定发布版的分支,仅用于修复问题,新的开发位于不稳定的主开发线。在 Subversion 中,分支用“廉价拷贝”实现。
一个 Subversion 命令在空目录通过从版本库下载版本控制的文件来创建本地工作副本。
摘自 Subversion 手册:“ 递归的清理工作目录,删除锁,恢复未完成的工作。如果你遇到工作目录已经锁定
错误,运行此命令删除过时的锁,使你的工作副本恢复到可用状态。”注释:在此上下文中“锁”指的是本地文件系统中的锁,不是版本库的锁。
一个 Subversion 操作,用来将本地修改的内容传递回版本库,创建一个新的版本库修订版本。
当版本库的修改合并到本地修改,有时候修改发生在同一行,这种情况下,Subversion 不能自动决定使用文件的那一行,在提交之前,你需要手工编辑文件解决冲突。
在 Subversion 版本库,你可以创建一个文件或整个目录树的副本,这是通过“廉价复制”实现的,看起来很像链接到原来的位置,几乎不占用任何空间。创建一个保存历史的副本,这样你就可以跟踪副本之前的修改。
当你删除一个受版本控制的项(并且提交了修改),在那么在此提交版本后,它就消失于版本库中。当然,它仍旧包含在版本库的早期版本中,所以你还可以访问它。如果需要,你可以复制一个已删除项,包含历史的彻底“复活”它。
“显示区别”的快捷方式,当你希望查看你所做修改的时候非常有用。
这个命令创建了一个版本控制目录的副本,就像工作副本,但是没有.svn
目录。
一个专用于 Subversion 版本库的文件系统后端,可以使用网络文件系统(例如 NFS 或 SMBFS)。是 1.2 版本及其后的版本库之默认后端。
组策略对象。
版本库里文件或目录的最新版本。
在一个修订里将整个目录导入到版本库的 Subversion 命令。
当你加锁一个版本控制项目,除了在发出加锁命令的工作目录,它在版本库中被标记为不可提交的。
显示一个文件或是文件夹的版本历史。也就是“历史”。
显示文件或目录的历史修订,也被称为“Log”。
这个过程会查看版本库添加到工作副本的的修改,而不会破坏你在本地的修改,有时候这些修改可能不会自动的结合,也就是冲突了。
在你更新工作副本时会自动合并,你也可以使用TortoiseSVN的合并命令从另一条分支进行合并。
如果工作副本只有文本文件有修改,也可以使用 Subversion 的 Diff 命令生成标准区别格式的单文件的修改摘要。这种文件通常被叫做“补丁”,可以邮寄给任何人,使之可以应用到另一个工作副本。一些没有提交访问的人可以通过提交补丁文件给有授权的人来应用补丁,或者是在不确定修改时提交补丁给别人进行评审。
除了版本控制文件和目录,Subversion 允许你添加版本控制的元数据 - 被称作每个文件和目录的“属性” 。每个属性都有一个名称和一个值,非常类似于注册表键。Subversion 有一些内置的特别属性,例如 svn:eol-style
。TortoiseSVN 也有一些类似的,例如 tsvn:logminsize
,你可以选择名称和值添加你自己的属性。
如果你的版本库移动了,或许是因为移动到了一个新的目录,或者是域名改变,你需要“relocate”你的工作副本,这样你的版本库URL指向新的地址。
注意: 工作副本必须是指向同一个版本库的同一个位置,是版本库本身移动了。在其他几种情况下,你很有可能是需要“Switch”命令。
版本库是进行数据存储和维护的中心。版本库既可以由分布在网络上的若干数据库或者文件组成,也可以存放在用户不需要通过网络就可以直接访问的某个位置。
当合并之后版本库的文件进入了冲突状态,必须有人用编辑器解决冲突(或者是TortoiseMerge),这个过程称作“解决冲突”,当此过程结束,你可以将冲突文件标示为解决,将会运行提交这个文件。
Subversion 会为每个更新到工作副本的文件保留一份“原始”副本。如果你做出了修改,并希望取消修改,你可以使用“revert”回到原始状态。
每当你提交一组修改,你会在版本库创建一个“修订版本”,每个修订代表了版本库树在历史上某一点的状态,如果你希望回到历史,你可以回到以前的修订版本N。
另一种情况下,你可以把修订看作修订版本建立的修改集。
就像文件,版本库的每个修订也可以有属性。一些特殊的修订属性会在修订版本创建时自动生成,例如: svn:date svn:author svn:log
代表了提交的时间,提交者和日志信息。这些属性可以编辑,但是这些属性都不是版本控制的,所以任何修改都是永久的,不可回退的。
Subversion 的常见缩写形式。
Subversion 的“svnserve”版本库服务器使用的自定义协议名称。
就像“Update-to-revision”从历史上改变了工作副本的视点,“Switch”改变了工作副本空间上的视点。当主干和分支只有微小差别时,这个命令非常有用,你可以在目录之间跳转,而只会有很小区别需要传输。
这个命令将最新的修改从版本库下载到工作副本,合并其他人的修改和工作副本的本地修改。
这是你的本地“沙盒”,这个区域是你工作在版本控制文件的地方,它一般存在于你的本地磁盘,你可以使用“Checkout”从版本库创建一个工作副本,然后使用“Commit”将修改传递回版本库。