Differences between revisions 12 and 13
Revision 12 as of 2005-11-16 23:26:46
Size: 3501
Editor: EricHopper
Comment:
Revision 13 as of 2006-05-15 16:21:00
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.

TutorialConflict (last edited 2019-03-28 10:43:14 by IanMoody)