Commit e3bd8e7b authored by Remy Huet's avatar Remy Huet

Merge branch 'gestion_non_linéaire'

parents 4ecc749e 3c1f4f3f
Pipeline #33577 passed with stages
in 1 minute and 4 seconds
24 janvier 2019
Rémy Huet (remy.huet@etu.utc.fr), Thibaud Duhautbout (thibaud@duhautbout.ovh), Association Picasoft (picasoft@assos.utc.fr)
Rémy Huet (remy.huet@etu.utc.fr), Thibaud Duhautbout (thibaud@duhautbout.ovh), Quentin Duchemin (quentinduchemin@tuta.io), Association Picasoft (picasoft@assos.utc.fr)
La présentation et tous les fichiers qui composent ce dépôt sont sous licence
Creative Commons 4.0 Attribution - Partage dans les Mêmes Conditions 4.0
......
......@@ -2,7 +2,7 @@
## Description
Repo de la formation git de l'api/casoft Init. **En cas de questions :** [remy.huet@etu.utc.fr](mailto://remy.huet@etu.utc.fr), [thibaud@duhautbout.ovh](mailto://thibaud@duhautbout.ovh).
Repo de la formation git de l'api/casoft Init. **En cas de questions :** [remy.huet@etu.utc.fr](mailto://remy.huet@etu.utc.fr), [thibaud@duhautbout.ovh](mailto://thibaud@duhautbout.ovh), [quentinduchemin@tuta.io](mailto://quentinduchemin@tuta.io).
Pour aller plus loin : lire la [documentation de git](https://git-scm.com/docs).
......
......@@ -11,8 +11,9 @@
\usepackage{listings}
\usepackage{fancyvrb}
\usepackage{xcolor}
\usepackage{tikz}
\hypersetup{
pdfauthor={Rémy Huet, Thibaud Duhautbout},
pdfauthor={Rémy Huet, Thibaud Duhautbout, Quentin Duchemin},
pdftitle={Api/casoft Init - Jour 4 : Git},
pdfsubject={Formation git},
pdfkeywords={git, gestion de version, VCS},
......@@ -37,9 +38,9 @@ pdfproducer={Latex},
\title[Api/casoft Init - Git]{Api/casoft Init - Jour 4 - Git}
\titlegraphic{\includegraphics[width=5em]{./imgs/picasoft_logo.png}\\ \href{https://creativecommons.org/licenses/by-sa/4.0/deed.fr}{\includegraphics[width=4em]{./imgs/licence.eps}}}
\author[R. Huet, T. Duhautbout]{%
\phantom{x}\hfill Rémy {\sc Huet} \hfill Thibaud {\sc Duhautbout} \hfill\phantom{x}}
\institute[Picasoft]{Association Picasoft}
\author[R. Huet, T. Duhautbout, Q. Duchemin]{%
\phantom{x}\hfill Rémy {\sc Huet} \hfill Thibaud {\sc Duhautbout} \hfill Quentin \textsc{Duchemin} \hfill \phantom{x}}
\institute[]{Association Picasoft}
\date[24/01/2019]{Jeudi 24 janvier 2018}
\usetheme{AnnArbor}
......
\begin{frame}
\frametitle{Gestion des branches}
\begin{frame}[fragile]
\frametitle{Gestion pratique des branches}
\begin{block}{Création d'une branche}
\begin{itemize}
\item \verb+git branch <nom>+ pour créer une branche ;
\item \verb+git checkout -b <nom>+ pour créer une branche et changer la branche courante pour celle-ci.
\end{itemize}
\end{block}
\Pause
\begin{block}{Statut des branches}
\begin{itemize}
\item La commande \verb+git status+ indique la branche courante;
\item La commande \verb+git branch+ montre la liste des branches et la branche courante.
\end{itemize}
\end{block}
\Pause
\begin{block}{Suppression d'une branche}
\begin{itemize}
\item \verb+git branch -d <nom>+ pour supprimer une branche;
\item Si la branche n'a pas été fusionnée, \verb+git branch -D <nom>+.
\end{itemize}
\end{block}
\end{frame}
\begin{frame}[fragile]
\frametitle{Application}
\begin{beamercolorbox}[rounded=true, shadow=true]{terminal}
\begin{Verbatim}
$ git branch premiere_branche \Pause
$ git branch \Pause
* \textcolor{myGreen}{master}
premiere_branche \Pause
$ git checkout -b develop \Pause
Basculement sur la nouvelle branche 'develop' \Pause
$ git status \Pause
Sur la branche develop
rien à valider, la copie de travail est propre \Pause
$ git branch -d premiere_branche \Pause
Branche premiere_branche supprimée (précédemment 168efba)
$ touch dev.txt \Pause
$ git add -A && git commit -m ''Ajout fichier dev'' \Pause
[develop 2292018] Ajout fichier dev
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 dev.txt
\end{Verbatim}
\end{beamercolorbox}
\end{frame}
\begin{frame}
\begin{frame}[fragile]
\frametitle{Changer de branche}
\framesubtitle{Plus facile qu'à l'UTC !}
\begin{block}{Comment faire ?}
\begin{itemize}
\item Une commande simple : \verb+git checkout <nom_de_la_branche>+;
\item {\bf Attention :} ne pas avoir de changements non validés ! (ou passer par un \verb+git stash+)
\end{itemize}
\end{block}
\Pause
\begin{block}{Rappel}
\verb+git checkout+ sert aussi à se déplacer sur un commit précis. \\
En fait, cette commande sert à déplacer le \verb+HEAD+. On peut assimiler un \verb+checkout+ sur une branche à un \verb+checkout+ sur un commit.\\
En fait, le nom de le branche n'est {\bf qu'une étiquette} sur le dernier commit de celle-ci.
\end{block}
\end{frame}
\begin{frame}
\begin{frame}[fragile]
\frametitle{Visualisation}
\framesubtitle{Un joli graphe !}
\begin{itemize}
\item En console : \verb+git log --graph --decorate --all+
\item Depuis GitLab :
\end{itemize}
\begin{center}
\includegraphics[height=.5\paperheight]{imgs/graph_gitlab.png}
\end{center}
\end{frame}
\begin{frame}[fragile]
\frametitle{Visualisation}
\begin{beamercolorbox}[rounded=true, shadow=true]{terminal}
\begin{Verbatim}
$ git checkout master && ls \Pause
Basculement sur la branche 'master'
Votre branche est à jour avec 'origin/master'.
API.txt \Pause
$ git log --graph --decorate --all \Pause
* \textcolor{yellow}{commit 2292018a27182fef507601140c7f93d679b93678 (}{\bf\textcolor{green}{develop}}\textcolor{yellow}{)}
\textcolor{red}{|} Author: huetremy <remy.huet@etu.utc.fr>
\textcolor{red}{|} Date: Mon Jan 14 14:01:37 2019 +0100
\textcolor{red}{|}
\textcolor{red}{|} Ajout fichier dev
\textcolor{red}{|}
* \textcolor{yellow}{commit 168efba77dcfd59ba4346fe4a34427b71db75da7 (}{\bf\textcolor{cyan}{HEAD -> }\textcolor{green}{master}}\textcolor{yellow}{)}
\textcolor{red}{|} Author: huetremy <remy.huet@etu.utc.fr>
\textcolor{red}{|} Date: Fri Jan 11 14:53:09 2019 +0100
\textcolor{red}{|}
\textcolor{red}{|} Commit supplémentaire
\textcolor{red}{|}
* \textcolor{yellow}{commit a04da653083b6b0ba3eea2bce98d903acfd0a4d3}
\textcolor{red}{|} Author: huetremy <remy.huet@etu.utc.fr>
\textcolor{red}{|} Date: Fri Jan 11 10:16:10 2019 +0100
\textcolor{red}{|}
\textcolor{red}{|} Troisième commit
[\ldots]
\end{Verbatim}
\end{beamercolorbox}
\end{frame}
\begin{frame}
\frametitle{Principe de la gestion non linéaire}
Jusqu'ici, on n'a fait que de la gestion linéaire.
Tous les commits étaient sur {\bf une unique branche} (master)
En pratique, tous les commits ne sont pas nécessairement sur la même branche de l'arbre.
\begin{figure}[h]
\centering
\input{src/tikz/arbre.tex}
\end{figure}
{\it Le sens des flèches n’est pas chronologique !
Chaque commit pointe vers son père.}
\end{frame}
\begin{frame}[fragile]{Gestion non linéaire}
\begin{block}{}
\centering
\enquote{Mais pourquoi est-ce qu'on fait ça ?}
\end{block}
\bigskip
\Pause
Une divergence s'effectue à partir d'un certain point : tout le travail précédent l'instant de divergence est commun à toutes les branches postérieures à la création de la divergence.
\medskip
On peut donner quelques raisons \enquote{générales} sur l'utilité des divergences :
\begin{itemize}
\item isoler les travaux indépendants en cours
\item traiter les problèmes d'intégration séparément
\item enregistrer des versions spécifiques
\end{itemize}
En pratique, l'utilisation des divergences dépend beaucoup du type de projet, de la répartition des travaux entre les contributeurs et des méthodes de travail adoptées.
\end{frame}
\begin{frame}
\frametitle{Création d'une divergence}
\framesubtitle{Comment créer une divergence}
\framesubtitle{Analyse}
\begin{figure}[h]
\centering
\input{src/tikz/arbre.tex}
\end{figure}
\begin{itemize}
\item C2 et C3 ont tous les deux C1 comme père
\item C2 et C3 introduisent des modifications différentes après C1
\item ici, C2 et C3 sont sur \textbf{deux branches différentes de C1}
\end{itemize}
\end{frame}
\begin{frame}
\frametitle{Création d'une divergence}
\framesubtitle{Explications}
\framesubtitle{Analyse}
\begin{figure}[h]
\centering
\input{src/tikz/arbre.tex}
\end{figure}
\begin{itemize}
\item C4 et C5 ont tous les deux C3 comme père
\item C4 et C5 introduisent des modifications différentes après C3
\item C4 est sur une branche \textbf{différente de C3}
\item C5 est sur \textbf{la même branche que C3}
\end{itemize}
\end{frame}
\begin{frame}
\frametitle{Création d'une divergence}
\framesubtitle{Mise en contexte}
\begin{block}{}
Alice, Bob et Charlie travaillent sur un rapport ensemble et décident d'utiliser Git pour gérer l'avancée de leur travail.
\end{block}
\begin{figure}[h]
\centering
\input{src/tikz/arbre.tex}
\end{figure}
\begin{itemize}
\item Alice met en place la structure globale du rapport avec C0 et C1
\Pause
\item Bob se charge de la partie 1, il crée une nouvelle branche dédiée à sa partie et ajoute C2
\end{itemize}
\end{frame}
\begin{frame}
\frametitle{Création d'une divergence}
\framesubtitle{Illustrations / exemple}
\framesubtitle{Mise en contexte}
\begin{figure}[h]
\centering
\input{src/tikz/arbre.tex}
\end{figure}
\begin{itemize}
\item Charlie s'occupe de la partie 2.1 : il ajoute la structure de la partie 2 avec C3 sur une nouvelle branche, et avance sa partie avec C5
\Pause
\item Alice rédige la partie 2.2 : elle crée une nouvelle branche à partir de C3 pour récupérer la structure de la partie 2, puis ajoute C4 et C6
\end{itemize}
\end{frame}
\begin{frame}
\frametitle{Fusion !}
\begin{figure}[h]
\centering
\input{src/tikz/arbre.tex}
\end{figure}
\begin{block}{}
\centering
\enquote{Attends un peu, et C7 il fait quoi ? Et pourquoi il a deux pères ?}
\end{block}
\Pause
\begin{itemize}
\item C7 est un commit un peu spécial : c'est un \textbf{commit de fusion};
\item Objectif : intégrer les modifications de la branche bleue dans la branche verte (Alice fusionne ses modifications dans la branche de Charlie);
\item Il a bien \textbf{deux} pères (c'est la seule situation où ça arrive);
\item \textbf{Attention !} Si C5 et C6 portent des modifications qui se recouvrent, la fusion va créer des \textbf{conflits} qu'il faudra régler avant de créer C7.
\end{itemize}
\end{frame}
\begin{frame}
\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]
\frametitle{Le merge}
Le \verb+merge+ applique les modifications apportées depuis la divergence par la branche secondaire sur la branche de départ.
\begin{figure}[h]
\centering
\input{src/tikz/merge.tex}
\end{figure}
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}
\end{frame}
\begin{frame}
\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}
\begin{frame}[fragile]
\frametitle{Le rebase}
\framesubtitle{Avertissement}
\begin{center}
\includegraphics[height=3em]{./imgs/warning.jpg}
\textbf{ATTENTION -- COMMANDE RISQUÉE}
\end{center}
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).
\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}
\end{frame}
\begin{frame}
\begin{frame}[fragile]
\frametitle{Le rebase}
\framesubtitle{Comparaison avec le merge}
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
\begin{figure}[h]
\centering
\input{src/tikz/avant_rebase.tex}
\caption{Avant le rebase}
\label{fig:avant_rebase}
\end{figure}
\begin{figure}[h]
\centering
\input{src/tikz/apres_rebase.tex}
\caption{Après le rebase}
\label{fig:apres_rebase}
\end{figure}
\end{frame}
\begin{frame}
\begin{frame}[fragile]
\frametitle{Le rebase}
\framesubtitle{Application simple}
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>+
\item régler les éventuels conflits\ldots
\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}
\end{frame}
\begin{frame}[fragile]
\frametitle{Le rebase}
\framesubtitle{Exemple}
\begin{beamercolorbox}[rounded=true,shadow=true]{terminal}
\begin{Verbatim}
$ echo "Avant rebase" >> API.txt && git commit -am "Avant rebase" \Pause
[master 6fe645e] Avant rebase
1 file changed, 1 insertion(+) \Pause
$ git checkout develop && echo ''Ma première ligne'' >> dev.txt && git commit -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
$ git log --graph --decorate --all
\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}
\begin{frame}[fragile]
\begin{beamercolorbox}[rounded=true, shadow=true]{terminal}
\begin{Verbatim}
$ git rebase master \Pause
Rembobinage préalable de head pour pouvoir rejouer votre travail par-dessus\ldots
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}
\begin{frame}
\begin{frame}[fragile]
\frametitle{Le rebase}
\framesubtitle{Rebase interactif}
\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"
[master 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"
[master 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"
[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.
\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}{master}\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 -- Exemp