# HG changeset patch # User Romain PELISSE # Date 1234976549 -3600 # Node ID e77ede0fdef84b384a942b384c71afd84c445512 # Parent f2cd9743c47354044f65ae6c38a4ede2d316007e Two third of tour-merge.tex done diff -r f2cd9743c473 -r e77ede0fdef8 fr/tour-merge.tex --- a/fr/tour-merge.tex Tue Feb 17 23:10:44 2009 +0100 +++ b/fr/tour-merge.tex Wed Feb 18 18:02:29 2009 +0100 @@ -1,98 +1,111 @@ -\chapter{A tour of Mercurial: merging work} +\chapter{Un rapide tour de Mercurial: fusionner les travaux} \label{chap:tour-merge} -We've now covered cloning a repository, making changes in a -repository, and pulling or pushing changes from one repository into -another. Our next step is \emph{merging} changes from separate -repositories. - -\section{Merging streams of work} - -Merging is a fundamental part of working with a distributed revision -control tool. +Nous avons maintenons étudié comment clôner un dépôt, effectuer +des changements dedans, et récupérer ou transférer depuis un +autre dépôt. La prochaine étape est donc de \emph{fusionner} les +modifications de différents dépôts. + +\section{Fusionner différents travaux} %%%TODO: better translation + %%% for 'Merging streams of work' ? +La fusion\footnote{NdT: Je garde fusion mais le jargon professionnel +employera généralement le terme \textit{merge}.} est un aspect +fondamental lorsqu'on travail avec un gestionnaire de source +distribé. \begin{itemize} -\item Alice and Bob each have a personal copy of a repository for a - project they're collaborating on. Alice fixes a bug in her - repository; Bob adds a new feature in his. They want the shared - repository to contain both the bug fix and the new feature. -\item I frequently work on several different tasks for a single - project at once, each safely isolated in its own repository. - Working this way means that I often need to merge one piece of my - own work with another. +\item Alice et Bob ont chacun une copie personnelle du dépôt d'un + projet sur lequel ils collaborent. Alice corrige un \textit{bug} + dans son dépôt, et Bob ajoute une nouvelle fonctionnalité dans le + sien. Ils veulent un dépôt partagé avec à la fois le correctif du + \textit{bug} et la nouvelle fonctionnalité. +\item Je travaille régulièrement sur plusieurs tâches différentes sur + un seul projet en même temps, chacun isolée dans son propre dépôt. + Travailler ainsi signifie que je dois régulièrement fusionner une + partie de mon code avec celui des autres. \end{itemize} -Because merging is such a common thing to need to do, Mercurial makes -it easy. Let's walk through the process. We'll begin by cloning yet -another repository (see how often they spring up?) and making a change -in it. +Parce que la fusion est une opération si commune que je dois réaliser, +Mercurial la rend facile. Etudions ensemble le déroulement des opérations. +Nous commencerons par faire un clone d'encore un autre dépôt (vous voyez +comment on fait ça tout le temps ?) puis nous ferons quelques modifications +dessus. \interaction{tour.merge.clone} -We should now have two copies of \filename{hello.c} with different -contents. The histories of the two repositories have also diverged, -as illustrated in figure~\ref{fig:tour-merge:sep-repos}. +Nous devrions avoir maintenant deux copies de \filename{hello.c} avec +des contenus différents. Les historiques de ces deux dépôts ont aussi +divergés, comme illustré dans la figure~\ref{fig:tour-merge:sep-repos}. + \interaction{tour.merge.cat} \begin{figure}[ht] \centering \grafix{tour-merge-sep-repos} - \caption{Divergent recent histories of the \dirname{my-hello} and - \dirname{my-new-hello} repositories} + \caption{Historiques récent divergents des dépôts \dirname{my-hello} + et \dirname{my-new-hello}} \label{fig:tour-merge:sep-repos} \end{figure} -We already know that pulling changes from our \dirname{my-hello} -repository will have no effect on the working directory. +Nous savons déjà que récupérer les modifications depuis notre dépôt +\dirname{my-hello} n'aura aucun effet sur l'espace de travail. + \interaction{tour.merge.pull} -However, the \hgcmd{pull} command says something about ``heads''. - -\subsection{Head changesets} - -A head is a change that has no descendants, or children, as they're -also known. The tip revision is thus a head, because the newest -revision in a repository doesn't have any children, but a repository -can contain more than one head. + +Néanmoins, la commande \hgcmd{pull} nous indique quelquechose au +sujet des ``heads''. + +\subsection{\textit{Head changesets}} %%%TODO: Hard (too?) to translate + +Une \textit{head}\footnote{NdT: Je garde \textit{head} que j'accorde +au féminin comme la coutume oral l'a imposée.} est un \textit{changeset} +sans descendants, ou enfants, comme on les désigne parfois. La révision +\textit{tip} est une \textit{head}, car la dernière révision dans un dépôt +n'a aucun enfant, mais il est important de noter qu'un dépôt peut contenir +plus d'une \textit{head}. \begin{figure}[ht] \centering \grafix{tour-merge-pull} - \caption{Repository contents after pulling from \dirname{my-hello} into - \dirname{my-new-hello}} + \caption{Contenu d'un dépôt après avoir transférer le contenu du dépôt + \dirname{my-hello} dans le dépôt \dirname{my-new-hello}} \label{fig:tour-merge:pull} \end{figure} -In figure~\ref{fig:tour-merge:pull}, you can see the effect of the -pull from \dirname{my-hello} into \dirname{my-new-hello}. The history -that was already present in \dirname{my-new-hello} is untouched, but a -new revision has been added. By referring to -figure~\ref{fig:tour-merge:sep-repos}, we can see that the -\emph{changeset ID} remains the same in the new repository, but the -\emph{revision number} has changed. (This, incidentally, is a fine -example of why it's not safe to use revision numbers when discussing -changesets.) We can view the heads in a repository using the -\hgcmd{heads} command. +Dans la figure~\ref{fig:tour-merge:pull}, vous pouvez constater l'effet +d'un \textit{pull} depuis le dépôt \dirname{my-hello} dans le dépôt +\dirname{my-new-hello}. L'historique qui était déjà présent dans le dépôt +\dirname{my-new-hello} reste intact, mais une nouvelle révision a été +ajoutée. En vous reportant à la figure~\ref{fig:tour-merge:sep-repos}, +vous pouvez voir que le \textit{\emph{changeset ID}} reste le même dans +le nouveau dépôt, mais que le \emph{numéro de révision} reste le même. +(Ceci est un parfait exemple de pourquoi il n'est fiable d'utiliser les +numéro de révision lorsque l'on discute d'un \textit{changeset}.) Vous +pouvez voir les \texit{heads} présente dans le dépôt en utilisant la +commande \hgcmd{heads}. \interaction{tour.merge.heads} -\subsection{Performing the merge} - -What happens if we try to use the normal \hgcmd{update} command to -update to the new tip? +\subsection{Effectuer la fusion} + +Que se passe-t-il quand vous essayez d'utiliser la commande \hgcmd{update} +pour mettre à jour votre espace de travail au nouveau \textit{tip}. \interaction{tour.merge.update} -Mercurial is telling us that the \hgcmd{update} command won't do a -merge; it won't update the working directory when it thinks we might -be wanting to do a merge, unless we force it to do so. Instead, we -use the \hgcmd{merge} command to merge the two heads. +Mercurial nous prévient que la commande \hgcmd{update} n'effectuera pas +la fusion, il ne veut pas mettre à jour l'espace de travail quand il +estime que nous pourrions avoir besoin d'une fusion, à moins de lui +forcer la main. À la place, il faut utiliser la commande \hgcmd{merge} +pour fusionner les deux \textit{heads}. \interaction{tour.merge.merge} \begin{figure}[ht] \centering \grafix{tour-merge-merge} - \caption{Working directory and repository during merge, and - following commit} + \caption{Espace de travail et dépôt lors d'une fusion, et dans le + \textit{commit} qui suit.} \label{fig:tour-merge:merge} \end{figure} -This updates the working directory so that it contains changes from -\emph{both} heads, which is reflected in both the output of -\hgcmd{parents} and the contents of \filename{hello.c}. +Ceci met à jour de l'espace de travail de manière à ce qu'il contienne +les modifications des \emph{deux} \textit{heads}, ce qui apparait dans +les sorties de la commande \hgcmd{parents} et le contenu de +\filename{hello.c}. \interaction{tour.merge.parents} \subsection{Committing the results of the merge} @@ -100,95 +113,102 @@ Whenever we've done a merge, \hgcmd{parents} will display two parents until we \hgcmd{commit} the results of the merge. \interaction{tour.merge.commit} -We now have a new tip revision; notice that it has \emph{both} of -our former heads as its parents. These are the same revisions that -were previously displayed by \hgcmd{parents}. +Nous avons maintenant un nouveau \textit{tip}, remarquer qu'il contient +\emph{à la fois} nos anciennes \textit{heads} et leurs parents. Ce sont +les mêmes révisions que nous avions affichés avec la commande +\hgcmd{parents}. + \interaction{tour.merge.tip} -In figure~\ref{fig:tour-merge:merge}, you can see a representation of -what happens to the working directory during the merge, and how this -affects the repository when the commit happens. During the merge, the -working directory has two parent changesets, and these become the -parents of the new changeset. - -\section{Merging conflicting changes} - -Most merges are simple affairs, but sometimes you'll find yourself -merging changes where each modifies the same portions of the same -files. Unless both modifications are identical, this results in a -\emph{conflict}, where you have to decide how to reconcile the -different changes into something coherent. +Dans la figure~\ref{fig:tour-merge:merge}, vous pouvez voir une représentation +de ce qui se passe dans l'espace de travail pendant la fusion, et comment ceci +affecte le dépôt lors du \textit{commit}. Pendant la fusion, l'espace de travail, +qui a deux \texit{changesets} comme parents, voit ces derniers devenir le parent +d'un nouveau \textit{changeset}. + +\section{Fusionner les modifications en conflit} + +La plupart des fusions sont assez simple à réaliser, mais parfois +vous vous trouverez à fusioner des fichiers où la modification touche +la même portion de code, au sein d'un même fichier. À moins que ces +modification ne soient identiques, ceci aboutira à un \emph{conflit}, +et vous devrez décider comment réconcillier les différentes modifications +dans un tout cohérent. \begin{figure}[ht] \centering \grafix{tour-merge-conflict} - \caption{Conflicting changes to a document} + \caption{Modifications conflictuelles dans un document} \label{fig:tour-merge:conflict} \end{figure} -Figure~\ref{fig:tour-merge:conflict} illustrates an instance of two -conflicting changes to a document. We started with a single version -of the file; then we made some changes; while someone else made -different changes to the same text. Our task in resolving the -conflicting changes is to decide what the file should look like. - -Mercurial doesn't have a built-in facility for handling conflicts. -Instead, it runs an external program called \command{hgmerge}. This -is a shell script that is bundled with Mercurial; you can change it to -behave however you please. What it does by default is try to find one -of several different merging tools that are likely to be installed on -your system. It first tries a few fully automatic merging tools; if -these don't succeed (because the resolution process requires human -guidance) or aren't present, the script tries a few different -graphical merging tools. - -It's also possible to get Mercurial to run another program or script -instead of \command{hgmerge}, by setting the \envar{HGMERGE} -environment variable to the name of your preferred program. - -\subsection{Using a graphical merge tool} - -My preferred graphical merge tool is \command{kdiff3}, which I'll use -to describe the features that are common to graphical file merging -tools. You can see a screenshot of \command{kdiff3} in action in -figure~\ref{fig:tour-merge:kdiff3}. The kind of merge it is -performing is called a \emph{three-way merge}, because there are three -different versions of the file of interest to us. The tool thus -splits the upper portion of the window into three panes: +La figure~\ref{fig:tour-merge:conflict} illustre un cas de modifications +conflictuelles dans un document. Nous avons commencé avec une version simple +de ce fichier, puis nous avons ajoutés des modifications, pendant que +quelqu'un d'autre modifie le même texte. Notre tâche dans la résolution +du conflit est de décider à quoi le fichier devrait ressembler. + +Mercurial n'a pas de mécanisme interne pour gérer les conflits. +À la place, il exéctue un programme externe appelé \command{hgmerge}. +Il s'agit d'un script shell qui est embarqué par Mercurial, vous +pouvez le modifier si vous le voulez. Ce qu'il fait par défaut est +d'essayer de trouver un des différents outils de fusion qui seront +probablement installé sur le système. Il commence par les outils +totalement automatique, et si ils échouent (parce que la résolution +du conflit nécessite une intervention humaine) ou si ils sont absents, +le script tente d'exécuter certains outils graphiques de fusion. + +Il est aussi possible de demander à Mercurial d'exécuter un autre +programme ou un autre script au lieu de la commande \command{hgmerge}, +en définissant la variable d'environement \envar{HGMERGE} avec le nom +du programme de votre choix. + +\subsection{Utiliser un outil graphique de fusion} + +Mon outil de fusion préféré est \command{kdiff3}, que j'utilise ici +pour illustré les fonctionnalités classiques des outils graphiques +de fusion. Vous pouvez voir une capture d'écran de l'utilisation de +\command{kdiff3} dans la figure~\ref{fig:tour-merge:kdiff3}. Cet outil +effectue une \emph{fusion \textit{three-way}}, car il y a trois différentes +versions du fichier qui nous intéresse. Le fichier découpe la partie +supérieure de la fenêtre en trois panneaux: + \begin{itemize} -\item At the left is the \emph{base} version of the file, i.e.~the - most recent version from which the two versions we're trying to - merge are descended. -\item In the middle is ``our'' version of the file, with the contents - that we modified. -\item On the right is ``their'' version of the file, the one that - from the changeset that we're trying to merge with. +\item A gauche on la version de \emph{base} du fichier, soit ~la plus + récente version des deux versions qu'on souhaite fusionner. +\item Au centre, il y a ``notre'' version du fichier, avec le contenu + que nous avons modifié. +\item Sur la droite, on trouve ``leur'' version du fichier, celui qui qui + contient le \textit{changeset} que nous souhaitons intégré. \end{itemize} -In the pane below these is the current \emph{result} of the merge. -Our task is to replace all of the red text, which indicates unresolved -conflicts, with some sensible merger of the ``ours'' and ``theirs'' -versions of the file. - -All four of these panes are \emph{locked together}; if we scroll -vertically or horizontally in any of them, the others are updated to -display the corresponding sections of their respective files. + +Dans le panneau en dessous, on trouve le \emph{résultat} actuel de notre +fusion. Notre tâche consiste donc à remplacement tout les textes en rouges, +qui indiquent des conflits non résolus, avec un fusion manuel et pertinente +de ``notre'' version et de la ``leur''. + +Tout les quatres panneaux sont \emph{accrochés ensemble}, si nous déroulons +les ascenseurs verticalement ou horizontalement dans chacun d'entre eux, les +autres sont mise à jours avec la section correspondantes dans leurs fichiers. \begin{figure}[ht] \centering \grafix{kdiff3} - \caption{Using \command{kdiff3} to merge versions of a file} + \caption{Utilisation de \command{kdiff3} pour fusionner différents versions + d'un fichier.} \label{fig:tour-merge:kdiff3} \end{figure} -For each conflicting portion of the file, we can choose to resolve -the conflict using some combination of text from the base version, -ours, or theirs. We can also manually edit the merged file at any -time, in case we need to make further modifications. - -There are \emph{many} file merging tools available, too many to cover -here. They vary in which platforms they are available for, and in -their particular strengths and weaknesses. Most are tuned for merging -files containing plain text, while a few are aimed at specialised file -formats (generally XML). +Pour chaque portion de fichier posant problème, nous pouvons choisir +de résoudre le le conlfit en utilisant en utilisant une combinaison +de texte depuis la version de base, la notre, ou la leur. Nous pouvons +aussi éditer manuellement les fichiers à tous moments, si c'est +nécessaire. + +Il y a \emph{beaucoup} d'outils de fusion disponibles, bien trop pour +en parler de tous ici. Leurs disponibilités varient selon les plateformes +ainsi que leurs avantages et incovénients. La plupart sont optimisé pour +la fusion de fichier contenant un texte plat, certains sont spécialisé +dans un format de fichier précis (générallement XML). \subsection{A worked example}