Fusionner

Quand les branches sont utilisées pour maintenir des lignes séparées de développement, à une certaine étape vous voudrez fusionner les changements faits sur une branche vers le tronc, ou vice versa.

Il est important de comprendre comment les embranchements et les fusions fonctionnent dans Subversion avant de commencer à l'utiliser, car ils peuvent devenir assez complexe. Il est fortement recommandé de lire le chapitre Embranchement et Fusion citetitle> ulink > dans le livre de Subversion, qui donne une description compl

Il faut aussi noter que fusionner arrive toujours à l'intérieur d'une copie de travail. Si vous voulez fusionner les modifications dans une branche, vous devez avoir une copie de travail pour la branche extraite, et appeler l'assistant de fusion depuis cette copie de travail en utilisant TortoiseSVNFusionner....

En général, c'est une bonne idée d'exécuter une fusion dans une copie de travail inchangée. Si vous avez fait d'autres changements dans votre CdT, livrez les d'abord. Si la fusion ne se déroule pas comme prévu, vous pouvez vouloir annuler les changements et la commande Revenir en arrière supprimera tous les changements en incluant ceux effectués avant la fusion.

Il y a trois cas d'utilisation de la fusion qui sont gérés de façons légèrement différentes, comme décrit ci-dessous. La première page de l'assistant de fusion vous demande de quelle méthode vous avez besoin.

Fusionner une plage de révisions

Cette méthode couvre le cas où vous avez fait une ou plusieurs révisions sur une branche (ou sur le tronc) et vous voulez reporter ces changements vers une autre branche.

What you are asking Subversion to do is this: «  Calculate the changes necessary to get [FROM] revision 1 of branch A [TO] revision 7 of branch A, and apply those changes to my working copy (of trunk or branch B).  »

If you leave the revision range empty, Subversion uses the merge-tracking features to calculate the correct revision range to use. This is known as a reintegrate or automatic merge.

Fusionner deux arborescences différentes

This is a more general case of the reintegrate method. What you are asking Subversion to do is: «  Calculate the changes necessary to get [FROM] the head revision of the trunk [TO] the head revision of the branch, and apply those changes to my working copy (of the trunk).  » The net result is that trunk now looks exactly like the branch.

If your server/repository does not support merge-tracking then this is the only way to merge a branch back to trunk. Another use case occurs when you are using vendor branches and you need to merge the changes following a new vendor drop into your trunk code. For more information read the chapter on vendor branches in the Subversion Book.

Fusionner une plage de révisions

Dans le champ De : entrez l'url complète du dossier de la branche ou de l'étiquette contenant les changements que vous voulez reporter dans votre copie de travail. Vous pouvez aussi cliquer sur ... pour parcourir le dépôt et trouver la branche désirée. Si vous avez déjà fusionné depuis cette branche, alors utilisez simplement la liste déroulante contenant l'historique des URLs utilisées.

If you are merging from a renamed or deleted branch then you will have to go back to a revision where that branch still existed. In this case you will also need to specify that revision as a peg revision in the range of revisions being merged (see below), otherwise the merge will fail when it can't find that path at HEAD.

Dans le champ texte Plage de révisions à fusionner entrez la liste des révisions à fusionner. Ce peut être une seule révision, une liste de révisions spécifiques séparées par des virgules, une plage de révisions séparées par un tiret, ou une combinaison de ces différentes notations.

Si vous avez besoin de spécifier une révision peg for la fusion, ajouter la à la fin des révisions, ex :5-7,[email protected]. Dans l'exemple ci-dessus, les révisions 5,6,7 et 10 seront fusionnées, avec 3 étant la révision peg.

Important

Dans TortoiseSVN, il y a une différence importante dans la manière dont est spécifiée une plage de révisions par rapport au client en ligne de commande.

Avec le client en ligne de commande vous spécifiez les modifications à fusionner avec deux révisions « limites » qui spécifient les bornes avant et après.

Dans TortoiseSVN vous spécifiez la liste des modifications à fusionner en utilisant des « panneaux de clôture/quote>. La raison de ceci devient plus clair lorsque vous utilisez la fenêtre de commentaire pour spécifier les révisions à fusionner, où chaque révision apparait comme une liste de modifiations. »

