fusionner_branches.tex 19.4 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
\begin{frame}[fragile]
	\frametitle{Le rebase}
	\framesubtitle{Exemple}
	\begin{beamercolorbox}[rounded=true,shadow=true]{terminal}
		\begin{Verbatim}
Rémy Huet's avatar
Rémy Huet committed
167
$ echo "Avant rebase" >> API.txt && git commit -am "Avant rebase" \Pause
Rémy Huet's avatar
Rémy Huet committed
168
169
170
[master 6fe645e] Avant rebase
 1 file changed, 1 insertion(+) \Pause

Rémy Huet's avatar
Rémy Huet committed
171
$ git checkout develop && echo ''Ma première ligne'' >> dev.txt && git commit -am ''ajout à dev'' \Pause
Rémy Huet's avatar
Rémy Huet committed
172
173
174
175
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
\begin{frame}[fragile]
Rémy Huet's avatar
Rémy Huet committed
262
	\frametitle{Le rebase}
Quentin Duchemin's avatar
Quentin Duchemin committed
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
	\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]
Quentin Duchemin's avatar
Quentin Duchemin committed
302
303
304
305
306
307
308
\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}
Quentin Duchemin's avatar
Quentin Duchemin committed
309
310
$ echo "Ajout d'une super fonctionnalité" >> F1.txt
$ git add F1.txt && git commit -m "Nouvelle fonctionnalité : F1"
Quentin Duchemin's avatar
Quentin Duchemin committed
311
312
[master b191156] Nouvelle fonctionnalité : F1
1 file changed, 1 insertion(+)\Pause
Quentin Duchemin's avatar
Quentin Duchemin committed
313
314
315

$ echo "Début d'une autre fonctionnalité" >> F2.txt
$ git add F2.txt && git commit -m "wip F2"
Quentin Duchemin's avatar
Quentin Duchemin committed
316
317
[master dc4eba5] wip F2
1 file changed, 1 insertion(+)\Pause
Quentin Duchemin's avatar
Quentin Duchemin committed
318
319
320

$ echo "Rajout du point virgule manquant\ldots" >> F1.txt 
$ git commit -am "Résolution de bug sur F1"
Quentin Duchemin's avatar
Quentin Duchemin committed
321
322
323
324
325
326
327
328
[master 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.

Quentin Duchemin's avatar
Quentin Duchemin committed
329
330
331
\end{frame}

\begin{frame}[fragile]
Quentin Duchemin's avatar
Quentin Duchemin committed
332
333
334
335
336
337
338
\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}
Quentin Duchemin's avatar
Quentin Duchemin committed
339
340
$ git log --oneline

Quentin Duchemin's avatar
Quentin Duchemin committed
341
\textcolor{yellow}{a1b72f7  (}\textcolor{cyan}{HEAD ->} \textcolor{green}{master}\textcolor{yellow}{)} Résolution de bug sur F1
Quentin Duchemin's avatar
Quentin Duchemin committed
342
343
344
\textcolor{yellow}{dc4eba5} wip F2
\textcolor{yellow}{b191156} Nouvelle fonctionnalité : F1
[\ldots]
Quentin Duchemin's avatar
Quentin Duchemin committed
345
346
347
348
349
350
351
352
353
354
\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}
Quentin Duchemin's avatar
Quentin Duchemin committed
355
356
357
\end{frame}

\begin{frame}[fragile]
Quentin Duchemin's avatar
Quentin Duchemin committed
358
359
360
361
362
363
364
365
366
\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}
Quentin Duchemin's avatar
Quentin Duchemin committed
367
368
369
370
371
$ 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
Quentin Duchemin's avatar
Quentin Duchemin committed
372
373
\end{Verbatim}
\end{beamercolorbox}
Quentin Duchemin's avatar
Quentin Duchemin committed
374
375
376
377
378
379
380
381
382
383
\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
Quentin Duchemin's avatar
Quentin Duchemin committed
384
385
\end{Verbatim}
\end{beamercolorbox}
Quentin Duchemin's avatar
Quentin Duchemin committed
386
387
388
389
390
\end{frame}

\begin{frame}[fragile]
\frametitle{Le rebase}
\framesubtitle{Rebase interactif -- Exemple (4/4)}
Quentin Duchemin's avatar
Quentin Duchemin committed
391
392
393
394
395
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}
Quentin Duchemin's avatar
Quentin Duchemin committed
396
397
398
399
400
401
402
[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
Quentin Duchemin's avatar
Quentin Duchemin committed
403
Successfully rebased and updated refs/heads/master.
Quentin Duchemin's avatar
Quentin Duchemin committed
404
405
406

$ git log --oneline

Quentin Duchemin's avatar
Quentin Duchemin committed
407
\textcolor{yellow}{db9f68a (}\textcolor{cyan}{HEAD -> }\textcolor{green}{master}\textcolor{yellow}{)} Début de la fonctionnalité F2
Quentin Duchemin's avatar
Quentin Duchemin committed
408
409
\textcolor{yellow}{c76ff8d} Nouvelle fonctionnalité : F1
[\ldots]
Quentin Duchemin's avatar
Quentin Duchemin committed
410
411
\end{Verbatim}
\end{beamercolorbox}\Pause
Rémy Huet's avatar
Rémy Huet committed
412
413
\end{frame}

Quentin Duchemin's avatar
Quentin Duchemin committed
414
\begin{frame}[fragile]
Quentin Duchemin's avatar
Quentin Duchemin committed
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
\frametitle{Le rebase}
\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}
\end{frame}

