Commit 3c1f4f3f authored by Remy Huet's avatar Remy Huet

Merge branch 'rebase_interactif_cherry' into 'gestion_non_linéaire'

Rebase interactif + cherry-pick V1

See merge request !5
parents c696ad51 3a0795d9
Pipeline #33575 passed with stage
in 27 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).
......
......@@ -13,7 +13,7 @@
\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},
......@@ -38,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}
......
......@@ -101,7 +101,7 @@ $ git log --graph --decorate \Pause
\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...).
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
......@@ -150,7 +150,7 @@ $ git log --graph --decorate \Pause
\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...
\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 \\
......@@ -222,7 +222,7 @@ $ git log --graph --decorate --all
\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...
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}{)}
......@@ -258,11 +258,250 @@ $ git log --graph --decorate \Pause
\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 -- 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/master.
$ git log --oneline
\textcolor{yellow}{db9f68a (}\textcolor{cyan}{HEAD -> }\textcolor{green}{master}\textcolor{yellow}{)} Début de la fonctionnalité F2
\textcolor{yellow}{c76ff8d} Nouvelle fonctionnalité : F1
[\ldots]
\end{Verbatim}
\end{beamercolorbox}\Pause
\end{frame}
\begin{frame}
\begin{frame}[fragile]
\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]
\frametitle{Le cherry-pick}
\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
\begin{block}{}
Comment récupérer uniquement \texttt{C4} ?
\end{block}
\end{frame}
\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}
\end{frame}
\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}
\ No newline at end of file
\tikzstyle{commit}=[draw,circle]
\begin{tikzpicture}[scale=0.7]
\node[commit, fill=red!50] (C0)at(0,0){C0} ;
\node[commit, fill=red!50] (C1)at(3,0){C1} ;
\node[commit, fill=red!50] (C2)at(6,0){C2};
\node[commit, fill=green!60] (C3)at(3,-1.5){C3};
\node[commit, fill=green!60] (C4)at(6,-1.5){C4};
\node[commit, fill=green!60] (C5)at(9,-1.5){C5};
\draw[->, >=latex] (C1) -- (C0) ;
\draw[->, >=latex] (C2) -- (C1) ;
\draw[->, >=latex] (C3) -- (C0) ;
\draw[->, >=latex] (C4) -- (C3) ;
\draw[->, >=latex] (C5) -- (C4) ;
\Pause
\onslide<+->{\node[commit, fill=red!50] (C4b)at(9,0){C4*} ;\draw[->, >=latex] (C4b) -- (C2) ;}
\end{tikzpicture}
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment