Size: 3501
Comment:
|
Size: 3374
Comment: updates for v0.9: update -m -> merge, undo -> rollback
|
Deletions are marked like this. | Additions are marked like this. |
Line 58: | Line 58: |
(use update -m to merge across branches or -C to lose changes) | (use 'hg merge' to merge across branches or 'hg update -C' to lose changes) |
Line 61: | Line 61: |
As in TutorialMerge, we have to run {{{update -m}}}. But here's where things change. ["Mercurial"] cannot automatically ["Merge"], because the same line of the same source file has been modified in a different way by each ChangeSet (the one we just ["Commit"]ted, and the one we just ["Pull"]ed). Instead, ["Mercurial"] will launch a program to help you do the merge manually. | As in TutorialMerge, we have to run {{{hg merge}}}. As before, the MergeProgram will be started under cover. It will usually not be able to ["Merge"] automatically, because the same line of the same source file has been modified in a different way by each ChangeSet (the one we just ["Commit"]ted, and the one we just ["Pull"]ed). |
Line 64: | Line 65: |
$ hg update -m | $ hg merge |
Line 67: | Line 68: |
At this point, what happens depends on what programs are installed on our computer. If we are provident or lucky, and have a MergeProgram installed, we will be dropped into the MergeProgram. Here, we will be able to see what conflicts there are between the two changes, and decide how to resolve them. | At this point, what happens depends on what programs are installed on our computer. If we are provident or lucky, and have a graphical MergeProgram installed, we will be able to see what conflicts there are between the two changes, and decide how to resolve them. |
Line 76: | Line 77: |
Else, if we do not have a MergeProgram installed, we will be dropped into a text editor, which will be visiting the file we need to ["Merge"]. Doing this by hand is '''highly''' error-prone and tedious. It is best to exit the editor and use the {{{hg undo}}} command to reverse the effect of the ["Pull"], then install a MergeProgram, and then try again. | Else, if we do not have a graphical MergeProgram installed, we will be dropped into a text editor, which will be visiting the file we need to ["Merge"]. Doing this by hand is '''highly''' error-prone and tedious. It is best to exit the editor and use the {{{hg rollback}}} command to reverse the effect of the ["Pull"], then install a MergeProgram, and then try again. |
Line 78: | Line 79: |
'''Note:''' ["Mercurial"] looks at the {{{HGMERGE}}} environment variable and the config file to see which program it must run. If none is set, it runs the {{{hgmerge}}} script, which tries several popular programs before giving up. | (~-Note: before Mercurial version 0.9, `hg update -m` should have been used in place of `hg merge` and `hg undo` should have been used instead of `hg rollback`-~). |
Tutorial - merging conflicting changes
We learned how to deal with simple ["Merge"]s in TutorialMerge.
["Mercurial"] handles more complex ["Merge"] cases, too. It is not all that uncommon for two people to edit the exact same lines of a file, and then have to figure out what to do. These cases are called conflicts; figuring out what to do about a conflict is called resolving it.
Let's first create an artificial conflict situation. As we did previously, let's start by making a ["Clone"] of my-hello:
$ cd .. $ hg clone my-hello my-hello-not-cvs
Now let's add a new line of output to hello.c:
$ cd my-hello-not-cvs $ vi hello.c
We change main to read like this:
int main(int argc, char **argv)
{
printf("hello, world!\n");
printf("sure am glad I'm not using CVS!\n");
return 0;
}
And we ["Commit"] the change:
$ hg commit -m 'Give thanks for dodging bullet'
Recall that in TutorialFirstChange, we created a ChangeSet in my-hello-new-output that also added a second line of output. What happens when we try to ["Pull"] that change in here?
$ 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)
So far, so good. Let's try an ["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)
As in TutorialMerge, we have to run hg merge. As before, the MergeProgram will be started under cover. It will usually not be able to ["Merge"] automatically, because the same line of the same source file has been modified in a different way by each ChangeSet (the one we just ["Commit"]ted, and the one we just ["Pull"]ed).
$ hg merge
At this point, what happens depends on what programs are installed on our computer. If we are provident or lucky, and have a graphical MergeProgram installed, we will be able to see what conflicts there are between the two changes, and decide how to resolve them.
["Mercurial"] is using a per-file 3-way merge. This means that there are 3 input files for merging process, and those are:
- Local file (from current repository)
- Other file (from repository being merged)
- Base file (last version of file before branches separated)
For more information about 3-way, see [http://revctrl.org/ThreeWayMerge ThreeWayMerge] on the [http://revctrl.org/ Revctrl wiki].
Else, if we do not have a graphical MergeProgram installed, we will be dropped into a text editor, which will be visiting the file we need to ["Merge"]. Doing this by hand is highly error-prone and tedious. It is best to exit the editor and use the hg rollback command to reverse the effect of the ["Pull"], then install a MergeProgram, and then try again.
(Note: before Mercurial version 0.9, hg update -m should have been used in place of hg merge and hg undo should have been used instead of hg rollback).
Now let's continue and finish on to TutorialConclusion.