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]
Remy Huet's avatar
Remy 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.

Remy Huet's avatar
Remy 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}
Remy Huet's avatar
Remy Huet committed
39 40
\end{frame}

Remy Huet's avatar
Remy 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]
Remy Huet's avatar
Remy 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}
Remy Huet's avatar
Remy Huet committed
112 113
\end{frame}

114
\begin{frame}[fragile]
Remy Huet's avatar
Remy 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

Remy Huet's avatar
Remy 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

Remy Huet's avatar
Remy 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}
Remy Huet's avatar
Remy Huet committed
139 140
\end{frame}

141
\begin{frame}[fragile]
Remy Huet's avatar
Remy 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}
Remy Huet's avatar
Remy Huet committed
160 161
\end{frame}

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

Remy Huet's avatar
Remy Huet committed
171
$ git checkout develop && echo ''Ma première ligne'' >> dev.txt && git commit -am ''ajout à dev'' \Pause
Remy Huet's avatar
Remy 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
Remy Huet's avatar
Remy Huet committed
176
$ git log --graph --decorate --all
Remy Huet's avatar
Remy 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}

Remy Huet's avatar
Remy 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
Remy Huet's avatar
Remy 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]
Remy Huet's avatar
Remy 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]
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"
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"
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"
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]
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

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]
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]
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
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
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)}
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
403
Successfully rebased and updated refs/heads/master.
Quentin Duchemin's avatar
Quentin Duchemin committed
404 405 406

$ git log --oneline

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]
410 411
\end{Verbatim}
\end{beamercolorbox}\Pause
Remy Huet's avatar
Remy Huet committed
412 413
\end{frame}

Quentin Duchemin's avatar
Quentin Duchemin committed
414
\begin{frame}[fragile]
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]
Remy Huet's avatar
Remy Huet committed
446
	\frametitle{Le cherry-pick}
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
	
457 458
	\begin{block}{}
		Comment récupérer uniquement \texttt{C4} ?
Quentin Duchemin's avatar
Quentin Duchemin committed
459
	\end{block}
Remy Huet's avatar
Remy Huet committed
460 461
\end{frame}

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}
Remy Huet's avatar
Remy Huet committed
494
\end{frame}
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}