If you are merging revisions in chunks, the method shown in the Subversion book will have you merge 100-200 this time and 200-300 next time. With TortoiseSVN you would merge 100-200 this time and 201-300 next time.

Cette différence à fait couler beaucoup d'encre dans les listes de diffusion. Nous reconnaissons les différences avec le client en ligne de commande, mais nous pensons qu'il est plus facile de comprendre la notation que nous avons implémenté pour la majorité des utilisateurs de l'interface.

La façon la plus facile de choisir la plage de révisions dont vous avez besoin est de cliquer sur Voir le journal, puisqu'ainsi les changements récents seront affichés avec les commentaires associés. Si vous voulez fusionner les changements d'une seule révision, sélectionnez juste cette révision. Si vous voulez fusionner les changements de plusieurs révisions, alors sélectionnez cette plage (en utilisant comme de coutume la touche Maj). Cliquez sur OK et les numéros de révision seront automatiquement insérés.

Si vous voulez revenir sur des modifications déjà livrées de votre copie de travail, sélectionnez les révisions à annuler et vérifiez bien que la case Fusion inversée est cochée.

Si vous avez déjà fusionné des changements de cette branche, avec bon espoir vous aurez fait une note de la dernière révision fusionnée dans le commentaire quand vous avez livré la modification. Dans ce cas, vous pouvez utiliser Voir le journal dans la CdT pour retrouver ce commentaire. Dans la mesure où nous considérons les révisions comme des listes de modifications, vous devriez utiliser la révision de fin de la dernière fusion comme point de départ pour celle ci. Par exemple, si vous avez fusionné les révisions 37 à 39 la dernière fois, alors le point de départ pour cette fusion devrait être la révision 40.

Si vous vous servez de la fonctionnalité de suivi de fusion de Subversion, vous n'avez pas besoin de vous souvenir des révisions déjà fusionnées - Subversion les enregistrera pour vous. Si vous laissez le champ plage de révisions vide, toutes les révisions n'ayant pas déjà été fusionnées y seront notées. Lisez la section intitulée « Suivi des fusions » pour en savoir plus.

When merge tracking is used, the log dialog will show previously merged revisions, and revisions pre-dating the common ancestor point, i.e. before the branch was copied, as greyed out. The Hide non-mergeable revisions checkbox allows you to filter out these revisions completely so you see only the revisions which can be merged.

Si d'autres personnes peuvent livrer des changements alors soyez prudents en utilisant de la révision HEAD. Elle peut ne pas faire référence à la révision à laquelle vous pensez si quelqu'un d'autre a fait une livraison après votre dernière mise à jour.

If you leave the range of revisions empty or have the radio button all revisions checked, then Subversion merges all not-yet merged revisions. This is known as a reintegrate or automatic merge.

Il y a quelques prérequis pour pouvoir faire une réintégration. Premièrement, le serveur doit supporter le suivi de fusion. La CdT doit contenir toute la profondeur complète de l'arborescence (pas d'extractions éparses), et elle ne doit avoir aucune modifications locales, d'éléments déplacés ou mis à jour à une version autre que la tête. Toutes les modifications faite sur le tronc pendant la phase de développement de la branche doivent avoir été intégrées à la branche (ou marquées comme ayant été fusionnées). La plage de révisions à fusionner sera calculée automatiquement.

Cliquez sur Suivant et aller à la section intitulée « Options de fusion ».

Fusionner deux arbres différents

Figure 4.55. Assitant de de fusion - Fusion d'arborescence

Assitant de de fusion - Fusion d'arborescence


Si vous utilisez cette méthode pour fusionner une branche avec le tronc, vous devez démarrer l'assistant de fusion depuis une CdT du tronc.

Dans le champ De : entrez l'URL complète du dossier du tronc. Cela peut sembler erroné, mais souvenez-vous que le tronc est l'endroit auquel vous souhaitez ajouter les modifications de la branche. Vous pouvez aussi cliquer sur ... pour parcourir le dépôt.

Remplissez le champ To: par l'adresse complète de la branche.

