["Tutorial"] - Merging changes
In TutorialExport, we learned how to share a change with another person. But, since (as of version 0.6c anyway) ["Import"] isn't yet functional enough to handle merges correctly, we're going to demonstrate merging by pulling from another repository that has made an incompatible change.
First, we must create a reason to merge. Let's ["Clone"] the my-hello repository again:
$ cd .. $ hg clone my-hello my-hello-desc
We are going to give hello.c a description in its comment section.
$ cd my-hello-desc $ vi hello.c
Let's change the second line from this:
* hello.c
To this:
* hello.c - hello, world
Let's save and quit the editor, and ["Commit"] our change. This time, we save a few moments by using the -m option to the commit command, to save us from being dropped into another editor:
$ hg commit -m'Add description of hello.c'
At this point, we have made one change to hello.c in the my-hello-new-output ["Repository"], and another change to hello.c in the my-hello-desc ["Repository"]. Will there be a problem when we want to pull from one into the other?
This works just fine. While still in my-hello-desc, let's ["Pull"] those changes from my-hello-new-output and see what happens:
$ hg pull ../my-hello-new-output pulling from ../my-hello-new-output/ searching for changes adding changesets adding manifests adding file revisions modified 1 files, added 1 changesets and 1 new revisions (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 update -m to perform a branch merge)
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. We simply follow the instructions:
$ hg update -m merging hello.c
And that's all there is to it; ["Mercurial"] was able to handle the merge completely automatically. If we look at hello.c now, we find that it contains /both/ the change from my-hello-new-output and the change from my-hello-desc.
Much of the time, when you are working with changes made by other people, this is the /only/ kind of merge you will need to perform.
Let us continue on, and learn how to deal with situations where conflicting changes have been made, in TutorialConflict.