🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
## 教程 - 合并有冲突的改变 在[合并](/wiki/ChineseTutorialMerge)中我们已经学会了如何处理简单的[Merge](/wiki/Merge)。 [Mercurial](/wiki/Mercurial)当然也处理更加复杂的 [Merge](/wiki/Merge)。很平常的情况是两个人同时更改同一个文件的同一段代码,然后必须给出处理的方法。这称之为冲突;处理这类冲突称之为合并。 首先让我们人为的创建一个冲突的实例。 正如我们前面所做的, 通过做一个`my-hello`的[Clone](/wiki/Clone)开始: ``` $ cd .. $ hg clone my-hello my-hello-not-cvs ``` 现在,加入一些新的输出语句到hello.c: ``` $ cd my-hello-not-cvs $ vi hello.c ``` 改变 `main` 如下所示: ``` int main(int argc, char **argv) { printf("hello, world!\n"); printf("sure am glad I'm not using CVS!\n"); return 0; } ``` 然后 [Commit](/wiki/Commit) 这些改变: ``` $ hg commit -m 'Give thanks for dodging bullet' ``` 正如[第一次改变](/wiki/ChineseTutorialFirstChange)那样,我们在`my-hello-new-output`里建立了一个[变更集](/wiki/ChangeSet),`my-hello-new-output`包含了第二输出行。如果这时我们使用[Pull](/wiki/Pull)指令时,会发生什么事情呢? ``` $ hg pull ../my-hello-new-output pulling from ../my-hello-new-output searching for changes adding changesets adding manifests adding file changes added 1 changesets with 1 changes to 1 files (+1 heads) (run 'hg update' to get a working copy) ``` 到目前为止,非常顺利。 让我们试试 [Update](/wiki/Update)。 ``` $ hg update this update spans a branch affecting the following files: hello.c (resolve) aborting update spanning branches! (use 'hg merge' to merge across branches or 'hg update -C' to lose changes) ``` 正如[合并](/wiki/ChineseTutorialMerge)那样,我们不得不运行 `hg merge`. 像往前一样, 合并程序将被启动。经常是不能自动合并,因为同样源文件的相同的代码在每个[ChangeSet](/wiki/ChangeSet)中被不同的方式更改(一个是我们提交的更改方式,一个是我们[Pull]来的)。 ``` $ hg merge ``` 这时,会发生什么决定于电脑中安装了什么样的程序。 如果我们有先见之明或者幸运的话, 并且安装了图形的合并程序,我们就能够看到在两个更改之间发生了什么冲突,并决定如何去做。 [Mercurial](/wiki/Mercurial) 使用了三路合并。 这就意味着有三个文件来做合并,分别是: * 本地文件(当前仓库) * 其它文件(正在被合并的仓库) * 基文件 (在分支分开前的最后一个版本) 要了解更多的三路合并, 请参考[ThreeWayMerge](http://revctrl.org/ThreeWayMerge) on the [Revctrl wiki](http://revctrl.org/). 另外,如果我们没有安装图形合并程序, 我们就会开启文本编辑器来访问需要合并的文件。用手工来做这些事情是**非常**容易出错并且繁琐的。 最好是退出编辑器并用`hg rollback`指令来清除["Pull"]带来的改变,然后安装合并程序,再做一次。 (注意: Mercurial 0.9之前的版本,"hg merge" 必须使用 "hg update -m"代替,"hg rollback" 必须用 "hg undo" 代替。) 现在让我们继续并在[总结](/wiki/ChineseTutorialConclusion)中完成我们的教程。