Dans les deux champs Depuis la révision et À la révision, entrez le numéro de la dernière révision à laquelle les deux arbres ont été synchronisés. Si vous êtes sûrs que personne d'autre ne fait de livraison vous pouvez utiliser la révision HEAD dans les deux cas. S'il y a une chance que quelqu'un d'autre ait fait une livraison depuis cette synchronisation, utilisez le numéro de la révision particulier pour éviter de perdre des livraisons plus récentes.

Vous pouvez également utiliser Voir les Messages de Log pour sélectionner la révision.

Options de fusion

Cette page de l'assistant vous permet d'accéder à des options avancées, avant de commencer le processus de fusion. La plupart du temps vous ne pouvez utiliser que les options par défaut.

Vous pouvez donner la profondeur de fusion, i.e. à quelle profondeur dans la CdT, la fusion doit aller. Les termes de profondeur utilisés sont décrits dans la section intitulée « Profondeur d'extraction ». La profondeur par défaut est Copie de travail, qui utilise la valeur existante de profondeur, et est presque toujours ce qui est nécessaire.

Most of the time you want merge to take account of the file's history, so that changes relative to a common ancestor are merged. Sometimes you may need to merge files which are perhaps related, but not in your repository. For example you may have imported versions 1 and 2 of a third party library into two separate directories. Although they are logically related, Subversion has no knowledge of this because it only sees the tarballs you imported. If you attempt to merge the difference between these two trees you would see a complete removal followed by a complete add. To make Subversion use only path-based differences rather than history-based differences, check the Ignore ancestry box. Read more about this topic in the Subversion book, Noticing or Ignoring Ancestry.

Vous pouvez spécifier la gestion des caractères de fin de ligne et des espaces. Ces options sont décrites dans la section intitulée « Options de fins de ligne et d'espacement ». Le comportement par défaut est de traiter tous les espaces et les fins de lignes comme étant des modifications à part entière.

La case à cocher appelée Forcer la fusion est utilisée pour éviter les conflits d'arborescence lors de la suppression d'un fichier qui a été modifié localement ou qui n'est pas sous contrôle de version. Si le fichier est supprimé, il n'y a aucun moyen de le récupérer, ce qui explique que par défaut cette case ne soit pas cochée.

Si vous utilisez la fonction de suivi de fusion et que vous souhaitez marquer une révision comme ayant été fusionnée, sans vraiment avoir fait de fusion ici, cochez la case Enregistrer uniquement la fusion. Il y a deux raisons pour lesquelles vous pourriez être amenés à faire ceci. La fusion à effectuer est trop compliquée pour les algorithmes de fusion, vous faites donc la fusion à la main et marquez les modifications comme ayant été fusionnées de manière à ce que le suivi de fusion le sache. Ou vous voulez éviter qu'une révision particulière soit fusionnée. La marquer comme ayant été fusionnée empêchera les clients supportant le suivi de fusion de faire effectivement la fusion.

A présent que tout est correctement configuré, tout ce que vous avez à faire est de cliquer sur le bouton Fusionner. Si vous voulez avoir un aperçu du résultat, le bouton Tester la fusion simulera la fusion sans modifier la CdT. La liste des fichiers qui seront changés par une vraie fusion s'affichera, ainsi que les endroits où il pourrait y avoir des conflits. Parce que le suivi de fusion rend le processus de fusion beaucoup plus complexe, il n'y a aucune garantie pour savoir à l'avance si la fusion sera réalisée sans conflits, les fichiers marqués comme étant en conflit dans un test de fusion pourraient en fait fusionner sans aucun problème.

The merge progress dialog shows each stage of the merge, with the revision ranges involved. This may indicate one more revision than you were expecting. For example if you asked to merge revision 123 the progress dialog will report «  Merging revisions 122 through 123  ». To understand this you need to remember that Merge is closely related to Diff. The merge process works by generating a list of differences between two points in the repository, and applying those differences to your working copy. The progress dialog is simply showing the start and end points for the diff.

Prévisualiser les résultats de la fusion

