Cette page est une traduction de l'original en anglais TutorialConflict

Tutorial - Fusionner les changements conflictuels

(Cette page est la partie 8 sur 9 de la série FrenchTutorial. La partie précédente est FrenchTutorialMerge, la suivante FrenchTutorialConclusion)

Nous avons appris à nous occuper de fusions simples, dans le FrenchTutorialMerge.

Mercurial sait également traiter des cas plus complexes de fusion. Il n'est pas rare que deux personnes éditent exactement la même ligne d'un fichier, et doivent alors décider ce qu'il faut faire. On appelle ces cas conflits. Trouver quoi faire avec est appelé le résoudre (resolving).

Nous devons d'abord créer une situation de conflit artificielle. Commençons par faire un clone de mon-hello.

$ cd ..
$ hg clone mon-hello my-hello-not-cvs
updating working directory
2 files updated, 0 files merged, 0 files removed, 0 files unresolved

Maintenant ajoutons une ligne de sortie à hello.c :

$ cd my-hello-not-cvs
$ vi hello.c

Nous changerons main pour obtenir ceci :

int main(int argc, char **argv)
{
        printf("hello, world!\n");
        printf("sure am glad I'm not using CVS!\n");
        return 0;
}

Et soumettons les changements :

$ hg commit -m "Give thanks for dodging bullet"

Souvenez-vous que dans le FrenchTutorialFirstChange, nous avions créé un ChangeSet dans my-hello-new-output qui ajoutait également une seconde ligne de sortie. Que se passe-t-il si on essaie de faire un pull depuis ce changement ici ?

$ 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 heads' to see heads, 'hg merge' to merge)

Jusqu'ici, tout va bien. Essayons une mise à jour (update).

$ hg update
abort: crosses branches (use 'hg merge' or 'hg update -C')

Comme dans le FrenchTutorialMerge, nous devons lancer hg merge. Cependant, Mercurial ne va pas être capable de fusionner automatiquement étant donné que la même ligne du même fichier source a été modifié différemment dans chaque ChangeSet (celui que nous venons juste de commiter, et celui que nous venons juste de récupérer (pull)).

$ hg merge

A ce point, ce qui se passe dépend de comment Mercurial est configuré (cf. MergeToolConfiguration). Par défaut, Mercurial insère un ensemble de marqueurs dans les fichiers à fusionner de votre copie de travail :

/*
 * hello.c
 *
 * Placed in the public domain by Bryan O'Sullivan
 *
 * This program is not covered by patents in the United States or other
 * countries.
 */

#include <stdio.h>

int main(int argc, char **argv)
{
        printf("hello, world!\n");
<<<<<<< local
        printf("sure am glad I'm not using CVS!\n");
=======
        printf("sure am glad I'm using Mercurial!\n");
>>>>>>> other
        return 0;
}

Vous pouvez trouver ces fichiers en utilisant la commande hg status, comme précédemment, notez que Mercurial a sauvegardé une copie du fichier original avant d'insérer les marqueurs de conflits :

$ hg status
M hello.c
? hello.c.orig

Pour résoudre un conflit, nous ouvrons hello.c dans un éditeur, supprimons les marqueurs de conflits et gardons la ligne "sure am glad I'm using Mercurial!\n", supprimant la ligne à propos de CVS. Nous pouvons ensuite sauver et fermer l'éditeur

Ensuite, nous informons Mercurial que nous avons résolu le conflit en utilisant la commande hg resolve :

$ hg resolve -m hello.c

Mercurial accepte la résolution sans aucune sortie.

Comme précédemment, pensez à commiter ces changements au dépôt une fois que la fusion est complète :

$ hg commit -m "Merged changes from my-hello-new-output"

Ce que nous avons vu ici est le comportement par défaut de Mercurial. Vous pouvez, si vous le voulez, configurer Mercurial pour ouvrir l'éditeur automatiquement. Mercurial peut aussi être configuré pour appeler un outil externe de fusion en trois étapes. Des informations sur ces deux procédés peuvent être trouvées dans MergeToolConfiguration.

Finissons maintenant avec FrenchTutorialConclusion.


CategoryTutorial CategoryFrench

FrenchTutorialConflict (last edited 2012-11-11 19:55:33 by abuehl)