Size: 3854
Comment: linkfixes after moves
|
Size: 4748
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 changement 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.