Differences between revisions 11 and 17 (spanning 6 versions)
Revision 11 as of 2008-01-15 09:28:13
Size: 3854
Editor: abuehl
Comment: linkfixes after moves
Revision 17 as of 2012-11-06 15:43:41
Size: 4748
Editor: abuehl
Comment: remove link to deleted page "commit"
Deletions are marked like this. Additions are marked like this.
Line 1: Line 1:
# language fr
Line 2: Line 3:
= Tutorial - Fusionner les changements conflictuels = ## 2009-08-08 Frédéric Bouquet (youshe) <youshe.jaalon@gmail.com> - Mise à jour
Line 4: Line 5:
Nous avons appris à nous occuper de fusions simples, dans le ["FrenchTutorialMerge"]. Cette page est une traduction de l'original en anglais [[TutorialConflict]]
Line 6: Line 7:
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). == Tutorial - Fusionner les changements conflictuels ==
Line 8: Line 9:
Nous devons créer une situation de conflit artificielle. Commençons par faire un clone de my-hello. ''(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 [[Merge|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
[[Conflict|conflits]]. Trouver quoi faire avec est appelé le
[[ResolveConflict|résoudre (resolving)]].

Nous devons d'abord créer une situation de conflit artificielle. Commençons par
faire un clone de {{{mon-hello}}}.
Line 12: Line 25:
$ hg clone my-hello my-hello-not-cvs $ hg clone mon-hello my-hello-not-cvs
updating working directory
2 files updated, 0 files merged, 0 files removed, 0 files unresolved
Line 14: Line 29:
Maintenant ajoutons une ligne de sortie à hello.c:
Maintenant ajoutons une ligne de sortie à {{{hello.c}}} :
Line 18: Line 34:
$ vi hello.c
Line 19: Line 36:
Nous changerons main() pour obtenir ceci:
Line 21: Line 37:
{{{ Nous changerons {{{main}}} pour obtenir ceci :

{{{#!cplusplus numbers=off
Line 25: Line 43:
        printf("Certain que je suis sûr de ne pas avoir a utiliser CVS!\n");         printf("sure am glad I'm not using CVS!\n");
Line 30: Line 48:
Et soumettons les changements: Et soumettons les changements :
Line 33: Line 51:
$ hg commit -m'un autre commentaire' $ hg commit -m "Give thanks for dodging bullet"
Line 36: Line 54:
Souvenez-vous que dans le ["FrenchTutorialFirstChange"] 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 ? 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|pull]] depuis ce change
ment ici ?
Line 46: Line 67:
(run 'hg update' to get a working copy) (run 'hg heads' to see heads, 'hg merge' to merge)
Line 49: Line 70:
Jusqu'ici, tout va bien. Essayons une mise à jour (update) Jusqu'ici, tout va bien. Essayons une [[Update|mise à jour (update)]].
Line 52: Line 73:
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)
$ hg update
abort: crosses branches (use 'hg merge' or 'hg update -C')
Line 58: Line 77:
Comme dans le ["FrenchTutorialMerge"], 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). 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)).
Line 61: Line 84:
$ hg update -m $ hg merge
Line 63: Line 86:
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.
Line 65: Line 87:
Note: la commande hg merge existe désormais également. Elle a le même effet que update -m. 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 :
Line 67: Line 91:
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. {{{
/*
 * 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.
 */
Line 69: Line 101:
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 !
#include <stdio.h>
Line 73: Line 103:
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
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;
}
}}}
Line 79: Line 115:
 - enregistrer depuis le logiciel
Line 81: Line 116:
 - quitter. 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 :
Line 83: Line 120:
Mercurial relancera le programme si d'autres conflits apparaissent. {{{
$ hg status
M hello.c
? hello.c.orig
}}}
Line 85: Line 126:
Maintenant passons à la ["FrenchTutorialConclusion"] 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

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)