fusionner_branches.tex 16.5 KB
Newer Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
\begin{frame}[fragile]{Fusionner deux branches avec Git}
	\textit{Attention : avant de commencer, s'assurer que le répertoire est dans un état propre et qu'il n'y a pas de modifications non validées !}

	\medskip

	Git propose deux façons de fusionner deux branches :
	\begin{itemize}
		\item le \verb+merge+ : fusion \enquote{basique} de deux branches \\
			\textbf{C'est l'alternative la plus simple}
		\item le \verb+rebase+ : modification plus avancée de l'historique \\
			\textbf{Plus puissant mais plus dangereux}
	\end{itemize}
\end{frame}

\begin{frame}[fragile]
Rémy Huet's avatar
Rémy Huet committed
16
	\frametitle{Le merge}
17
18
19

	Le \verb+merge+ applique les modifications apportées depuis la divergence par la branche secondaire sur la branche de départ.

Rémy Huet's avatar
Rémy Huet committed
20
21
22
23
	\begin{figure}[h]
		\centering
		\input{src/tikz/merge.tex}
	\end{figure}
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38

	Ici, C7 réalise le \verb+merge+ de la branche bleue dans la branche verte : les modifications apportées par C4 et C6 sont appliquées après C5.

	\medskip

	\Pause

	\begin{block}{Processus de fusion}
		\begin{enumerate}
			\item se déplacer sur la branche destination de la fusion \\
			\verb+git checkout <destination>+
			\item lancer la fusion de la branche de travail \\
			\verb+git merge <branche de travail>+
		\end{enumerate}
	\end{block}
Rémy Huet's avatar
Rémy Huet committed
39
40
\end{frame}

Rémy Huet's avatar
Rémy Huet committed
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
\begin{frame}[fragile]
	\frametitle{Le merge}
	\framesubtitle{Application}
	\begin{beamercolorbox}[rounded=true, shadow=true]{terminal}
		\begin{Verbatim}
$ echo nouvelle ligne >> API.txt && git commit -am "Commit sur master" \Pause
[master 37d2273] Commit sur master
 1 file changed, 1 insertion(+) \Pause

$ git merge develop \Pause
Merge made by the 'recursive' strategy.
 dev.txt | 0
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 dev.txt \Pause
		\end{Verbatim}
	\end{beamercolorbox}
\end{frame}

\begin{frame}[fragile]
	\frametitle{Le merge}
	\framesubtitle{Log !}
	\begin{beamercolorbox}[rounded=true, shadow=true]{terminal}
		\begin{Verbatim}
$ git log --graph --decorate \Pause

*   \textcolor{yellow}{commit 1892470146ed37358a45e8e5cd9715ec0fc3448a (}{\bf\textcolor{cyan}{HEAD -> }\textcolor{green}{master}}\textcolor{yellow}{)}
\textcolor{red}{|}\textcolor{myGreen}{|}  Merge: 37d2273 2292018
\textcolor{red}{|} \textcolor{myGreen}{|} Author: huetremy <remy.huet@etu.utc.fr>
\textcolor{red}{|} \textcolor{myGreen}{|} Date:   Mon Jan 14 14:50:00 2019 +0100
\textcolor{red}{|} \textcolor{myGreen}{|}
\textcolor{red}{|} \textcolor{myGreen}{|}     Merge branch 'develop'
\textcolor{red}{|} \textcolor{myGreen}{|}
\textcolor{red}{|} * \textcolor{yellow}{commit 2292018a27182fef507601140c7f93d679b93678 (}{\bf\textcolor{green}{develop}}\textcolor{yellow}{)}
\textcolor{red}{|} \textcolor{myGreen}{|} Author: huetremy <remy.huet@etu.utc.fr>
\textcolor{red}{|} \textcolor{myGreen}{|} Date:   Mon Jan 14 14:01:37 2019 +0100
\textcolor{red}{|} \textcolor{myGreen}{|}
\textcolor{red}{|} \textcolor{myGreen}{|}     Ajout fichier dev
\textcolor{red}{|} \textcolor{myGreen}{|}
* \textcolor{myGreen}{|} \textcolor{yellow}{commit 37d2273def21ff6d8bb33f0600220764f67f2ab9}
\textcolor{myGreen}{|}\textcolor{myGreen}{/}  Author: huetremy <remy.huet@etu.utc.fr>
\textcolor{myGreen}{|}   Date:   Mon Jan 14 14:49:12 2019 +0100
\textcolor{myGreen}{|}
\textcolor{myGreen}{|}       Commit sur master
\textcolor{myGreen}{|}
* \textcolor{yellow}{commit 168efba77dcfd59ba4346fe4a34427b71db75da7}
\textcolor{myGreen}{|} Author: huetremy <remy.huet@etu.utc.fr>
\textcolor{myGreen}{|} Date:   Fri Jan 11 14:53:09 2019 +0100
\textcolor{myGreen}{|}
\textcolor{myGreen}{|}     Commit supplémentaire
		\end{Verbatim}
	\end{beamercolorbox}
\end{frame}

94
\begin{frame}[fragile]
Rémy Huet's avatar
Rémy Huet committed
95
96
	\frametitle{Le rebase}
	\framesubtitle{Avertissement}
97
98
99
100
101
102
103

	\begin{center}
		\includegraphics[height=3em]{./imgs/warning.jpg}

		\textbf{ATTENTION -- COMMANDE RISQUÉE}
	\end{center}

Quentin Duchemin's avatar
Quentin Duchemin committed
104
	Le \verb+rebase+ cause une \textbf{modification de l'historique} qui peut rendre l'état de votre arbre incohérent avec une éventuelle branche distante (GitLab\ldots).
105
106
107
108
109
110
111

	\bigskip

	\begin{block}{Conclusion}
		On rebase une branche locale mais \textbf{JAMAIS} une branche synchronisée \\
		\tiny{(sauf si vous êtes absolument sûrs de ce que vous faites)}.
	\end{block}
Rémy Huet's avatar
Rémy Huet committed
112
113
\end{frame}

114
\begin{frame}[fragile]
Rémy Huet's avatar
Rémy Huet committed
115
116
	\frametitle{Le rebase}
	\framesubtitle{Comparaison avec le merge}
117
118
119
120
121
122
123
124
125

	Le \verb+rebase+ intègre aussi les modifications d'une branche secondaire sur la branche cible depuis la divergence mais ne crée pas de commit de merge.

	\medskip

	Les commits effectués depuis la divergence sont \textbf{déplacés et réappliqués} après le dernier commit de la branche cible.

	\Pause

Rémy Huet's avatar
Rémy Huet committed
126
127
128
129
130
131
	\begin{figure}[h]
		\centering
		\input{src/tikz/avant_rebase.tex}
		\caption{Avant le rebase}
		\label{fig:avant_rebase}
	\end{figure}
132

Rémy Huet's avatar
Rémy Huet committed
133
134
135
136
137
138
	\begin{figure}[h]
		\centering
		\input{src/tikz/apres_rebase.tex}
		\caption{Après le rebase}
		\label{fig:apres_rebase}
	\end{figure}
Rémy Huet's avatar
Rémy Huet committed
139
140
\end{frame}

141
\begin{frame}[fragile]
Rémy Huet's avatar
Rémy Huet committed
142
143
	\frametitle{Le rebase}
	\framesubtitle{Application simple}
144
145
146
147
148
149
150
151
152

	Après le rebase, pour ramener la branche de référence au bout de la chaîne de commits, on fait une fusion classique (merge).

	\begin{block}{Processus de rebase avec fusion}
		\begin{itemize}
			\item se déplacer sur la branche à rebase \\
				\verb+git checkout <branche à rebase>+
			\item rebase la branche courante sur la branche de référence \\
				\verb+git rebase <branche de référence>+
Quentin Duchemin's avatar
Quentin Duchemin committed
153
			\item régler les éventuels conflits\ldots
154
155
156
157
158
159
			\item se déplacer sur la branche de référence \\
				\verb+git checkout <branche de référence>+
			\item fusionner la branche à rebase dans la branche de référence \\
				\verb+git merge <branche à rebase>+
		\end{itemize}
	\end{block}
Rémy Huet's avatar
Rémy Huet committed
160
161
\end{frame}

Rémy Huet's avatar
Rémy Huet committed
162
163
164
165
166
167
168
169
170
171
172
173
174
175
\begin{frame}[fragile]
	\frametitle{Le rebase}
	\framesubtitle{Exemple}
	\begin{beamercolorbox}[rounded=true,shadow=true]{terminal}
		\begin{Verbatim}
$ echo "Avant rebase" >> API.txt && gitc -am "Avant rebase" \Pause
[master 6fe645e] Avant rebase
 1 file changed, 1 insertion(+) \Pause

$ git checkout develop && echo ''Ma première ligne'' >> dev.txt && gitc -am ''ajout à dev'' \Pause
Basculement sur la branche 'develop'
Votre branche est à jour avec 'origin/develop'.
[develop 59eed37] ajout à dev
 1 file changed, 1 insertion(+) \Pause
Rémy Huet's avatar
Rémy Huet committed
176
$ git log --graph --decorate --all
Rémy Huet's avatar
Rémy Huet committed
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
		\end{Verbatim}
	\end{beamercolorbox}
\end{frame}

\begin{frame}[fragile]
	\begin{beamercolorbox}[rounded=true, shadow=true]{terminal}
		\begin{Verbatim}
* \textcolor{yellow}{commit 59eed37beb51329f95e90e6d6a6de85ca36c441a (}{\bf\textcolor{cyan}{HEAD -> }\textcolor{green}{develop}}\textcolor{yellow}{)}
\textcolor{red}{|} Author: huetremy <remy.huet@etu.utc.fr>
\textcolor{red}{|} Date:   Mon Jan 14 15:33:59 2019 +0100
\textcolor{red}{|}
\textcolor{red}{|}     ajout à dev
\textcolor{red}{|}
\textcolor{red}{|} * \textcolor{yellow}{commit 6fe645e97ba1a69c99438fba05f21902d19f1055 (}{\bf\textcolor{green}{master}}\textcolor{yellow}{)}
\textcolor{red}{|} \textcolor{myGreen}{|} Author: huetremy <remy.huet@etu.utc.fr>
\textcolor{red}{|} \textcolor{myGreen}{|} Date:   Mon Jan 14 15:31:47 2019 +0100
\textcolor{red}{|} \textcolor{myGreen}{|}
\textcolor{red}{|} \textcolor{myGreen}{|}     Avant rebase
\textcolor{red}{|} \textcolor{myGreen}{|}
\textcolor{red}{|} *   \textcolor{yellow}{commit 1892470146ed37358a45e8e5cd9715ec0fc3448a}
\textcolor{red}{|} \textcolor{yellow}{|}\textcolor{red}{|}  Merge: 37d2273 2292018
\textcolor{red}{|} \textcolor{yellow}{|}\textcolor{red}{/}  Author: huetremy <remy.huet@etu.utc.fr>
\textcolor{red}{|}\textcolor{red}{/}\textcolor{yellow}{|}   Date:   Mon Jan 14 14:50:00 2019 +0100
\textcolor{red}{|} \textcolor{yellow}{|}
\textcolor{red}{|} \textcolor{yellow}{|}       Merge branch 'develop'
\textcolor{red}{|} \textcolor{yellow}{|}
* \textcolor{yellow}{|} \textcolor{yellow}{commit 2292018a27182fef507601140c7f93d679b93678}
\textcolor{cyan}{|} \textcolor{yellow}{|} Author: huetremy <remy.huet@etu.utc.fr>
\textcolor{cyan}{|} \textcolor{yellow}{|} Date:   Mon Jan 14 14:01:37 2019 +0100
\textcolor{cyan}{|} \textcolor{yellow}{|}
\textcolor{cyan}{|} \textcolor{yellow}{|}     Ajout fichier dev
\textcolor{cyan}{|} \textcolor{yellow}{|}
\textcolor{cyan}{|} * \textcolor{yellow}{commit 37d2273def21ff6d8bb33f0600220764f67f2ab9}
\textcolor{cyan}{|}\textcolor{cyan}{/}  Author: huetremy <remy.huet@etu.utc.fr>
\textcolor{cyan}{|}   Date:   Mon Jan 14 14:49:12 2019 +0100
\textcolor{cyan}{|}
\textcolor{cyan}{|}       Commit sur master
\textcolor{cyan}{|}
* \textcolor{yellow}{commit 168efba77dcfd59ba4346fe4a34427b71db75da7}
[\ldots]
		\end{Verbatim}
	\end{beamercolorbox}
\end{frame}

Rémy Huet's avatar
Rémy Huet committed
221
222
223
224
\begin{frame}[fragile]
	\begin{beamercolorbox}[rounded=true, shadow=true]{terminal}
		\begin{Verbatim}
$ git rebase master \Pause
Quentin Duchemin's avatar
Quentin Duchemin committed
225
Rembobinage préalable de head pour pouvoir rejouer votre travail par-dessus\ldots
Rémy Huet's avatar
Rémy Huet committed
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
Application de  ajout à dev \Pause
$ git log --graph --decorate \Pause
* \textcolor{yellow}{commit 1b9926f89453896c3f11e1f75b6871d70f35c5a4 (}{\bf\textcolor{cyan}{HEAD -> }\textcolor{green}{develop}}\textcolor{yellow}{)}
\textcolor{red}{|} Author: huetremy <remy.huet@etu.utc.fr>
\textcolor{red}{|} Date:   Mon Jan 14 15:33:59 2019 +0100
\textcolor{red}{|}
\textcolor{red}{|}     ajout à dev
\textcolor{red}{|}
* \textcolor{yellow}{commit 6fe645e97ba1a69c99438fba05f21902d19f1055 (}{\bf\textcolor{green}{master}}\textcolor{yellow}{)}
\textcolor{red}{|} Author: huetremy <remy.huet@etu.utc.fr>
\textcolor{red}{|} Date:   Mon Jan 14 15:31:47 2019 +0100
\textcolor{red}{|}
\textcolor{red}{|}     Avant rebase
\textcolor{red}{|}
*   \textcolor{yellow}{commit 1892470146ed37358a45e8e5cd9715ec0fc3448a}
\textcolor{myGreen}{|}\textcolor{yellow}{|}  Merge: 37d2273 2292018
\textcolor{myGreen}{|} \textcolor{yellow}{|} Author: huetremy <remy.huet@etu.utc.fr>
\textcolor{myGreen}{|} \textcolor{yellow}{|} Date:   Mon Jan 14 14:50:00 2019 +0100
\textcolor{myGreen}{|} \textcolor{yellow}{|}
\textcolor{myGreen}{|} \textcolor{yellow}{|}     Merge branch 'develop'
\textcolor{myGreen}{|} \textcolor{yellow}{|}
\textcolor{myGreen}{|} * \textcolor{yellow}{commit 2292018a27182fef507601140c7f93d679b93678}
\textcolor{myGreen}{|} \textcolor{yellow}{|} Author: huetremy <remy.huet@etu.utc.fr>
\textcolor{myGreen}{|} \textcolor{yellow}{|} Date:   Mon Jan 14 14:01:37 2019 +0100
\textcolor{myGreen}{|} \textcolor{yellow}{|}
\textcolor{myGreen}{|} \textcolor{yellow}{|}     Ajout fichier dev
\textcolor{myGreen}{|} \textcolor{yellow}{|}
* \textcolor{yellow}{|} commit 37d2273def21ff6d8bb33f0600220764f67f2ab9
\textcolor{yellow}{|}\textcolor{yellow}{/}  Author: huetremy <remy.huet@etu.utc.fr>
\textcolor{yellow}{|}   Date:   Mon Jan 14 14:49:12 2019 +0100
[\ldots]
		\end{Verbatim}
	\end{beamercolorbox}
\end{frame}

Quentin Duchemin's avatar
Quentin Duchemin committed
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
\begin{frame}[fragile]
	\frametitle{Le rebase}
	\framesubtitle{Rebase interactif -- Principe}
	Cet outil puissant permet de ré-écrire comme bon vous semble votre historique \textbf{local}.
	\medskip
	
	{\tiny On ne le répètera jamais assez : \textbf{n'utilisez jamais cette commande sur des commits déjà poussés, sauf si vous savez exactement ce que vous faites et connaissez les conséquences.}\par}
	\Pause
	\begin{block}{Cas d'utilisation}
		\begin{itemize}
			\item Changer l'ordre des commits
			\item Fusionner des commits
			\item Supprimer des commits
			\item Modifier le contenu d'un ou plusieurs commits
			\item \ldots
		\end{itemize}
	\end{block}
\end{frame}

\begin{frame}[fragile]
	\frametitle{Le rebase}
	\framesubtitle{Rebase interactif -- Fonctionnement}
		Les commits que vous souhaitez modifier ou ré-ordonner vous sont présentés dans un éditeur. Pour chaque commit, vous pouvez choisir une action.
		\medskip
		\Pause
		
		\begin{block}{Principales commandes pour le rebase interactif}
			\begin{itemize}
				\item \texttt{pick} : garder le commit en l'état \Pause
				\item \texttt{reword} : éditer le message de commit \Pause
				\item \texttt{edit} : modifier le contenu du commit \Pause
				\item \texttt{squash} : fusionner avec le commit précédent \Pause
				\item \texttt{drop} : supprimer le commit
			\end{itemize}
		\end{block}
		\medskip
		\Pause		
		Il est aussi possible de changer l'ordre des commits en les ordonnançant manuellement.
\end{frame}

\begin{frame}[fragile]
	\frametitle{Le rebase}
	\framesubtitle{Rebase interactif -- Exemple (1/4)}						
	Vous avez développé une fonctionnalité, puis commencé une deuxième sans être certain de la garder en l'état, puis réparé la première.\Pause
	\medskip
	
	\begin{beamercolorbox}[rounded=true, shadow=true]{terminal}
		\begin{Verbatim}
$ echo "Ajout d'une super fonctionnalité" >> F1.txt
$ git add F1.txt && git commit -m "Nouvelle fonctionnalité : F1"
[rebase_interactif b191156] Nouvelle fonctionnalité : F1
  1 file changed, 1 insertion(+)\Pause

$ echo "Début d'une autre fonctionnalité" >> F2.txt
$ git add F2.txt && git commit -m "wip F2"
[rebase_interactif dc4eba5] wip F2
  1 file changed, 1 insertion(+)\Pause

$ echo "Rajout du point virgule manquant\ldots" >> F1.txt 
$ git commit -am "Résolution de bug sur F1"
[rebase_interactif a1b72f7] Résolution de bug sur F1
  1 file changed, 1 insertion(+), 1 deletion(-)\Pause
		\end{Verbatim}
	\end{beamercolorbox}
	\medskip
	
	Vous voulez maintenant pousser un historique propre pour faciliter la compréhension des autres contributeurs.
	
\end{frame}

\begin{frame}[fragile]
	\frametitle{Le rebase}
	\framesubtitle{Rebase interactif -- Exemple (2/4)}
		L'historique local est dans l'état suivant :
		\medskip
		
		\begin{beamercolorbox}[rounded=true, shadow=true]{terminal}
			\begin{Verbatim}
$ git log --oneline

\textcolor{yellow}{a1b72f7  (}\textcolor{cyan}{HEAD ->} \textcolor{green}{rebase_interactif}\textcolor{yellow}{)} Résolution de bug sur F1
\textcolor{yellow}{dc4eba5} wip F2
\textcolor{yellow}{b191156} Nouvelle fonctionnalité : F1
[\ldots]
			\end{Verbatim}
		\end{beamercolorbox}
		\medskip
		\Pause
		\begin{block}{Objectifs}
			\begin{itemize}
				\item \textbf{Fusionner} les commits concernant F1 (le bug est trop minime pour en faire un commit\ldots)
				\item \textbf{Renommer} le commit concernant F2 (finalement, vous gardez votre développement en l'état).
			\end{itemize}
		\end{block}
\end{frame}

\begin{frame}[fragile]
	\frametitle{Le rebase}
	\framesubtitle{Rebase interactif -- Exemple (3/4)}
	On lance la commande de rebase, et on arrive dans un éditeur avec le contenu suivant.
	
	{\tiny Les commits les plus anciens sont en haut, contrairement aux logs}
	\medskip
	
	\begin{beamercolorbox}[rounded=true, shadow=true]{terminal}
		\begin{Verbatim}
$ git rebase -i HEAD~3

\textcolor{yellow}{pick} b191156 Nouvelle fonctionnalité : F1
\textcolor{yellow}{pick} dc4eba5 wip F2
\textcolor{yellow}{pick} a1b72f7 Résolution de bug sur F1
		\end{Verbatim}
	\end{beamercolorbox}
\medskip\Pause

On change l'ordre des commits ainsi que les commandes, puis on quitte l'éditeur.
\medskip

\begin{beamercolorbox}[rounded=true, shadow=true]{terminal}
\begin{Verbatim}
\textcolor{yellow}{pick} b191156 Nouvelle fonctionnalité : F1
\textcolor{yellow}{squash} a1b72f7 Résolution de bug sur F1
\textcolor{yellow}{reword} dc4eba5 wip F2
		\end{Verbatim}
	\end{beamercolorbox}
\end{frame}

\begin{frame}[fragile]
\frametitle{Le rebase}
\framesubtitle{Rebase interactif -- Exemple (4/4)}
	Il nous faudra encore renseigner les nouveaux messages de commits pour la fusion et le renommage. Une fois validés, Git joue les \textbf{nouveaux} commits un à un, comme pour un rebase classique.	
	\medskip\Pause
	
	\begin{beamercolorbox}[rounded=true, shadow=true]{terminal}
		\begin{Verbatim}
[detached HEAD c76ff8d] Nouvelle fonctionnalité : F1
Date: Wed Jan 16 01:24:52 2019 +0100
1 file changed, 2 insertions(+)
create mode 100644 F1.txt
[detached HEAD db9f68a] Début de la fonctionnalité F2
1 file changed, 1 insertion(+)
create mode 100644 F2.txt
Successfully rebased and updated refs/heads/rebase_interactif.

$ git log --oneline

\textcolor{yellow}{db9f68a (}\textcolor{cyan}{HEAD -> }\textcolor{green}{rebase_interactif}\textcolor{yellow}{)} Début de la fonctionnalité F2
\textcolor{yellow}{c76ff8d} Nouvelle fonctionnalité : F1
[\ldots]
		\end{Verbatim}
	\end{beamercolorbox}\Pause
\end{frame}

\begin{frame}[fragile]
Rémy Huet's avatar
Rémy Huet committed
415
	\frametitle{Le rebase}
Quentin Duchemin's avatar
Quentin Duchemin committed
416
417
418
419
420
421
422
	\framesubtitle{Rebase interactif -- Conclusion}
	Il y a beaucoup d'autres commandes : édition de commit, création de commits de fusion, exécution de commande shell\ldots~À adapter au besoin.
	\medskip\Pause
	
	\begin{block}{Soyez toujours prudents !}
		Par exemple, lorsque vous changez l'ordre de commits qui modifient le même fichier. Vous risquez de vous retrouver avec des \textbf{conflits en cascade} complexes à résoudre. En cas de problèmes, utilisez la commande \verb+git rebase --abort+ pour revenir en arrière, et ré-étudiez le problème.
	\end{block}
Rémy Huet's avatar
Rémy Huet committed
423
424
425
426
427
\end{frame}

\begin{frame}
	\frametitle{Le cherry-pick}
\end{frame}