教程 - 合并改变

ChineseTutorialExport 一节, 我们学会了如何与其他人共享变更. But since (as of version 0.7) ["Import"] isn't functional enough to handle emailed merges correctly, we're going to demonstrate merging by pulling from another repository that has made an incompatible change.

首先, 我们必须创建合并的目标. 我们再次 ["Clone"] my-hello的仓库:

$ cd ..
$ hg clone my-hello my-hello-desc

我们给 hello.c 的注释段加一段描述.

$ cd my-hello-desc
$ vi hello.c

我们将第二行:

 * hello.c

改为:

 * hello.c - hello, world

我们存档并退出编辑器, 然后 ["Commit"] 我们的修改. 这次, 我们在commit命令中使用-m 选项来节省时间, 以免我们又要进入编辑器:

$ hg commit -m 'Add description of hello.c'

这时, 我们已经对 my-hello-new-output [:Repository:仓库]中的 hello.c 作了一个更改 , 同时对 my-hello-desc [:Repository:仓库] 中的 hello.c 作了另一个更改. 我们怎样 merge 这两个分叉开发主线? 我们从一个仓库拖进另外一个仓库的时候会出现问题吗?

这完全没有问题. 现在仍然在 my-hello-desc中, 我们从 my-hello-new-output中 ["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)

This looks just like the output of pull from TutorialShareChange! So all we have to do is an ["Update"] now, right?

$ 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)

Nope. Something has happened. ["Mercurial"] is telling us that we must ["Merge"] the changes that we made in each [:Repository:仓库]. This sounds painful, right? It's actually very easy. Let's follow the instructions of the last line of output:

$ hg merge
merging hello.c

That's all there is to it! ["Mercurial"] was able to handle the merge automatically for you, by calling under the covers the hgmerge script (or whatever is your MergeProgram). Depending on your environment, the hgmerge may call a graphical merge resolver tool. If we look at hello.c, we find that it contains both the change from my-hello-new-output and the change from my-hello-desc.

(Note: before Mercurial version 0.9, hg update -m should have been used in place of hg merge).

When working with changes made by other people, this is the kind of merge you will end up performing most of the time.

Let us continue on, however, and learn how to deal with situations where conflicting changes have been made in ChineseTutorialConflict.


CategoryChinese