|
2 | 2 | layout: default
|
3 | 3 | title: Fusionner des branches
|
4 | 4 | parent: "Partie 4 : Branches"
|
5 |
| -nav_order: 3 |
| 5 | +nav_order: 2 |
6 | 6 | permalink: /branches/merge
|
7 | 7 | ---
|
8 | 8 |
|
9 | 9 | # Fusionner des branches
|
10 |
| -@TODO |
| 10 | +{: .no_toc } |
| 11 | + |
| 12 | +Maintenant, nous allons voir l’aspect le plus puissant des branches : la possibilité d’en fusionner une dans une autre. |
| 13 | + |
| 14 | +C’est aussi injustement la partie la plus redoutée de Git, car la gestion des conflits dans une fusion en aura effrayé plus d’un. Un conflit est une situation où les mêmes lignes de code ont été modifiées indépendamment dans les deux branches. Git ne sait alors pas comment réconcillier ces deux chagements opposés, et te demande alors quoi faire. Mais pas besoin de t’inquiéter, une fois que tu auras compris comment faire, tu trouveras cet outil très pratique ! |
| 15 | + |
| 16 | +<hr> |
| 17 | +## Table des matières |
| 18 | +{: .no_toc.text-delta } |
| 19 | +1. TOC |
| 20 | +{:toc} |
| 21 | +<hr> |
| 22 | + |
| 23 | +## Notre situation |
| 24 | +C’est ton jour de chance ! Tu as rencontré un distributeur qui a entendu parler de [ton incroyable programme *Hello World*](../intellij-idea/run). Enthousiasmé par ce projet « révolutionnaire » qui « va bouleverser les esprits », il aimerait t’aider à le commercialiser aux quatre coins du monde. Mais il y a un hic : pour ce logiciel puisse être utilisé dans tous les pays, il faut qu’il soit traduit en plusieurs langues. |
| 25 | + |
| 26 | +Comme tu t’es bien rappelé de tes cours Students 4 Students, tu as créé une branche `feature-multilingue` dans laquelle tu as développé cette nouvelle fonctionnalité[^1] : |
| 27 | + |
| 28 | +[^1]: Ce code utilise des notions que tu n’as pas encore vues. Tu n’as pas besoin de comprendre comment il fonctionne en détail ! |
| 29 | + |
| 30 | + |
| 31 | + |
| 32 | +Maintenant, tu aimerais intégrer ces changements dans la branche `main`, qui contient la version stable du logiciel. Nous allons donc **fusionner** la branche `feature-multilingue` (que nous allons appeler ici **branche source**) dans la branche `main` (la **branche cible**). |
| 33 | + |
| 34 | + |
| 35 | + |
| 36 | +<div class="note"> |
| 37 | + <header>Note</header> |
| 38 | + <p>Tu n’as ici pas besoin d’effectuer les étapes pas-à-pas. Un exercice à la fin du chapitre te permettra de pratiquer ces notions.</p> |
| 39 | +</div> |
| 40 | + |
| 41 | +## Effectuer une fusion |
| 42 | +Tout d’abord, il faut commencer par [changer de branche](manage) pour te rendre dans la branche cible (ici `main`). |
| 43 | + |
| 44 | +Clique ensuite sur le sélecteur de branches (*Current Branch*), puis clique sur le bouton **Choose a branch to merge into main**. |
| 45 | + |
| 46 | + |
| 47 | + |
| 48 | +Sélectionne ensuite la branche source. Dans cette situation simple, il n’y a pas de conflits : tu peux cliquer sur **Create a merge commit**, et la fusion s’effectue directement : le message *“Successfully merged feature-multilingue into main”* s’affiche. |
| 49 | + |
| 50 | + |
| 51 | + |
| 52 | +## Gérer les conflits |
| 53 | + |
| 54 | +### Introduction |
| 55 | +Maintenant, comment pouvons-nous procéder si les mêmes lignes de code ont subit des modifications différentes dans les deux branches ? |
| 56 | + |
| 57 | +Par exemple, imaginons que tu aimerais ajouter des traductions du programme *Hello World* dans deux nouvelles langues. Ce sont deux modifications différentes, que tu effectues sur deux nouvelles branches, `add-italian` et `add-russian` : |
| 58 | + |
| 59 | +<figure> |
| 60 | + <img src="../assets/diff-it.png" alt="Modifications sur la branche “add-italian”"> |
| 61 | + <figcaption>Modifications sur la branche <code>add-italian</code>.</figcaption> |
| 62 | +</figure> |
| 63 | +<figure> |
| 64 | + <img src="../assets/diff-ru.png" alt="Modifications sur la branche “add-russian”"> |
| 65 | + <figcaption>Modifications sur la branche <code>add-russian</code>.</figcaption> |
| 66 | +</figure> |
| 67 | + |
| 68 | +Comme tu peux le voir, les deux modifications sont faites au même endroit. Git ne peut donc pas deviner ce que doit être le résultat final ! Tu vas donc gérer un conflit manuellement. |
| 69 | + |
| 70 | + |
| 71 | + |
| 72 | +### Pour démarrer… |
| 73 | +Commençons par fusionner la branche `add-italian`. Tu peux le faire sans problème, car il n’y a pas encore de conflit. Par contre, lorsque tu fusionnes `add-russian`, GitHub Desktop t’avertit qu’il y a un conflit : |
| 74 | + |
| 75 | + |
| 76 | + |
| 77 | +Clique sur **Create a merge commit**. Ensuite, une nouvelle fenêtre t’affiche les fichiers concernés : |
| 78 | + |
| 79 | + |
| 80 | + |
| 81 | +Nous allons utiliser un outil d’IntelliJ IDEA qui te permet de résoudre les *merge conflicts*. Tu peux donc **fermer** la fenêtre *Resolve conflicts before Merge* en **cliquant sur la croix**[^2]. |
| 82 | + |
| 83 | +[^2]: Tu peux ignorer les boutons *Open* dans la liste des fichiers : la façon dont la fonctionnalité *Resolve Conflicts* d’IntelliJ IDEA marche les rend inutiles. |
| 84 | + |
| 85 | +### Résoudre les conflits dans IntelliJ IDEA |
| 86 | +Ouvre maintenant ton projet dans IntelliJ IDEA. Dans la [recherche globale](../intellij-idea/ui#recherche-globale), cherche **Resolve conflicts…**. |
| 87 | + |
| 88 | +IntelliJ IDEA affiche la liste des fichiers où il y a des conflits. Avec les boutons *Accept Yours* et *Accept Theirs*, tu peux choisir d’utiliser la version d’une branche spécifique. Dans notre cas, ce n’est pas ce qu’on veut faire, car les modifications apportées des deux côtés nous intéressent. Clique donc sur le bouton **Merge…**. |
| 89 | + |
| 90 | + |
| 91 | + |
| 92 | +La fenêtre qui s’ouvre alors te permet de comparer les modifications effectués. Les deux branches que tu fusionnes s’affichent sur les côtés, |
| 93 | +et au milieu s’affiche le résultat final. Pour chaque modification, tu peux appuyer soit sur |
| 94 | +<img src="../assets/conflict-accept.png" alt="" width="16" height="16"> **Accept** pour insérer cette modification dans le résultat, |
| 95 | +ou sur <img src="../assets/conflict-ignore.png" alt="" width="16" height="16"> **Ignore** pour l’ignorer. |
| 96 | + |
| 97 | + |
| 98 | + |
| 99 | +Une fois que tu as fini de traiter un fichier, clique sur le bouton **Apply** en bas de la fenêtre. |
| 100 | +Répète ces instructions jusqu’à ce que tu aies traité tous les fichiers avec conflits. |
| 101 | + |
| 102 | +### Finaliser |
| 103 | +Une fois que tu as fini de traiter tous les conflits, retourne dans GitHub Desktop. Les modifications apportées par le *merge* s’affichent alors comme lorsque tu crées un commit. Clique sur le bouton **Commit to main** pour effectuer la fusion. |
| 104 | + |
| 105 | + |
| 106 | + |
| 107 | +<div class="note"> |
| 108 | + <header>Note</header> |
| 109 | + <p> |
| 110 | + Les commits qui finalisent une fusion sont appelés <strong>commits de fusion</strong> (ou en anglais <strong>merge commits</strong>). Ils sont très similaires aux commits standards, à une exception : un <em>merge commit</em> a plusieurs commits parents, au lieu d’un seul. |
| 111 | + </p> |
| 112 | + <p>Lorsque tu fusionnes des branches sans qu’il n’y ait de conflit, GitHub Desktop crée un commit de fusion automatiquement.</p> |
| 113 | +</div> |
| 114 | + |
| 115 | +## Notes de bas de page |
0 commit comments