Differences between revisions 9 and 10
Revision 9 as of 2006-06-02 11:49:22
Size: 3807
Editor: tnorth
Comment: tiny update for mercurial 0.9 and somme comments.
Revision 10 as of 2008-01-15 09:08:34
Size: 3857
Editor: abuehl
Comment: moved
Deletions are marked like this. Additions are marked like this.
Line 1: Line 1:
## page was renamed from TutorialGestionConflits

Tutorial - Fusionner les changements conflictuels

Nous avons appris à nous occuper de fusions simples, dans le ["TutorialMergeFr"].

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

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

$ cd ..
$ hg clone my-hello my-hello-not-cvs

Maintenant ajoutons une ligne de sortie à hello.c:

$ cd my-hello-not-cvs

Nous changerons main() pour obtenir ceci:

int main(int argc, char **argv)
{
        printf("hello, world!\n");
        printf("Certain que je suis sûr de ne pas avoir a utiliser CVS!\n");
        return 0;
}

Et soumettons les changements:

$ hg commit -m'un autre commentaire'

Souvenez-vous que dans le tutorial des premiers changements nous avions créé un ChangeSet dans my-hello-new-output qui ajoutait également une ligne de sortie à la même place. 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 update' to get a working copy)

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

this update spans a branch affecting the following files:
 hello.c (resolve)
aborting update spanning branches!
(use update -m to merge across branches or -C to lose changes)

Comme dans le ["TutorialMergeFr"], nous devons lancer update -m. Mais c'est ici que les choses changent. Mercurial ne peut pas simplement fusionner les changements, puisque la même ligne des deux fichiers a été modifiée d'une façon différente par chaque Changeset (celui que nous venons de soumettre, et celui que nous venons d'ajouter avec pull).

$ hg update -m

Ici, ce qui se passe peut être une question de chance. Si nous en avons, et que nous avons un programme de fusion (merging program) installé, il sera lancé. De là on sera capable de remarquer les conflits entre les deux changements et de décider comment les résoudre.

Note: la commande hg merge existe désormais également. Elle a le même effet que update -m.

Si nous n'avons pas de chance et que nous n'avons pas de programme de fusion installé, nous nous retrouverons dans notre éditeur de texte, qui visitera le fichier que nous devons fusionner. Le faire à la main est synonyme de fortes chances d'erreur et est également pénible. Il est préférable de quitter l'éditeur de texte, d'installer un programme de fusion, puis d'utiliser hg undo pour retirer les changements du pull. Ensuite, refaire le pull et essayer à nouveau.

Note:

  • N'oubliez pas de faire un commit après le update -m !
  • Les fichiers à conflits sont conservés en sauvegarde comme fichier.orig : supprimez-les pour qu'ils ne soient pas versionnés !

Complément sur les logiciels de "fusion": kdiff3 est excellent: il s'occupera de fusionner ce qui peut l'être, et laissera des marques de confits aux endroits ou une action de l'utilisateur est requise. meld est aussi assez efficace, et mieux intégré à Gnome. Mais quelque soit le logiciel que vous utilisez, la démarche est la suivante:

  • - résoudre le conflit à l'aide des marqueurs - enregistrer depuis le logiciel - quitter.

Mercurial relancera le programme si d'autres conflits apparaissent.

Maintenant passons à la ["ConclusionTutorialMercurial"]

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