Skip to content

Commit b647120

Browse files
committed
Add the “merge” page
1 parent b71b8f8 commit b647120

16 files changed

+155
-3
lines changed

_sass/custom/custom.scss

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,8 @@ figure {
145145
}
146146

147147
figcaption {
148-
font-size: .8em;;
148+
font-size: .8em;
149+
text-align: center;
149150
}
150151

151152
blockquote {

assets/complex-merge.svg

Lines changed: 28 additions & 0 deletions
Loading

assets/conflict-accept.png

4.63 KB
Loading

assets/conflict-ignore.png

4.45 KB
Loading

assets/conflicts.png

36.2 KB
Loading

assets/diff-feature-multilingue.png

631 KB
Loading

assets/diff-it.png

645 KB
Loading

assets/diff-ru.png

647 KB
Loading

assets/idea-conflicts.png

355 KB
Loading

assets/merge-end.png

575 KB
Loading

assets/merge-nok.png

613 KB
Loading

assets/merge-ok.png

557 KB
Loading

assets/merge-start.png

158 KB
Loading

assets/resolve-conflicts.png

659 KB
Loading

assets/simple-merge.svg

Lines changed: 18 additions & 0 deletions
Loading

branches/merge.md

Lines changed: 107 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,114 @@
22
layout: default
33
title: Fusionner des branches
44
parent: "Partie 4 : Branches"
5-
nav_order: 3
5+
nav_order: 2
66
permalink: /branches/merge
77
---
88

99
# 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+
![Fenêtre de GitHub Desktop montrant les modifications sur la branche feature-multilingue](../assets/diff-feature-multilingue.png)
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+
![Schéma de l’opération](../assets/simple-merge.svg)
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+
![Bouton “Choose a branch to merge into main” dans le sélecteur de branche](../assets/merge-start.png)
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+
![Fenêtre “Merge into main” sans conflit](../assets/merge-ok.png)
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+
![Schéma de l’opération](../assets/complex-merge.svg)
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+
![Fenêtre “Merge into main” avec conflit](../assets/merge-nok.png)
76+
77+
Clique sur **Create a merge commit**. Ensuite, une nouvelle fenêtre t’affiche les fichiers concernés :
78+
79+
![Fenêtre “Resolve conflicts before Merge”](../assets/conflicts.png)
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+
![Fenêtre “Conflicts” d’IntelliJ IDEA](../assets/idea-conflicts.png)
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">&nbsp;**Accept** pour insérer cette modification dans le résultat,
95+
ou sur <img src="../assets/conflict-ignore.png" alt="" width="16" height="16">&nbsp;**Ignore** pour l’ignorer.
96+
97+
![Fenêtre “Merge Revisions” d’IntelliJ IDEA](../assets/resolve-conflicts.png)
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+
![Fin d’une fusion dans GitHub Desktop](../assets/merge-end.png)
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

Comments
 (0)