如何解决 Mercurial 版本冲突
什么是版本冲突
当两个工程师都对版本库中的同一个文件中的同一行内容都进行了修改,而且其中一位工程师已经用 "hg push" 命令将这个变更集(changeset)推入到版本库中, 当另外一位工程师要向该版本库推入另外一个变更集时,Mercurial会自动发现来自这两个工程师的变更集有冲突,而拒绝第二位工程师对版本库的推入操作。提示大致如下:
pushing to /ws/tmp/hellosearching for changesabort: push creates new remote branches!(did you forget to merge? use push -f to force) 注意: 此时,第二位工程师仍然可以用 "hg push -f" 命令,强行将它的变更集推入远程版本库,但是我们规定原则上不得进行这样的操作。 版本库的冲突应及时与有关工程师,项目主管协同解决。
解决冲突
当你对远处版本库的推入操作被拒绝时,说明你的修改和远程版本库中的内容有冲突,此时应该用 "hg pull" 命令将远程版本库中的内容拉入到你的版本库中, 当远程版本库的内容被拉入时,hg 同样会自动发现你的版本库中有内容冲突而提示解决,如:
$ hg pullpulling from /ws/tmp/hellosearching for changesadding changesetsadding manifestsadding file changesadded 1 changesets with 1 changes to 1 files (+1 heads)(run 'hg heads' to see heads, 'hg merge' to merge)...$ hg mergeMercurial 推荐使用第三方的专门的合并工具来解决版本冲突。如果你的工作机上没有安装第三方合并工具,则 hg 会自动弹出默认的文本编辑工具来显示并提示编辑冲突, 我们可以手动在文本工具上编辑冲突的文本块,但不推荐这个方法,如:
/* * This is C file for hg example<<<<<<< /ws/tmp/hello2/hello.c * second desc line from hello2======= * second desc line for hello1>>>>>>> /tmp/hello.c~other.eWVR_T */#include <stdio.h> 最好的方法是安装第三方的合并工具来编辑冲突。
安装和使用第三方合并工具
Mercurial 支持很多的第三方合并工具,譬如:
•meld - Meld,著名的文件合并工具
•tkdiff - tkdiff,可以在 Windows 下使用
•kdiff3 - kdiff3, KDE 图形界面下的合并工具
•xxdiff
•TortoiseMerge - TortoisySVN,也是 Windows 下的合并工具。
你可以选择一种你喜欢的来安装,并配置 ~/.hgrc 文件,下面以使用 Gentoo Linux 下的 Meld 为例子:
# emerge meld /* 安装 Meld */修改 ~/.hgrc 文件:
[ui]username = Luo Zheng Rong <
[email protected]>merge = meld /* 指定用什么工具作为合并工具 */安装并配置第三方合并工具后,当我们运行 "hg merge" 命令,且有版本内容冲突的时候,hg 会自动弹出第三方合并工具, 形象地显示冲突,并且我们可以在工具中直接编辑文件,如下图:
编辑完冲突的文本块并保存之后,我们就可以提交合并过的变更集,并推入远程版本库:
$ hg commit -m "Merge conflict from tow heads"$ hg push
回滚拉入操作
当我们发现有版本内容冲突时,应该和你的协作者充分沟通,统一意见之后再进行合并操作,此时 如果你不想立即处理冲突,在你执行 "hg push" 命令之前,可以回滚最后一次的拉入操作:
hg rollback 管理和解决冲