La fusion est a présent effectuée. C'est une bonne idée le résultat et vérfier que tout est conforme à vos attentes. Fussioner est normalement assez compliqué. Il y a souvent des conflits si la branche s'est beaucoup éloignée du tronc.

Astuce

Whenever revisions are merged into a working copy, TortoiseSVN generates a log message from all the merged revisions. Those are then available from the Recent Messages button in the commit dialog.

To customize that generated message, set the corresponding project properties on your working copy. See la section intitulée « Fusionner les modèles de message de journal »

Pour les clients et serveurs Subversion antérieurs à la version 1.5, aucune information de fusion n'est gardée et les révisions à fusionner sont à trouver manuellement. Lorsque vous avez testé et que vous allez livrer, le commentaire de livraison devrait toujours inclure les numéros de révision inclus dans la fusion. Si vous voulez faire une autre fusion plus tard vous aurez besoin de savoir ce que vous avez déjà fusionné pour ne pas applique vos modifications plusieurs fois. Pour plus d'informations, consultez Best Practices for Merging dans la bible de Subversion.

Pour des clients et serveurs Subversion postérieurs à la version 1.5, la fonctionnalité de suivi de fusion enregistrera les révisions fusionnées et empêchera d'en fusionner une plus d'une fois. Cela vous simplifie la tâche dans la mesure où vous pouvez tout fusionner à chaque fois en étant sûr que seules les nouvelles révisions seront vraiment fusionnées.

La gestion de branches est importante. Si vous voulez conserver une branche synchronisée avec le tronc, vous devrez vous assurer de fusionner souvent de sorte que la branche et le tronc ne soient pas trop éloignés. Bien sûr, vous devez toujours éviter de fusionner plusieurs fois les mêmes modifications comme expliqué ci-dessus.

Astuce

Si vous venez de fusionner une branche avec le tronc, celui ci contient le code de la nouvelle fontionnalité, et la branche est obsolète. Vous pouvez donc la supprimer du dépôt si besoin est.

Important

Subversion ne peut pas fusionner un fichier avec un dossier et vice versa - seulement entre dossiers et entre fichiers. Si vous cliquez sur un fichier et ouvrez la boîte de dialogue fusionner, vous devez alors donner un chemin vers un fichier dans cette boîte de dialogue. Si vous choisissez un dossier et affichez la boîte de dialogue, vous devez alors spécifier une URL de dossier pour la fusion.

Suivi des fusions

A partir de la version 1.5, Subversion inclus des aides au suivi de fusion. Lorsque vous fusionnez des modifications depuis une arborescence vers une autre, les numéros de révision sont stockés et peuvent être utilisées à plusieurs fins.

  • Vous pouvez éviter le danger de fusionner deux fois la même révision (problème de fusions répétées). Dès qu'une révision a été marquée comme ayant été fusionnée, les fusions futures incluant cette révision dans leur plage de révisions l'ignoreront.

  • Quand vous fusionnez une branche dans le tronc, la fenêtre de commentaires peut vous montrer les livraisons de la branche comme faisant partie des commentaires du tronc, donnant une meilleure traçabilité des modifications.

  • Lorsque vous affichez la fenêtre de commentaires depuis la fenêtre de fusion, les révisions déjà fusionnées sont grisées.

  • Quand l'annotation d'un fichier est affichée, vous pouvez choisir de montrer les auteurs des révisions fusionnées, au lieu de la personne ayant fait la fusion.

  • Vous pouvez marquer les révisions comme n'étant pas à fusionner en les incluant dans la liste des révisions fusionnées mais sans vraiment faire la fusion.

Les informations de suivi de fusion sont stockées dans la propriété svn:mergeinfo par le client lorsqu'il effectue la fusion. Au moment de la livraison de cette fusion, le serveur stocke l'information dans la base de données, et quand vous souhaitez fusionner, commenter ou annoter, le serveur peut répondre de manière appropriée. Afin que le système fonctionne correctement, vous devez vous assurer que le serveur, le dépôt et les clients sont à jour. Les clients plus anciens ne stockeront pas la propriété svn:mergeinfo et les serveurs plus anciens ne pourront pas satisfaire à toutes les demandes des clients récents.