\begin{frame}[fragile]
\frametitle{Le cherry-pick}
\framesubtitle{Ou comment récupérer des commits \og{}à la demande\fg{}}
Applique les changements introduits par un ou plusieurs commits.

Il faut éviter d'utiliser cette commande à tort et à travers, mais elle est très utile dans certains cas bien spécifiques.\Pause
\medskip

{\tiny Contrairement au rebase, on peut cherry-pick des commits déjà poussés.}\Pause
\medskip 

\begin{block}{Cas d'utilisation}
	\begin{itemize}
		\item Récupérer une fonctionnalité d'une branche sans le reste
		\item Rétropropager la correction d'un bug faite sur une nouvelle branche
		\item \ldots
	\end{itemize}
\end{block}
\end{frame}

\begin{frame}[fragile]
Rémy Huet's avatar
Rémy Huet committed
446
	\frametitle{Le cherry-pick}
Quentin Duchemin's avatar
Quentin Duchemin committed
447
448
449
450
451
452
453
454
455
	\framesubtitle{Exemple (1/2)}
	Je règle un bug sur une branche \texttt{develop}, et je continue à développer. Je veux que la résolution soit portée sur \texttt{master}, mais sans récupérer les fonctionnalités instables de \texttt{develop}. 
	\medskip
	
	{\tiny On verra plus tard comment éviter cette situation pas très propre\ldots.}\Pause
	\begin{figure}[h]
		\centering
		\input{src/tikz/cherry-pick.tex}
	\end{figure}\Pause
Quentin Duchemin's avatar
Quentin Duchemin committed
456
	
Quentin Duchemin's avatar
Quentin Duchemin committed
457
458
	\begin{block}{}
		Comment récupérer uniquement \texttt{C4} ?
Quentin Duchemin's avatar
Quentin Duchemin committed
459
	\end{block}
Rémy Huet's avatar
Rémy Huet committed
460
461
\end{frame}

Quentin Duchemin's avatar
Quentin Duchemin committed
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
\begin{frame}[fragile]
\frametitle{Le cherry-pick}
\framesubtitle{Exemple (2/2)}
\begin{beamercolorbox}[rounded=true, shadow=true]{terminal}
	\begin{Verbatim}
$ git checkout -b develop\Pause
$ cat dev.txt
$ echo "Resolution de bug" >> dev.txt
$ git commit -am "Resolution de bug"
[develop \textcolor{yellow}{c586d4d}] Resolution de bug
  1 file changed, 1 insertion(+)\Pause
$ echo "Debut nouvelle fonctionnalité" >> dev.txt
$ git commit -am "Nouvelle fonctionnalité" 
[develop \textcolor{yellow}{2bbe0bd}] Nouvelle fonctionnalité
  1 file changed, 1 insertion(+)
$ cat dev.txt
	Resolution de bug
	Debut nouvelle fonctionnalité\Pause
$ git checkout master
Switched to branch 'master'
Your branch is up to date with 'origin/master'.\Pause
$ git show HEAD --oneline
\textcolor{yellow}{db9f68a (}\textcolor{cyan}{HEAD ->} \textcolor{green}{master}\textcolor{yellow}{)} Début de la fonctionnalité F2\Pause
$ git cherry-pick -x c586d4d
[master 6bc2b57] Resolution de bug
  1 file changed, 1 insertion(+)\Pause
$ git show HEAD --oneline
\textcolor{yellow}{6bc2b57 (}\textcolor{cyan}{HEAD ->} \textcolor{green}{master}\textcolor{yellow}{)} Resolution de bug (cherry picked from commit \textcolor{yellow}{c586d4d})\Pause
$ cat dev.txt
	Resolution de bug
	\end{Verbatim}
\end{beamercolorbox}
Rémy Huet's avatar
Rémy Huet committed
494
\end{frame}
Quentin Duchemin's avatar
Quentin Duchemin committed
495
496
497
498
499
500
501
502
503
504
505
506
507

\begin{frame}[fragile]
\frametitle{Le cherry-pick}
\framesubtitle{Conclusion}
	\begin{block}{Recommandations}
		\begin{itemize}
			\item Préférer le merge au cherry-pick quand c'est possible\Pause
			\item Le cherry-pick n'évite pas les conflits, par exemple si un fichier a été modifié sur les deux branches depuis le commit ancêtre commun\Pause
			\item Toujours utiliser le flag \texttt{-x} pour retrouver le commit de référence\Pause
			\item Utiliser le flag \texttt{-e} pour modifier le message de commit\Pause
		\end{itemize}
	\end{block}
\end{frame}