Verified Commit fbde7ae7 authored by Quentin Duchemin's avatar Quentin Duchemin
Browse files

Ajout du cherry-pick v1

parent 2ed23b2c
Pipeline #33568 passed with stage
in 22 seconds
......@@ -299,78 +299,78 @@ $ git log --graph --decorate \Pause
\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}
\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
[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"
[rebase_interactif dc4eba5] wip F2
1 file changed, 1 insertion(+)\Pause
[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"
[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.
[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}
\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}{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{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}
\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}
\end{Verbatim}
\end{beamercolorbox}
\medskip\Pause
On change l'ordre des commits ainsi que les commandes, puis on quitte l'éditeur.
......@@ -381,18 +381,18 @@ On change l'ordre des commits ainsi que les commandes, puis on quitte l'éditeur
\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{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}
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(+)
......@@ -400,28 +400,108 @@ 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.
Successfully rebased and updated refs/heads/master.
$ git log --oneline
\textcolor{yellow}{db9f68a (}\textcolor{cyan}{HEAD -> }\textcolor{green}{rebase_interactif}\textcolor{yellow}{)} Début de la fonctionnalité F2
\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{Verbatim}
\end{beamercolorbox}\Pause
\end{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
\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}{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.
\begin{block}{}
Comment récupérer uniquement \texttt{C4} ?
\end{block}
\end{frame}
\begin{frame}
\frametitle{Le cherry-pick}
\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