Apprenez-en plus sur le suivi des fusions dans la Documentation du suivi des fusions de Subversion.

Handling Conflicts after Merge

Important

The text in the conflict resolver dialogs are provided by the SVN library and might therefore not (yet) be translated as the TortoiseSVN dialogs are. Sorry for that.

Merging does not always go smoothly. Sometimes there is a conflict. TortoiseSVN helps you through this process by showing the merge conflict dialog.

Figure 4.56. The Merge Conflict Dialog

The Merge Conflict Dialog


It is likely that some of the changes will have merged smoothly, while other local changes conflict with changes already committed to the repository. All changes which can be merged are merged. The Merge Conflict dialog gives you different ways of handling the lines which are in conflict.

For normal conflicts that happen due to changes in the file content or its properties, the dialog shows buttons which allow you to chose which of the conflicting parts to keep or reject.

Postpone

Don't deal with the conflict now. Let the merge continue and resolve the conflicts after the merge is done.

Accept base

This leaves the file as it was, without neither the changes coming from the merge nor the changes you've made in your working copy.

Accept incoming

This discards all your local changes and uses the file as it arrives from the merge source.

Reject incoming

This discards all the changes from the merge source and leaves the file with your local edits.

Accept incoming for conflicts

This discards your local changes where they conflict with the changes from the merge source. But it leaves all your local changes which don't conflict.

Reject conflicts

This discards changes from the merge source which conflict with your local changes. But it keeps all changes that don't conflict with your local changes.

Mark as resolved

Marks the conflicts as resolved. This button is disabled until you use the button Edit to edit the conflict manually and save those changes back to the file. Once the changes are saved, the button becomes enabled.

Editer

Starts the merge editor so you can resolve the conflicts manually. Don't forget to save the file so the button Mark as resolved becomes enabled.

If there's a tree conflict, please first see la section intitulée « Conflits dans l'arborescence » about the various types of tree conflicts and how and why they can happen.

To resolve tree conflicts after a merge, a dialog is shown with various options on how to resolve the conflict:

Figure 4.57. The Merge Tree Conflict Dialog

The Merge Tree Conflict Dialog


Since there are various possible tree conflict situations, the dialog will show buttons to resolve those depending on the specific conflict. The button texts and labels explain what the option to resolve the conflict does. If you're not sure, either cancel the dialog or use the Postpone button to resolve the conflict later.

Branche de maintenance d'une fonctionnalité

Quand vous développez une nouvelle fonctionnalité dans une branche séparée c'est une bonne pratique de garder en tête la réintégration de cette branche lorsque la nouvelle fonctionnalité sera prête. Si la branche principale (le trunk) évolue en même temps, il est probable que les différences seront nombreuses, rendant l'intégration cauchemardesque.

Si la fonctionnalité est relativement simple et que le développement ne prend pas beaucoup de temps, vous pouvez adopter une solution simple, qui consiste à garder une branche distincte, que vous intégrerez lorsque le développement sera fini. Dans l'assistant de fusion, ce devrait n'être qu'un simple Fusionner une plage de révisions, la plage de révisions couvrant la période de développement de la branche.

Dans le cas où la fonctionnalité prend du temps et que vous souhaitez récupérer les évolutions du trunk, alors vous devez garder votre branche synchronisée. Cela signifie simplement que vous devez fusionner de temps en temps les évolutions du tronc dans votre branche, de manière à ce que votre branche contiennent toutes les modifications du tronc en plus de la nouvelle fonctionnalité. Le processus de synchronisation utilise la commande Fusionner une plage de révisions. Quand le développement de la fonctionnalité est achevé vous pouvez alors fusionner la branche avec le tronc (i.e. trunk) en utilisant Réintégrer une branche ou Fusionner deux arborescences.

Another (fast) way to merge all changes from trunk to the feature branch is to use the TortoiseSVNMerge all... from the extended context menu (hold down the Shift key while you right click on the file).

Figure 4.58. The Merge-All Dialog

The Merge-All Dialog


This dialog is very easy. All you have to do is set the options for the merge, as described in la section intitulée « Options de fusion ». The rest is done by TortoiseSVN automatically using merge tracking.