hgbook
changeset 995:56953b292c8a
finishing fixes on ch03 due to transformation from Latex files
author | Romain PELISSE <belaran@gmail.com> |
---|---|
date | Sat Sep 12 17:58:26 2009 +0200 (2009-09-12) |
parents | c40dac4f63d8 |
children | 6f8c48362758 |
files | fr/ch03-tour-merge.xml |
line diff
1.1 --- a/fr/ch03-tour-merge.xml Fri Sep 04 18:55:53 2009 +0200 1.2 +++ b/fr/ch03-tour-merge.xml Sat Sep 12 17:58:26 2009 +0200 1.3 @@ -15,364 +15,433 @@ 1.4 travaille iavec un gestionnaire de source distribué.</para> 1.5 1.6 <itemizedlist> 1.7 - <listitem><para>Alice et Bob ont chacun une copie personnelle du dépôt d'un 1.8 - projet sur lequel ils collaborent. Alice corrige un \textit{bug} 1.9 - dans son dépôt, et Bob ajoute une nouvelle fonctionnalité dans le 1.10 - sien. Ils veulent un dépôt partagé avec à la fois le correctif du 1.11 - \textit{bug} et la nouvelle fonctionnalité.</para> 1.12 -</listitem> 1.13 -<listitem><para>Je travaille régulièrement sur plusieurs tâches différentes sur 1.14 - un seul projet en même temps, chacun isolé dans son propre dépôt. 1.15 - Travailler ainsi signifie que je dois régulièrement fusionner une 1.16 - partie de mon code avec celui des autres.</para> 1.17 -</listitem></itemizedlist> 1.18 - 1.19 -<para>Parce que la fusion est une opération si commune à réaliser, 1.20 -Mercurial la rend facile. Étudions ensemble le déroulement des opérations. 1.21 -Nous commencerons encore par faire un clone d'un autre dépôt (vous voyez 1.22 -que l'on fait ça tout le temps ?) puis nous ferons quelques modifications 1.23 -dessus. 1.24 -<!-- &interaction.tour.merge.clone; --> 1.25 -Nous devrions avoir maintenant deux copies de <filename>hello.c</filename> avec 1.26 -des contenus différents. Les historiques de ces deux dépôts ont aussi 1.27 -divergés, comme illustré dans la figure <xref linkend="fig:tour-merge:sep-repos"/>.</para> 1.28 - 1.29 -<para><!-- &interaction.tour.merge.cat; --></para> 1.30 - 1.31 -<informalfigure> 1.32 - 1.33 -<para> <mediaobject><imageobject><imagedata fileref="tour-merge-sep-repos"/></imageobject><textobject><phrase>XXX add text</phrase></textobject></mediaobject> 1.34 - <caption><para>Historiques récent divergents des dépôts \dirname{my-hello</para></caption> 1.35 - et <filename class="directory">my-new-hello</filename>} 1.36 - \label{fig:tour-merge:sep-repos}</para> 1.37 -</informalfigure> 1.38 - 1.39 -<para>Nous savons déjà que récupérer les modifications depuis notre dépôt 1.40 -<filename class="directory">my-hello</filename> n'aura aucun effet sur l'espace de travail. 1.41 -</para> 1.42 - 1.43 -<para><!-- &interaction.tour.merge.pull; --> 1.44 -</para> 1.45 - 1.46 -<para>Néanmoins, la commande <command role="hg-cmd">hg pull</command> nous indique quelque chose au 1.47 -sujet des <quote>heads</quote>. 1.48 -</para> 1.49 - 1.50 -<sect2> 1.51 -<title>\textit{Head changesets}</title> 1.52 - 1.53 -<para>Une \textit{head}\footnote{NdT: Je garde \textit{head} que j'accorde 1.54 -au féminin comme la coutume orale l'a imposé.} est un \textit{changeset} 1.55 -sans descendants, ou enfants, comme on les désigne parfois. La révision 1.56 -\textit{tip} est une \textit{head}, car la dernière révision dans un dépôt 1.57 -n'a aucun enfant, mais il est important de noter qu'un dépôt peut contenir 1.58 -plus d'une \textit{head}. 1.59 -</para> 1.60 - 1.61 -<informalfigure> 1.62 - 1.63 -<para> <mediaobject><imageobject><imagedata fileref="tour-merge-pull"/></imageobject><textobject><phrase>XXX add text</phrase></textobject></mediaobject> 1.64 - \caption{Contenu d'un dépôt après avoir transféré le contenu du dépôt 1.65 - <filename class="directory">my-hello</filename> dans le dépôt <filename class="directory">my-new-hello</filename>} 1.66 - \label{fig:tour-merge:pull} 1.67 -</para> 1.68 -</informalfigure> 1.69 - 1.70 -<para>Dans la figure <xref linkend="fig:tour-merge:pull"/>, vous pouvez constater l'effet 1.71 -d'un \textit{pull} depuis le dépôt <filename class="directory">my-hello</filename> dans le dépôt 1.72 -<filename class="directory">my-new-hello</filename>. L'historique qui était déjà présent dans le dépôt 1.73 -<filename class="directory">my-new-hello</filename> reste intact, mais une nouvelle révision a été 1.74 -ajoutée. En vous reportant à la figure <xref linkend="fig:tour-merge:sep-repos"/>, 1.75 -vous pouvez voir que le \textit{<emphasis>changeset ID</emphasis>} reste le même dans 1.76 -le nouveau dépôt, mais que le <emphasis>numéro de révision</emphasis> reste le même. 1.77 -(Ceci est un parfait exemple de pourquoi il n'est fiable d'utiliser les 1.78 -numéros de révision lorsque l'on discute d'un \textit{changeset}.) Vous 1.79 -pouvez voir les \texit{heads} présentes dans le dépôt en utilisant la 1.80 -commande <command role="hg-cmd">hg heads</command>. 1.81 -<!-- &interaction.tour.merge.heads; --> 1.82 -</para> 1.83 - 1.84 -</sect2> 1.85 -<sect2> 1.86 -<title>Effectuer la fusion</title> 1.87 - 1.88 -<para>Que se passe-t-il quand vous essayez d'utiliser la commande <command role="hg-cmd">hg update</command> 1.89 -pour mettre à jour votre espace de travail au nouveau \textit{tip}. 1.90 -<!-- &interaction.tour.merge.update; --> 1.91 -Mercurial nous prévient que la commande <command role="hg-cmd">hg update</command> n'effectuera pas 1.92 -la fusion, il ne veut pas mettre à jour l'espace de travail quand il 1.93 -estime que nous pourrions avoir besoin d'une fusion, à moins de lui 1.94 -forcer la main. À la place, il faut utiliser la commande <command role="hg-cmd">hg merge</command> 1.95 -pour fusionner les deux \textit{heads}. 1.96 -<!-- &interaction.tour.merge.merge; --> 1.97 -</para> 1.98 - 1.99 -<informalfigure> 1.100 - 1.101 -<para> <mediaobject><imageobject><imagedata fileref="tour-merge-merge"/></imageobject><textobject><phrase>XXX add text</phrase></textobject></mediaobject> 1.102 - \caption{Espace de travail et dépôt lors d'une fusion, et dans le 1.103 - \textit{commit} qui suit.} 1.104 - \label{fig:tour-merge:merge} 1.105 -</para> 1.106 -</informalfigure> 1.107 - 1.108 -<para>Ceci met à jour l'espace de travail de manière à ce qu'il contienne 1.109 -les modifications des <emphasis>deux</emphasis> \textit{heads}, ce qui apparaît dans 1.110 -les sorties de la commande <command role="hg-cmd">hg parents</command> et le contenu de 1.111 -<filename>hello.c</filename>. 1.112 -<!-- &interaction.tour.merge.parents; --> 1.113 -</para> 1.114 - 1.115 -</sect2> 1.116 -<sect2> 1.117 -<title>Effectuer le \textit{commit} du résultat de la fusion</title> 1.118 - 1.119 -<para>Dès l'instant où vous avez effectué une fusion, <command role="hg-cmd">hg parents</command> vous 1.120 -affichera deux parents, avant que vous n'exécutiez la commande 1.121 -<command role="hg-cmd">hg commit</command> sur le résultat de la fusion. 1.122 -<!-- &interaction.tour.merge.commit; --> 1.123 -Nous avons maintenant un nouveau \textit{tip}, remarquer qu'il contient 1.124 -<emphasis>à la fois</emphasis> nos anciennes \textit{heads} et leurs parents. Ce sont 1.125 -les mêmes révisions que nous avions affichées avec la commande 1.126 -<command role="hg-cmd">hg parents</command>. 1.127 -</para> 1.128 - 1.129 -<para><!-- &interaction.tour.merge.tip; --> 1.130 -Dans la figure <xref linkend="fig:tour-merge:merge"/>, vous pouvez voir une représentation 1.131 -de ce qui se passe dans l'espace de travail pendant la fusion, et comment ceci 1.132 -affecte le dépôt lors du \textit{commit}. Pendant la fusion, l'espace de travail, 1.133 -qui a deux \texit{changesets} comme parents, voit ces derniers devenir le parent 1.134 -%%% TODO: le parent ou "les parents" : plus logique mais si il reste seulement 1.135 -%%% un changeset, alors c'est effectivement un parent (le changeset est hermaphrodite) 1.136 -d'un nouveau \textit{changeset}. 1.137 -</para> 1.138 - 1.139 -</sect2> 1.140 -</sect1> 1.141 -<sect1> 1.142 -<title>Fusionner les modifications en conflit</title> 1.143 - 1.144 -<para>La plupart des fusions sont assez simple à réaliser, mais parfois 1.145 -vous vous retrouverez à fusionner des fichiers où la modification touche 1.146 -la même portion de code, au sein d'un même fichier. À moins que ces 1.147 -modification ne soient identiques, ceci aboutira à un <emphasis>conflit</emphasis>, 1.148 -et vous devrez décider comment réconcilier les différentes modifications 1.149 -dans un tout cohérent. 1.150 -</para> 1.151 - 1.152 -<informalfigure> 1.153 - 1.154 -<para> <mediaobject><imageobject><imagedata fileref="tour-merge-conflict"/></imageobject><textobject><phrase>XXX add text</phrase></textobject></mediaobject> 1.155 - <caption><para>Modifications conflictuelles dans un document</para></caption> 1.156 - \label{fig:tour-merge:conflict} 1.157 -</para> 1.158 -</informalfigure> 1.159 - 1.160 -<para>La figure <xref linkend="fig:tour-merge:conflict"/> illustre un cas de modifications 1.161 -conflictuelles dans un document. Nous avons commencé avec une version simple 1.162 -de ce fichier, puis nous avons ajouté des modifications, pendant que 1.163 -quelqu'un d'autre modifiait le même texte. Notre tâche dans la résolution 1.164 -du conflit est de décider à quoi le fichier devrait ressembler. 1.165 -</para> 1.166 - 1.167 -<para>Mercurial n'a pas de mécanisme interne pour gérer les conflits. 1.168 -À la place, il exécute un programme externe appelé <command>hgmerge</command>. 1.169 -Il s'agit d'un script shell qui est embarqué par Mercurial, vous 1.170 -pouvez le modifier si vous le voulez. Ce qu'il fait par défaut est 1.171 -d'essayer de trouver un des différents outils de fusion qui seront 1.172 -probablement installés sur le système. Il commence par les outils 1.173 -totalement automatiques, et si ils échouent (parce que la résolution 1.174 -du conflit nécessite une intervention humaine) ou si ils sont absents, 1.175 -le script tente d'exécuter certains outils graphiques de fusion. 1.176 -</para> 1.177 - 1.178 -<para>Il est aussi possible de demander à Mercurial d'exécuter un autre 1.179 -programme ou un autre script au lieu de la commande <command>hgmerge</command>, 1.180 -en définissant la variable d'environnement <envar>HGMERGE</envar> avec le nom 1.181 -du programme de votre choix. 1.182 -</para> 1.183 - 1.184 -<sect2> 1.185 -<title>Utiliser un outil graphique de fusion</title> 1.186 - 1.187 -<para>Mon outil de fusion préféré est <command>kdiff3</command>, que j'utilise ici 1.188 -pour illustrer les fonctionnalités classiques des outils graphiques 1.189 -de fusion. Vous pouvez voir une capture d'écran de l'utilisation de 1.190 -<command>kdiff3</command> dans la figure <xref linkend="fig:tour-merge:kdiff3"/>. Cet outil 1.191 -effectue une <emphasis>fusion \textit{three-way</emphasis>}, car il y a trois différentes 1.192 -versions du fichier qui nous intéresse. Le fichier découpe la partie 1.193 -supérieure de la fenêtre en trois panneaux: 1.194 -</para> 1.195 - 1.196 -<itemizedlist> 1.197 -<listitem><para>A gauche on la version de <emphasis>base</emphasis> du fichier, soit la plus 1.198 - récente version des deux versions qu'on souhaite fusionner. 1.199 -</para> 1.200 -</listitem> 1.201 -<listitem><para>Au centre, il y a <quote>notre</quote> version du fichier, avec le contenu 1.202 - que nous avons modifié. 1.203 -</para> 1.204 -</listitem> 1.205 -<listitem><para>Sur la droite, on trouve <quote>leur</quote> version du fichier, celui qui 1.206 - contient le \textit{changeset} que nous souhaitons intégré. 1.207 -</para> 1.208 -</listitem></itemizedlist> 1.209 - 1.210 -<para>Dans le panneau en dessous, on trouve le <emphasis>résultat</emphasis> actuel de notre 1.211 -fusion. Notre tâche consiste donc à remplacement tous les textes en rouges, 1.212 -qui indiquent des conflits non résolus, avec une fusion manuelle et pertinente 1.213 -de <quote>notre</quote> version et de la <quote>leur</quote>. 1.214 -</para> 1.215 - 1.216 -<para>Tous les quatre panneaux sont <emphasis>accrochés ensemble</emphasis>, si nous déroulons 1.217 -les ascenseurs verticalement ou horizontalement dans chacun d'entre eux, les 1.218 -autres sont mis à jour avec la section correspondante dans leurs fichiers 1.219 -respectifs. 1.220 -</para> 1.221 - 1.222 -<informalfigure> 1.223 - 1.224 -<para> <mediaobject><imageobject><imagedata fileref="kdiff3"/></imageobject><textobject><phrase>XXX add text</phrase></textobject></mediaobject> 1.225 - <caption><para>Utilisation de \command{kdiff3</para></caption> pour fusionner différentes versions 1.226 - d'un fichier.} 1.227 - \label{fig:tour-merge:kdiff3} 1.228 -</para> 1.229 -</informalfigure> 1.230 - 1.231 -<para>Pour chaque portion de fichier posant problème, nous pouvons choisir 1.232 -de résoudre le conflit en utilisant une combinaison 1.233 -de texte depuis la version de base, la notre, ou la leur. Nous pouvons 1.234 -aussi éditer manuellement les fichiers à tout moment, si c'est 1.235 -nécessaire. 1.236 -</para> 1.237 - 1.238 -<para>Il y a <emphasis>beaucoup</emphasis> d'outils de fusion disponibles, bien trop pour 1.239 -en parler de tous ici. Leurs disponibilités varient selon les plate formes 1.240 -ainsi que leurs avantages et inconvénients. La plupart sont optimisé pour 1.241 -la fusion de fichier contenant un texte plat, certains sont spécialisé 1.242 -dans un format de fichier précis (généralement XML). 1.243 -</para> 1.244 - 1.245 -</sect2> 1.246 -<sect2> 1.247 -<title>Un exemple concret</title> 1.248 - 1.249 -<para>Dans cet exemple, nous allons reproduire la modification de l'historique 1.250 -du fichier de la figure <xref linkend="fig:tour-merge:conflict"/> ci dessus. Commençons 1.251 -par créer un dépôt avec une version de base de notre document. 1.252 -</para> 1.253 - 1.254 -<para><!-- &interaction.tour-merge-conflict.wife; --> 1.255 -Créons un clone de ce dépôt et faisons une modification dans le fichier. 1.256 -<!-- &interaction.tour-merge-conflict.cousin; --> 1.257 -Et un autre clone, pour simuler que quelqu'un d'autre effectue une 1.258 -modification sur le fichier. (Ceci pour suggérer qu'il n'est pas rare 1.259 -de devoir effectuer des \textit{merge} avec vos propres travaux quand 1.260 -vous isolez les tâches dans des dépôts distincts. En effet, vous 1.261 -aurez alors à trouver et résoudre certains conflits). 1.262 -<!-- &interaction.tour-merge-conflict.son; --> 1.263 -Maintenant que ces deux versions différentes du même fichier sont 1.264 -créées, nous allons configurer l'environnement de manière appropriée pour 1.265 -exécuter notre \textit{merge}. 1.266 -<!-- &interaction.tour-merge-conflict.pull; --> 1.267 -</para> 1.268 - 1.269 -<para>Dans cette exemple, je n'utiliserais pas la commande Mercurial 1.270 -habituelle <command>hgmerge</command> pour effectuer le \textit{merge}, 1.271 -car il me faudrait abandonner ce joli petit exemple automatisé 1.272 -pour utiliser un outil graphique. À la place, je vais définir 1.273 -la variable d'environnement <envar>HGMERGE</envar> pour indiquer à 1.274 -Mercurial d'utiliser la commande non-interactive <command>merge</command>. 1.275 -Cette dernière est embarquée par de nombreux systèmes <quote>à la Unix</quote>. 1.276 -Si vous exécutez cet exemple depuis votre ordinateur, ne vous 1.277 -occupez pas de définir <envar>HGMERGE</envar>. 1.278 -<!-- &interaction.tour-merge-conflict.merge; --> 1.279 -Parce que <command>merge</command> ne peut pas résoudre les modifications 1.280 -conflictuelles, il laisse des <emphasis>marqueurs de différences</emphasis> 1.281 -\footnote{NdT: Oui, je traduis \textit{merge markers} par un sens 1.282 -inverse en Français, mais je pense vraiment que c'est plus clair 1.283 -comme ça...} à l'intérieur du fichier qui a des conflits, indiquant 1.284 -clairement quelles lignes sont en conflits, et si elles viennent de 1.285 -notre fichier ou du fichier externe. 1.286 -</para> 1.287 - 1.288 -<para>Mercurial peut distinguer, à la manière dont la commande <command>merge</command> 1.289 -se termine, qu'elle n'a pas été capable d'effectuer le \textit{merge}, 1.290 -alors il nous indique que nous devons effectuer de nouveau cette 1.291 -opération. Ceci peut être très utile si, par exemple, nous exécutons un 1.292 -outil graphique de fusion et que nous le quittons sans nous rendre compte 1.293 -qu'il reste des conflits ou simplement par erreur. 1.294 -</para> 1.295 - 1.296 -<para>Si le \textit{merge} automatique ou manuel échoue, il n'y a rien pour 1.297 -nous empêcher de <quote>corriger le tir</quote> en modifiant nous même les fichiers, 1.298 -et enfin effectuer le \textit{commit} du fichier: 1.299 -<!-- &interaction.tour-merge-conflict.commit; --> 1.300 -</para> 1.301 - 1.302 -</sect2> 1.303 -</sect1> 1.304 -<sect1> 1.305 -<title>Simplification de la séquence pull-merge-commit</title> 1.306 -<para>\label{sec:tour-merge:fetch} 1.307 -</para> 1.308 - 1.309 -<para>La procédure pour effectuer la fusion indiquée ci-dessus est simple, 1.310 -mais requiert le lancement de trois commandes à la suite. 1.311 -</para> 1.312 -<programlisting> 1.313 -<para> hg pull 1.314 - hg merge 1.315 - hg commit -m 'Merged remote changes' 1.316 -</para> 1.317 -</programlisting> 1.318 - 1.319 -<para>Lors du \textit{commit} final, vous devez également saisir un message, 1.320 -qui aura vraisemblablement assez peu d'intérêt. 1.321 -</para> 1.322 - 1.323 -<para>Il serait assez sympathique de pouvoir réduire le nombre d'opérations 1.324 -nécessaire, si possible. De fait Mercurial est fourni avec une 1.325 -extension appelé <literal role="hg-ext">fetch</literal> qui fait justement cela. 1.326 -</para> 1.327 - 1.328 -<para>Mercurial fourni un mécanisme d'extension flexible qui permet à chacun 1.329 -d'étendre ces fonctionnalités, tout en conservant le cœur de Mercurial 1.330 -léger et facile à utiliser. Certains extensions ajoutent de nouvelles 1.331 -commandes que vous pouvez utiliser en ligne de commande, alors que 1.332 -d'autres travaillent <quote>en coulisse,</quote> par exemple en ajoutant des 1.333 -possibilités au serveur. 1.334 -</para> 1.335 - 1.336 -<para>L'extension <literal role="hg-ext">fetch</literal> ajoute une nouvelle commande nommée, sans 1.337 -surprise, <command role="hg-cmd">hg fetch</command>. Cette extension résulte en une combinaison 1.338 -de <command role="hg-cmd">hg pull</command>, <command role="hg-cmd">hg update</command> and <command role="hg-cmd">hg merge</command>. Elle commence par 1.339 -récupérer les modifications d'un autre dépôt dans le dépôt courant. 1.340 -Si elle trouve que les modifications ajoutent une nouvelle \textit{head}, 1.341 -elle effectue un \textit{merge}, et ensuite \texit{commit} le résultat 1.342 -du \textit{merge} avec un message généré automatiquement. Si aucune 1.343 -\textit{head} n'ont été ajouté, elle met à jour le répertoire de travail 1.344 -au niveau du nouveau \textit{changeset} \textit{tip}. 1.345 -</para> 1.346 - 1.347 - 1.348 -<para>Activer l'extension <literal role="hg-ext">fetch</literal> est facile. Modifiez votre <filename role="special">.hgrc</filename>, 1.349 -et soit allez à la section <literal role="rc-extensions">extensions</literal> soit créer une 1.350 -section <literal role="rc-extensions">extensions</literal>. Ensuite ajoutez une ligne qui consiste 1.351 -simplement en <quote>\Verb+fetch =</quote>. 1.352 -</para> 1.353 - 1.354 -<programlisting> 1.355 -<para> [extensions] 1.356 - fetch = 1.357 -</para> 1.358 -</programlisting> 1.359 -<para>(Normalement, sur la partie droite de <quote><literal>=</literal></quote> devrait apparaître 1.360 -le chemin de l'extension, mais étant donné que l'extension <literal role="hg-ext">fetch</literal> 1.361 -fait partie de la distribution standard, Mercurial sait où la trouver.) 1.362 -</para> 1.363 - 1.364 -</sect1> 1.365 + <listitem> 1.366 + <para id="x_33a">Alice et Bob ont chacun une copie personnelle du dépôt d'un 1.367 + projet sur lequel ils collaborent. Alice corrige un bug 1.368 + dans son dépôt, et Bob ajoute une nouvelle fonctionnalité dans le 1.369 + sien. Ils veulent un dépôt partagé avec à la fois le correctif du 1.370 + bug et la nouvelle fonctionnalité.</para> 1.371 + </listitem> 1.372 + <listitem> 1.373 + <para id="x_33b">Je travaille régulièrement sur plusieurs tâches différentes sur 1.374 + un seul projet en même temps, chacun isolé dans son propre dépôt. 1.375 + Travailler ainsi signifie que je dois régulièrement fusionner une 1.376 + partie de mon code avec celui des autres.</para> 1.377 + </listitem> 1.378 + </itemizedlist> 1.379 + 1.380 + <para id="x_33c">Parce que la fusion est une opération si commune à réaliser, 1.381 + Mercurial la rend facile. Étudions ensemble le déroulement des 1.382 + opérations. Nous commencerons encore par faire un clone d'un autre 1.383 + dépôt (vous voyez que l'on fait ça tout le temps ?) puis nous ferons 1.384 + quelques modifications dessus.</para> 1.385 + 1.386 + &interaction.tour.merge.clone; 1.387 + 1.388 + <para id="x_33d">Nous devrions avoir maintenant deux copies de 1.389 + <filename>hello.c</filename> avec des contenus différents. Les 1.390 + historiques de ces deux dépôts ont aussi divergés, comme illustré dans 1.391 + la figure <xref linkend="fig:tour-merge:sep-repos"/>.</para> 1.392 + 1.393 + &interaction.tour.merge.cat1; 1.394 + 1.395 + <para id="x_722">Et ici est notre légèrement différente version du 1.396 + dépôt.</para> 1.397 + 1.398 + &interaction.tour.merge.cat2; 1.399 + 1.400 + <figure id="fig:tour-merge:sep-repos"> 1.401 + <title>Historique divergent des dépôts <filename 1.402 + class="directory">my-hello</filename> et <filename 1.403 + class="directory">my-new-hello</filename>.</title> 1.404 + <mediaobject> 1.405 + <imageobject><imagedata fileref="figs/tour-merge-sep-repos.png"/></imageobject> 1.406 + <textobject><phrase>XXX ajoute un test</phrase></textobject> 1.407 + </mediaobject> 1.408 + </figure> 1.409 + 1.410 + <para id="x_33f">Nous savons déjà que récupérer les modifications depuis 1.411 + notre dépôt <filename class="directory">my-hello</filename> n'aura 1.412 + aucun effet sur l'espace de travail.</para> 1.413 + 1.414 + &interaction.tour.merge.pull; 1.415 + 1.416 + <para id="x_340">Néanmoins, la commande <command role="hg-cmd">hg 1.417 + pull</command> nous indique quelque chose au sujet des 1.418 + <quote>heads</quote>.</para> 1.419 + 1.420 + <sect2> 1.421 + <title>Les révisions 'heads'</title> 1.422 + 1.423 + <para id="x_341">Rappellez vous que Mercurial enregistre quelle révision 1.424 + est le parent de chaque révision. Si une révision a un parent, nous 1.425 + l'appelons un enfant(child) ou un descendant de ce parent. Une 1.426 + "head" est une révision qui n'a donc pas d'enfant. La révision tip 1.427 + est donc une "head", car c'est la révision la plus récente du dépôt 1.428 + qui n'a pas d'enfant. Il y a des moments où un dépôt peut contenir 1.429 + plusieurs "head".</para> 1.430 + 1.431 + <figure> 1.432 + <title>Contenu du dépôt après une récupération ("pull") depuis le 1.433 + dépôt <filename 1.434 + class="directory">my-hello</filename> vers le dépôt <filename 1.435 + class="directory">my-new-hello</filename></title> 1.436 + <mediaobject> 1.437 + <imageobject> 1.438 + <imagedata fileref="tour-merge-pull"/> 1.439 + </imageobject> 1.440 + <textobject><phrase>XXX ajoute un texte</phrase></textobject> 1.441 + </mediaobject> 1.442 + </figure> 1.443 + 1.444 + <para id="x_343">Dans la figure <xref linkend="fig:tour-merge:pull"/>, 1.445 + vous pouvez constater l'effet d'un \textit{pull} depuis le dépôt 1.446 + <filename class="directory">my-hello</filename> dans le dépôt 1.447 + <filename class="directory">my-new-hello</filename>. L'historique qui 1.448 + était déjà présent dans le dépôt <filename 1.449 + class="directory">my-new-hello</filename> reste intact, mais une 1.450 + nouvelle révision a été ajoutée. En vous reportant à la figure <xref 1.451 + linkend="fig:tour-merge:sep-repos"/>, vous pouvez voir que le 1.452 + <emphasis>ID de révision (changeset ID)</emphasis> reste le même dans 1.453 + le nouveau dépôt, mais que le <emphasis>numéro de 1.454 + révision</emphasis> reste le même. (Ceci est un parfait exemple de 1.455 + pourquoi il n'est fiable d'utiliser les numéros de révision lorsque 1.456 + l'on discute d'un \textit{changeset}.) Vous pouvez voir les "heads" 1.457 + présentes dans le dépôt en utilisant la commande <command 1.458 + role="hg-cmd">hg heads</command>.</para> 1.459 + 1.460 + &interaction.tour.merge.heads; 1.461 + </sect2> 1.462 + 1.463 + <sect2> 1.464 + <title>Effectuer la fusion</title> 1.465 + 1.466 + <para id="x_344">Que se passe-t-il quand vous essayez d'utiliser la 1.467 + commande <command role="hg-cmd">hg update</command> pour mettre à 1.468 + jour votre espace de travail au nouveau "tip"</para> 1.469 + 1.470 + &interaction.tour.merge.update; 1.471 + 1.472 + 1.473 + <para id="x_345">Mercurial nous prévient que la commande <command 1.474 + role="hg-cmd">hg update</command> n'effectuera pas 1.475 + la fusion, il ne veut pas mettre à jour l'espace de travail quand il 1.476 + estime que nous pourrions avoir besoin d'une fusion, à moins de lui 1.477 + forcer la main. À la place, il faut utiliser la commande <command 1.478 + role="hg-cmd">hg merge</command> pour fusionner les deux 1.479 + "heads".</para> 1.480 + 1.481 + <para id="x_723">Pour commencer une fusion (merge) entre deux "heads", 1.482 + nous utilisons la commande <command role="hg-cmd">hg merge</command>.</para> 1.483 + 1.484 + &interaction.tour.merge.merge; 1.485 + 1.486 + <para id="x_347">Nous résolvons les conflits dans le fichier 1.487 + <filename>hello.c</filename>. Ceci met à jour le répertoire de travail 1.488 + de sorte qu'il ne contienne les modifications ne provenance des 1.489 + <emphasis>deux</emphasis> "heads", ce qui est indiqué par la 1.490 + la sortie de la commande <command role="hg-cmd">hg 1.491 + parents</command> et le contenu du fichier 1.492 + <filename>hello.c</filename>.</para> 1.493 + 1.494 + &interaction.tour.merge.parents; 1.495 + </sect2> 1.496 + 1.497 + <sect2> 1.498 + <title>Effectuer l'ajout (commit) du résultat de la fusion</title> 1.499 + 1.500 + <para id="x_348">Dès l'instant où vous avez effectué une fusion 1.501 + (merge), <command role="hg-cmd">hg parents</command> vous 1.502 + affichera deux parents, avant que vous n'exécutiez la commande 1.503 + <command role="hg-cmd">hg commit</command> sur le résultat de la 1.504 + fusion.</para> 1.505 + 1.506 + &interaction.tour.merge.commit; 1.507 + 1.508 + <para id="x_349">Nous avons maintenant un nouveau tip, remarquer qu'il 1.509 + contient <emphasis>à la fois</emphasis> nos anciennes "heads" et leurs 1.510 + parents. Ce sont les mêmes révisions que nous avions affichées avec 1.511 + la commande <command role="hg-cmd">hg parents</command>.</para> 1.512 + 1.513 + &interaction.tour.merge.tip; 1.514 + 1.515 + <para id="x_34a">Dans la figure <xref linkend="fig:tour-merge:merge"/>, 1.516 + vous pouvez voir une représentation de ce qui se passe dans l'espace 1.517 + de travail pendant la fusion, et comment ceci affecte le dépôt lors 1.518 + du "commit". Pendant la fusion, l'espace de travail, qui a deux 1.519 + révisions (changesets) comme parents, voit ces derniers devenir le parent 1.520 + d'une nouvelle révision (changeset).</para> 1.521 + 1.522 + <figure id="fig:tour-merge:merge"> 1.523 + <title>Working directory and repository during merge, and 1.524 + following commit</title> 1.525 + <mediaobject> 1.526 + <imageobject> 1.527 + <imagedata fileref="figs/tour-merge-merge.png"/> 1.528 + </imageobject> 1.529 + <textobject><phrase>XXX ajoute texte</phrase></textobject> 1.530 + </mediaobject> 1.531 + </figure> 1.532 + 1.533 + </sect2> 1.534 + </sect1> 1.535 + 1.536 + <sect1> 1.537 + <title>Fusionner les modifications en conflit</title> 1.538 + 1.539 + <para id="x_34b">La plupart des fusions sont assez simple à réaliser, mais 1.540 + parfois vous vous retrouverez à fusionner des fichiers où la modification 1.541 + touche la même portion de code, au sein d'un même fichier. À moins 1.542 + que ces modification ne soient identiques, ceci aboutira à un 1.543 + <emphasis>conflit</emphasis>, et vous devrez décider comment réconcilier 1.544 + les différentes modifications dans un tout cohérent.</para> 1.545 + 1.546 + <figure> 1.547 + <title>Modifications en conflits dans un document</title> 1.548 + <mediaobject> 1.549 + <imageobject><imagedata fileref="tour-merge-conflict"/></imageobject> 1.550 + <textobject><phrase>XXX ajoute texte</phrase></textobject> 1.551 + </mediaobject> 1.552 + </figure> 1.553 + 1.554 + <para id="x_34d">La figure <xref linkend="fig:tour-merge:conflict"/> 1.555 + illustre un cas de modifications conflictuelles dans un document. Nous 1.556 + avons commencé avec une version simple de ce fichier, puis nous avons 1.557 + ajouté des modifications, pendant que quelqu'un d'autre modifiait le même 1.558 + texte. Notre tâche dans la résolution du conflit est de décider à quoi le 1.559 + fichier devrait ressembler.</para> 1.560 + 1.561 + <para id="x_34e">Mercurial n'a pas de mécanisme interne pour gérer 1.562 + les conflits. À la place, il exécute un programme externe appelé 1.563 + <command>hgmerge</command>. Il s'agit d'un script shell qui est 1.564 + embarqué par Mercurial, vous pouvez le modifier si vous le voulez. 1.565 + Ce qu'il fait par défaut est d'essayer de trouver un des différents 1.566 + outils de fusion qui seront probablement installés sur le système. 1.567 + Il commence par les outils totalement automatiques, et si ils 1.568 + échouent (parce que la résolution du conflit nécessite une 1.569 + intervention humaine) ou si ils sont absents, le script tente 1.570 + d'exécuter certains outils graphiques de fusion.</para> 1.571 + 1.572 + <para id="x_34f">Il est aussi possible de demander à Mercurial d'exécuter 1.573 + un autre programme ou un autre script en définissant la variable 1.574 + d'environnement <envar>HGMERGE</envar> avec le nom 1.575 + du programme de votre choix.</para> 1.576 + 1.577 + <sect2> 1.578 + <title>Utiliser un outil graphique de fusion</title> 1.579 + 1.580 + <para id="x_350">Mon outil de fusion préféré est 1.581 + <command>kdiff3</command>, que j'utilise ici pour illustrer les 1.582 + fonctionnalités classiques des outils graphiques de fusion. Vous pouvez 1.583 + voir une capture d'écran de l'utilisation de <command>kdiff3</command> 1.584 + dans la figure <xref linkend="fig:tour-merge:kdiff3"/>. Cet outil 1.585 + effectue une <emphasis>fusion \textit{three-way</emphasis>}, car il y a 1.586 + trois différentes versions du fichier qui nous intéresse. Le fichier 1.587 + découpe la partie supérieure de la fenêtre en trois panneaux:</para> 1.588 + <itemizedlist> 1.589 + <listitem><para id="x_351">A gauche on la version de 1.590 + <emphasis>base</emphasis> du fichier, soit la plus récente version 1.591 + des deux versions qu'on souhaite fusionner.</para></listitem> 1.592 + <listitem><para id="x_352">Au centre, il y a <quote>notre</quote> 1.593 + version du fichier, avec le contenu que nous avons modifié.</para></listitem> 1.594 + <listitem><para id="x_353">Sur la droite, on trouve 1.595 + <quote>leur</quote> version du fichier, celui qui contient la 1.596 + révision que nous souhaitons intégré.</para> 1.597 + </listitem></itemizedlist> 1.598 + <para id="x_354">Dans le panneau en dessous, on trouve le 1.599 + <emphasis>résultat</emphasis> actuel de notre fusion. Notre tâche 1.600 + consiste donc à remplacement tous les textes en rouges, 1.601 + qui indiquent des conflits non résolus, avec une fusion manuelle et 1.602 + pertinente de <quote>notre</quote> version et de la <quote>leur</quote>. 1.603 + </para> 1.604 + 1.605 + <para id="">Tous les quatre panneaux sont <emphasis>accrochés ensemble</emphasis>, 1.606 + si nous déroulons les ascenseurs verticalement ou horizontalement dans chacun 1.607 + d'entre eux, les autres sont mis à jour avec la section correspondante dans leurs 1.608 + fichiers respectifs.</para> 1.609 + 1.610 + <figure id="fig:tour-merge:kdiff3"> 1.611 + <title>Utiliser <command>kdiff3</command> pour fusionner les 1.612 + différentes version d'un fichier.</title> 1.613 + <mediaobject> 1.614 + <imageobject> 1.615 + <imagedata width="100%" fileref="figs/kdiff3.png"/></imageobject> 1.616 + <textobject> 1.617 + <phrase>XXX ajoute texte</phrase> 1.618 + </textobject> 1.619 + </mediaobject> 1.620 + </figure> 1.621 + 1.622 + <para id="x_357">Pour chaque portion de fichier posant problème, nous 1.623 + pouvons choisir de résoudre le conflit en utilisant une combinaison de 1.624 + texte depuis la version de base, la notre, ou la leur. Nous pouvons 1.625 + aussi éditer manuellement les fichiers à tout moment, si c'est nécessaire.</para> 1.626 + 1.627 + <para id="x_358">Il y a <emphasis>beaucoup</emphasis> d'outils de 1.628 + fusion disponibles, bien trop pour en parler de tous ici. Leurs 1.629 + disponibilités varient selon les plate formes ainsi que leurs 1.630 + avantages et inconvénients. La plupart sont optimisé pour 1.631 + la fusion de fichier contenant un texte plat, certains sont spécialisé 1.632 + dans un format de fichier précis (généralement XML).</para> 1.633 + </sect2> 1.634 + 1.635 + <sect2> 1.636 + <title>Un exemple concret</title> 1.637 + 1.638 + <para id="x_359">Dans cet exemple, nous allons reproduire la 1.639 + modification de l'historique du fichier de la figure <xref 1.640 + linkend="fig:tour-merge:conflict"/> ci dessus. Commençons par créer 1.641 + un dépôt avec une version de base de notre document.</para> 1.642 + 1.643 + &interaction.tour-merge-conflict.wife; 1.644 + 1.645 + <para id="x_35a">Créons un clone de ce dépôt et faisons une 1.646 + modification dans le fichier.</para> 1.647 + 1.648 + &interaction.tour-merge-conflict.cousin; 1.649 + 1.650 + <para id="x_35b">Et un autre clone, pour simuler que quelqu'un d'autre effectue une 1.651 + modification sur le fichier. (Ceci pour suggérer qu'il n'est pas rare 1.652 + de devoir effectuer des fusions (merges) avec vos propres travaux quand 1.653 + vous isolez les tâches dans des dépôts distincts. En effet, vous 1.654 + aurez alors à trouver et résoudre certains conflits).</para> 1.655 + 1.656 + &interaction.tour-merge-conflict.son; 1.657 + 1.658 + <para id="x_35c">Maintenant que ces deux versions différentes du même fichier sont 1.659 + créées, nous allons configurer l'environnement de manière appropriée pour 1.660 + exécuter notre fusion (merge).</para> 1.661 + 1.662 + &interaction.tour-merge-conflict.pull; 1.663 + 1.664 + <para id="x_35d">Dans cette exemple, je n'utiliserais pas la commande Mercurial 1.665 + habituelle <command>hgmerge</command> pour effectuer le 1.666 + fusion (merge), car il me faudrait abandonner ce joli petit exemple automatisé 1.667 + pour utiliser un outil graphique. À la place, je vais définir la 1.668 + variable d'environnement <envar>HGMERGE</envar> pour indiquer à 1.669 + Mercurial d'utiliser la commande non-interactive <command>merge</command>. 1.670 + Cette dernière est embarquée par de nombreux systèmes <quote>à la Unix</quote>. 1.671 + Si vous exécutez cet exemple depuis votre ordinateur, ne vous 1.672 + occupez pas de définir <envar>HGMERGE</envar>.</para> 1.673 + 1.674 + &interaction.tour-merge-conflict.merge; 1.675 + 1.676 + 1.677 + <para id="x_35f">Parce que <command>merge</command> ne peut pas résoudre 1.678 + les modifications conflictuelles, il laisse des <emphasis>marqueurs de 1.679 + différences</emphasis> à l'intérieur du fichier qui a des conflits, 1.680 + indiquant clairement quelles lignes sont en conflits, et si elles 1.681 + viennent de notre fichier ou du fichier externe. 1.682 + </para> 1.683 + 1.684 + <para id="x_360">Mercurial peut distinguer, à la manière dont la 1.685 + commande <command>merge</command> se termine, qu'elle n'a pas été 1.686 + capable d'effectuer la fusion (merge), alors il nous indique que nous 1.687 + devons effectuer de nouveau cette opération. Ceci peut être très utile 1.688 + si, par exemple, nous exécutons un outil graphique de fusion et que 1.689 + nous le quittons sans nous rendre compte qu'il reste des conflits ou 1.690 + simplement par erreur.</para> 1.691 + 1.692 + <para id="x_361">Si la fusion (merge) automatique ou manuelle échoue, 1.693 + il n'y a rien pour nous empêcher de <quote>corriger le tir</quote> en 1.694 + modifiant nous même les fichiers, et enfin effectuer le "commit" du 1.695 + fichier:</para> 1.696 + 1.697 + &interaction.tour-merge-conflict.commit; 1.698 + 1.699 + <note> 1.700 + <title>Où est la <ocmmand>hg resolve</ocmmand> ?</title> 1.701 + 1.702 + <para id="x_724">La commande <command>hg resolve</command> a été 1.703 + introduit dans la version 1.1 de Mercurial, qui a été publié en 1.704 + décembre 2008. Si vous utilisez une version plus anciennne de 1.705 + Mercurial (exécutez la command <command>hg version</command> pour en 1.706 + avoir le coeur net), cette commande ne sera pas disponible. Si votre 1.707 + version de Mercurial est plus ancienne que la 1.1, vous devriez très 1.708 + fortement considérer une mise à jour à une version plus récente avant 1.709 + d'essayer de régler des fusions complexes.</para> 1.710 + </note> 1.711 + </sect2> 1.712 + </sect1> 1.713 + 1.714 + <sect1 id="sec:tour-merge:fetch"> 1.715 + <title>Simplification de la séquence pull-merge-commit</title> 1.716 + 1.717 + <para id="x_362">La procédure pour effectuer la fusion indiquée 1.718 + ci-dessus est simple, mais requiert le lancement de trois commandes à la 1.719 + suite.</para> 1.720 + 1.721 + <programlisting>hg pull -u 1.722 +hg merge 1.723 +hg commit -m 'Merged remote changes'</programlisting> 1.724 + 1.725 + <para id="x_363">Lors du "commit" final, vous devez également saisir un 1.726 + message, qui aura vraisemblablement assez peu d'intérêt.</para> 1.727 + 1.728 + <para id="x_364">Il serait assez sympathique de pouvoir réduire le 1.729 + nombre d'opérations nécessaire, si possible. De fait Mercurial est 1.730 + fourni avec une extension appelé <literal role="hg-ext">fetch</literal> 1.731 + qui fait justement cela.</para> 1.732 + 1.733 + <para id="x_365">Mercurial fourni un mécanisme d'extension flexible qui permet à chacun 1.734 + d'étendre ces fonctionnalités, tout en conservant le cœur de Mercurial 1.735 + léger et facile à utiliser. Certains extensions ajoutent de nouvelles 1.736 + commandes que vous pouvez utiliser en ligne de commande, alors que 1.737 + d'autres travaillent <quote>en coulisse,</quote> par exemple en ajoutant des 1.738 + possibilités au serveur.</para> 1.739 + 1.740 + <para id="x_366">L'extension <literal role="hg-ext">fetch</literal> 1.741 + ajoute une nouvelle commande nommée, sans surprise, <command 1.742 + role="hg-cmd">hg fetch</command>. Cette extension résulte en une 1.743 + combinaison de <command role="hg-cmd">hg pull</command>, <command 1.744 + role="hg-cmd">hg update</command> and <command role="hg-cmd">hg 1.745 + merge</command>. Elle commence par récupérer les modifications d'un 1.746 + autre dépôt dans le dépôt courant. Si elle trouve que les 1.747 + modifications ajoutent une nouvelle "head", elle effectue un "merge", 1.748 + et ensuite "commit" le résultat du "merge" avec un message généré 1.749 + automatiquement. Si aucune "head" n'ont été ajouté, elle met à jour le 1.750 + répertoire de travail au niveau de la nouvelle révision tip.</para> 1.751 + 1.752 + <para id="x_367">Activer l'extension <literal 1.753 + role="hg-ext">fetch</literal> est facile. Modifiez votre <filename 1.754 + role="special">.hgrc</filename>, et soit allez à la section <literal 1.755 + role="rc-extensions">extensions</literal> soit créer une section 1.756 + <literal role="rc-extensions">extensions</literal>. Ensuite ajoutez 1.757 + une ligne qui consiste simplement en <quote>\Verb+fetch =</quote>.</para> 1.758 + 1.759 + <programlisting>[extensions] 1.760 +fetch =</programlisting> 1.761 + 1.762 + <para id="x_368">(Normalement, sur la partie droite de 1.763 + <quote><literal>=</literal></quote> devrait apparaître le chemin de 1.764 + l'extension, mais étant donné que l'extension <literal 1.765 + role="hg-ext">fetch</literal> fait partie de la distribution standard, 1.766 + Mercurial sait où la trouver.) </para> 1.767 + 1.768 + </sect1> 1.769 + 1.770 + <sect1> 1.771 + <title>Renommer, copier, et fusionner (merge)</title> 1.772 + 1.773 + <para id="x_729">En cours de la vie d'un projet, nous allons souvent 1.774 + vouloir changer la disposition de ses fichiers et de ses répertoires. 1.775 + Ceci peut être aussi simple que de changer le nom d'un seul fichier, 1.776 + et aussi compliqué que de restructurer une hiérarchie entiere de fichier 1.777 + au sein du projet.</para> 1.778 + 1.779 + <para id="x_72a">Mercurial permet de faire ce genre de modification de 1.780 + manière fluide, à condition de l'informer de ce que nous faisons. Si 1.781 + vous voulez renommenr un ficher, vous devriez utiliser les commande 1.782 + <command>hg rename</command><footnote> 1.783 + <para id="x_72b">Si vous un utilisateur de Unix, vous serez content 1.784 + de savoir que la commande <command>hg rename</command> command 1.785 + peut être abrégée en <command>hg mv</command>.</para> 1.786 + </footnote> pour changer son nom, ainsi Mercurial peut ensuite prendre 1.787 + la bonne décision, plus tard, en cas de fusionv (merge).</para> 1.788 + 1.789 + <para id="x_72c">Nous étudierojns en détail l'utilisation de ces commandes, 1.790 + en détail, dans le chapitre <xref linkend="chap:daily.copy"/>.</para> 1.791 + </sect1> 1.792 </chapter> 1.793 1.794 <!--