Git

Maîtrisez git rebase --interactive

Julien Braure, Responsable Technique @DeliaTechnologies
Julien Braure, Responsable Technique @DeliaTechnologies
March 30, 2023
12 min

Dans notre série sur git, nous avons déjà utilisé git rebase afin de maintenir sa branche feature à jour en déplaçant les commits afin d'éviter les merge commits depuis main.

Dans ce nouvel article nous allons chercher à maîtriser l'historique des commits d'une branche grâce à la commande git rebase --interactive

Pré-requis

Pour faire simple, git rebase --interactive est l'équivalent de git commit --amend sous stéroïdes.

Si vous n’êtes pas à l'aise avec git commit --amend, faites nous savoir si un article sur le sujet vous intéresserait !

Introduction

La commande git rebase --interactive va nous permettre de:

Nous voyons donc que git est beaucoup plus puissant que subversion à ce niveau.

Premier contact

Sur une branche, contenant quelques commits, nous allons avoir besoin de la "racine" de cette branche. Pour cela, utilisons git merge-base

Ensuite vous pouvez utilisez ce commit-id dans la commande git rebase --interactive.

👉 En alternative, si vous connaissez le nombre de commit contenus dans votre branche, disons 4 dans notre exemple, vous pouvez aussi utiliser HEAD^^^^ ou HEAD~4 (le quatrième commit parent depuis HEAD). Vous pouvez aussi utiliser un nom de branche (par exemple main) ou tag, si cela correspond au commit que vous souhaitez.

Votre éditeur de texte (vim, notepad++, ...) s'ouvre, d'où le nom de ce mode interactif. La liste des commits contenus dans votre branche s'affiche de haut en bas. Cela est la todo liste pour le rebase.

Vous voyez pick avec le commit id du premier commit, et la première ligne de son message, puis la même chose pour le deuxième commit, et ainsi de suite...

Si vous ne touchez rien, et refermez l’éditeur, le rebase se lancera. Tous vos commits seront appliqués, et le résultat final sera une opération blanche, ou noop.

Bravo, vous avez découvert git rebase --interactive. Voyons maintenant plus en détail les différentes commandes disponibles.

Les commandes

Dans l’éditeur vous aller pouvoir changer les commandes, mais aussi l'ordre des commits.

p ou pick

La commande par défaut, la plus simple, qui veut simplement dire: applique ce commit

r ou reword

Applique ce commit, mais je souhaite modifier son message (votre éditeur va s'ouvrir).

👉 Pratique en cas de faute d'orthographe, d'oubli, etc, par exemple dans la référence de l'issue/bug.

e ou edit

Applique ce commit, fait une pause dans le rebase afin de vous permettre d’éditer le commit, généralement son diff.

👉 Très pratique pour :
- Corriger un problème dans le code (typo dans une méthode, variable, commentaires...), ou retirer un secret qui ne devrait pas être présent dans le commit...
- Retirer un fichier inutile (ajoute par erreur), ou rajouter un fichier manquant

d ou drop

Ignore ce commit, vous jetez le contenu complet de ce commit.

👉 Personnellement je supprime la ligne complète (dd sur vim), ce qui a le même effet. Cependant, mettre d vous laisse l'opportunité de changer d'avis avant de lancer le rebase.

x ou exec

Permet de lancer un script, à ce moment de la todo liste.

👉 Pratique pour lancer, par exemple, vos tests pour vérifier qu'ils passent, mais git rebase --exec "<command>" est plus approprié pour cela.

s ou squash, f ou fixup

Ces 2 commandes servent à fusionner le contenu diff de ce commit avec le contenu diff du commit précédent.

Il est possible de fusionner plus de 2 commits, il suffit de mettre squash ou fixup sur plusieurs commits.

Très pratique, nous verrons plus en détails ces commandes dans les exercices.

Exercices

Maîtriser git rebase --interactive n'est pas simple, seul l'entrainement vous permettra d’être a l'aise avec ce bel outil. Voici donc des exercices.

Changer le message du deuxième commit, avec reword

On change le pick de la deuxième ligne avec r et on ferme l’éditeur de la todo

Lorsque git rebase va traiter la deuxième commande, l’éditeur s'ouvrira avec le message du deuxième commit, et vous pouvez le modifier, puis fermer.

Ajouter un fichier manquant dans le premier commit, avec edit

Vous réalisez que vous avez oublié d'ajouter un fichier dans un de vos commits, un simple quatrième commit permet de rétablir le build globalement sur la branch, mais cela n'est pas un historique 100% propre.

On change le pick de la première ligne avec e et on ferme l’éditeur de la todo

git rebase va appliquer le premier commit, puis s’arrêter. Vous aller pouvoir modifier votre projet (ici ajouter un fichier manquant). Ajoutez les modifications que vous souhaitez au staging, puis reprenez le rebase avec git rebase --continue

Retirer le secret contenu dans un commit, avec fixup

Vous réalisez qu'un secret se trouve commité dans le premier commit, un simple quatrième commit pour le retirer ne suffit pas, car on le verra tout de même dans le diff.

Comment le supprimer complètement de l'historique ?

Nous pouvons utiliser edit comme dans l'exercice précédent, mais cela est plus sympa avec fixup

Pour cela nous allons créer un quatrième commit, mais avant de publier et merger la branche, nous allons fusionner ce quatrième commit "de réparation" dans le premier.

La todo avant édition

Nous déplaçons le quatrième commit sous le premier, et changeons pick par f

La todo après édition

Fermez l’éditeur, rebase applique la todo. Une fois terminée, il reste 3 commits sur votre branche, et le secret a vraiment disparu du premier commit, et donc de l'historique de votre projet.

👉 Une fois que vous commencez à maîtriser git rebase, ce genre de manipulation devient très pratique, par exemple, pour améliorer votre code après une relecture. Il existe même des options spécifiques git commit --fixup <commit> et git rebase --autosquash afin d'automatiser cette manipulation. Lisez notre article dédié à ce sujet.

Conclusion

Nous avons découvert une utilisation avancée de git grâce à une commande puissante git rebase --interactive. Ce genre de manipulation n’était pas possible avec des outils plus anciens comme subversion. Avec un peu d'entrainement, git rebase --interactive est un outil multi-function que vous utiliserez souvent.

D'autres articles pour vous

Tous nos articles →
photo camille

Envie de rejoindre l'aventure ?

Réservez un moment avec notre équipe RH en quelques clics, pour voir ensemble le meilleur moyen de nous rejoindre. Vous avez des questions sur Delia Technologies ? C'est le moment de les poser !

Rencontrer notre équipe