Differences between revisions 13 and 39 (spanning 26 versions)
Revision 13 as of 2006-05-15 16:21:00
Size: 3374
Comment: updates for v0.9: update -m -> merge, undo -> rollback
Revision 39 as of 2013-09-01 00:28:39
Size: 252
Comment:
Deletions are marked like this. Additions are marked like this.
Line 1: Line 1:
== 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:

{{{#!cplusplus numbers=off
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.
Santa Clarita-born Shandi Burns is really hooked on [[http://exonblast.com/members/victorinahunt1975/activity/284916/|Costa Blanca weather conditions March,]] gizmos, running. Lastly, she is fascinated by spending valuable time with her fine friends.

Santa Clarita-born Shandi Burns is really hooked on Costa Blanca weather conditions March, gizmos, running. Lastly, she is fascinated by spending valuable time with her fine friends.

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