Commit 92397bf3 authored by Grégory Mounié's avatar Grégory Mounié
Browse files

Modification de l'historique plus longue et détaillée

parent 39b361d9
......@@ -26,22 +26,31 @@ de qualité. Dans cette session nous allons~:
taille.
\end{itemize}
Pour cette session, les différents exercices peuvent être réalisé
Pour cette session, les différents exercices peuvent être réalisés
seuls.
\section{Nettoyage d'un historique}
Le nettoyage de l'historique change les commits. Cela signifie
qu'\textbf{il faut réaliser ce nettoyage avant de publier les commits}
et qu'ils ne soient récupérés dans un autre dépot. En effet, sinon les deux
historiques seront incohérents et git ne pourra plus gérer les opérations
de fusion.
Dans ce TP, nous nettoyerons l'historique d'un dépot déjà publié, ce
qui ne faut jamais faire en pratique.
\subsection{Mise en place}
Cloner le dépot suivant contenant un historique perfectible:
\begin{lstlisting}
git clone https://github.com/moy/dumb-project.git
\end{lstlisting}
\begin{minted}{console}
$ git clone git@gitlab.ensimag.fr:git/dumb-project.git
\end{minted}
Observer l'historique, par exemple avec~:
\begin{lstlisting}
git log --graph -c --pretty=full
\end{lstlisting}
\begin{minted}{console}
$ git log --graph -c --pretty=full
\end{minted}
\subsection{Reconstruire l'historique}
......@@ -50,41 +59,84 @@ problèmes~: coquilles dans les messages de commit, commits qui sont
visiblement mal séparés ou redondants, etc.
Tout ce que vous avez à faire est d'utiliser la commande
\lstinline{git rebase -i} pour reconstruire l'historique à votre
\mintinline{bash}{git rebase -i} pour reconstruire l'historique à votre
convenance. Procédez par petits pas plutôt que de tout faire d'un
coup. Git vous permet de faire plusieurs reconstructions d'historique
à la suite. Pour remonter au commit d'origine, vous pouvez utiliser~:
\begin{lstlisting}
git rebase -i --root
\end{lstlisting}
Sinon, à la place de l'option \lstinline{--root}, vous pouvez
\begin{minted}{console}
$ git rebase -i --root
\end{minted}
Cela affichera votre éditeur préféré, celui configuré par défaut, avec le contenu suivant:
\begin{minted}{ini}
pick 27f44e5 Initial revision
pick 8900bfb Add diff, test it, and test add better.
pick 2612865 Rename diff to sub
pick 48a2fa4 Rename diff to sub in tests too
pick df7eae8 add fnuctino f
# Rebasage de df7eae8 sur f223221 (5 commandes)
#
# Commandes :
# p, pick <commit> = utiliser le commit
# r, reword <commit> = utiliser le commit, mais reformuler son message
# e, edit <commit> = utiliser le commit, mais s'arrêter pour le modifier
# s, squash <commit> = utiliser le commit, mais le fusionner avec le précédent
# f, fixup <commit> = comme "squash", mais en éliminant son message
# x, exec <commit> = lancer la commande (reste de la ligne) dans un shell
# b, break = s'arrêter ici (on peut continuer ensuite avec 'git rebase --continue')
# d, drop <commit> = supprimer le commit
# l, label <label> = étiqueter la HEAD courante avec un nom
# t, reset <label> = réinitialiser HEAD à label
# m, merge [-C <commit> | -c <commit>] <label> [# <uniligne>]
# créer un commit de fusion utilisant le message de fusion original
# (ou l'uniligne, si aucun commit de fusion n'a été spécifié).
# Utilisez -c <commit> pour reformuler le message de validation.
#
# Vous pouvez réordonner ces lignes ; elles sont exécutées de haut en bas.
#
# Si vous éliminez une ligne ici, LE COMMIT CORRESPONDANT SERA PERDU.
#
# Cependant, si vous effacez tout, le rebasage sera annulé.
#
\end{minted}
Sinon, à la place de l'option \mintinline{bash}{--root}, vous pouvez
également utiliser un numéro de commit particulier.
Nous vous proposons de faire les modifications suivantes:
\begin{enumerate}
\item découper le deuxième commit en deux ou trois morceaux
\item fusionner le troisième et quatrième commit avec l'option de
votre choix
\item reformuler le message du dernier commit
\end{enumerate}
Pour séparer un commit en plusieurs morceaux, le plus simple est
d'arrêter le rebase sur le commit à séparer pour une édition (edit),
de le défaire (avec reset), puis d'enregistrer les nouveaux commits
avant de continuer.
\begin{lstlisting}
git rebase -i
# mettre le commit à séparer à "edit"
git reset HEAD^
git add ...
git commit ...
git add ...
git commit ...
git rebase --continue
\end{lstlisting}
\begin{minted}{console}
$ git rebase -i --root
# mettre le commit à séparer à "edit"
# et demander aussi les autres modifications
$ git reset HEAD^
$ git add ...
$ git commit ...
$ git add ...
$ git commit ...
$ git rebase --continue
\end{minted}
\section{Recherche par bissection}
Afin d'illustrer le principe de la recherche par bissection, nous
allons récupérer un dépôt de grande taille~: celui de Git
lui-même. Récupérez le dépôt du projet en le clonant~:
\begin{lstlisting}
git clone https://github.com/git/git.git
\end{lstlisting}
\begin{minted}{console}
$ git clone https://github.com/git/git.git
\end{minted}
L'une des fonctionnalités qui a été ajoutée à git est la possibilité
L'une des fonctionnalités qui a été ajoutée à Git est la possibilité
de synchroniser un dépôt avec Mediawiki. Mais quand donc cette
fonctionnalité a-t-elle été introduite ? Nous allons faire une
recherche dans l'historique.
......
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