À quoi sert git rebase -i (rebase interactif) ?

Git est l’un des systèmes de contrôle de version les plus populaires utilisés par les développeurs pour suivre l’historique des modifications de code. L’une des fonctionnalités puissantes et souvent utilisées de Git est la commande git rebase -i, également connue sous le nom de rebase interactif. Dans cet article, nous allons explorer en détail ce qu’est le rebase interactif, pourquoi et comment l’utiliser, et comment il peut améliorer votre flux de travail Git.

Qu’est-ce que git rebase -i ?

La commande git rebase -i permet aux développeurs de réécrire l’historique de leurs commits dans un référentiel Git. L’option -i signifie “interactif”, ce qui vous permet de sélectionner, modifier, réorganiser ou fusionner des commits de manière flexible avant de les intégrer à une autre branche. Contrairement à la commande git merge, qui fusionne simplement les modifications de deux branches, le rebase réécrit l’historique en appliquant les commits de la branche source sur la branche cible de manière linéaire.

Pourquoi utiliser git rebase -i ?

L’utilisation du rebase interactif présente plusieurs avantages pour les développeurs, notamment :

  • Nettoyer l’historique des commits : Il est souvent nécessaire de nettoyer l’historique des commits pour qu’il soit plus lisible et plus logique. Par exemple, si vous avez effectué plusieurs commits inutiles ou mal libellés, vous pouvez les réécrire ou les combiner avec d’autres commits pour améliorer la clarté.
  • Rebaser pour des mises à jour régulières : Lorsque vous travaillez sur une branche et qu’une autre branche (comme main ou master) reçoit des mises à jour, le rebase interactif permet de mettre à jour votre branche avec ces modifications sans créer un historique de fusion complexe.
  • Eviter les conflits de fusion : Le rebase permet de résoudre les conflits de manière plus progressive, contrairement à une fusion où plusieurs conflits peuvent surgir en même temps.

Comment utiliser git rebase -i ?

Maintenant que nous comprenons l’importance et les avantages du rebase interactif, voyons comment l’utiliser étape par étape.

1. Lancer un rebase interactif

Pour démarrer un rebase interactif, vous devez d’abord vous assurer que vous êtes sur la branche sur laquelle vous souhaitez appliquer le rebase. Ensuite, vous pouvez lancer la commande suivante :

git rebase -i 

Par exemple, si vous souhaitez rebaser votre branche actuelle sur main, vous pouvez utiliser :

git rebase -i main

Une fois la commande exécutée, un éditeur de texte s’ouvrira avec une liste de commits récents.

2. Comprendre l’interface du rebase interactif

L’éditeur qui s’ouvre après avoir lancé un rebase interactif contient une liste des commits récents de votre branche, ainsi que des commandes possibles que vous pouvez utiliser pour manipuler ces commits. Chaque ligne représente un commit, avec une commande par défaut comme pick, suivie du hash du commit et du message de commit.

Voici un exemple de ce que vous pourriez voir :

# Rebase ..HEAD onto 
#
# Commands:
# pick  Commit message
# pick  Commit message
# pick  Commit message
#
# To end the rebase, run:
#   git rebase --continue

3. Manipuler les commits

Dans cet éditeur, vous pouvez remplacer le mot pick par d’autres commandes pour modifier les commits de différentes manières :

  • pick : Garde le commit tel quel (c’est la commande par défaut).
  • reword : Permet de modifier le message de commit sans modifier le contenu du commit.
  • edit : Permet de modifier le contenu du commit (par exemple, ajouter des fichiers ou changer des modifications avant de poursuivre).
  • squash : Fusionne ce commit avec le commit précédent, combinant ainsi leurs changements et messages.
  • fixup : Comme squash, mais sans conserver le message du commit fusionné.
  • drop : Supprime le commit de l’historique.

Une fois les modifications effectuées, vous devez enregistrer et quitter l’éditeur pour appliquer les changements. Git continuera alors le processus de rebase en fonction des instructions que vous avez données.

4. Résoudre les conflits lors d’un rebase

Lors d’un rebase, il peut arriver que des conflits apparaissent entre les commits que vous essayez de rebaser et les commits de la branche cible. Lorsque cela se produit, Git vous demandera de résoudre les conflits avant de continuer.

Voici les étapes à suivre pour résoudre un conflit lors d’un rebase :

  • Utilisez un outil de résolution de conflits ou éditez manuellement les fichiers conflictuels.
  • Une fois les conflits résolus, ajoutez les fichiers modifiés avec git add.
  • Puis, continuez le rebase avec git rebase --continue.
  • Si vous souhaitez annuler le rebase en cours, utilisez git rebase --abort.

Exemples pratiques de git rebase -i

Exemple 1 : Réécrire des messages de commit

Imaginons que vous ayez effectué plusieurs commits, mais que vous souhaitiez modifier les messages de commit pour les rendre plus clairs. Vous pouvez utiliser la commande reword dans le rebase interactif pour modifier le message d’un ou plusieurs commits.

Exemple 2 : Fusionner des commits avec squash

Si vous avez plusieurs commits qui apportent des changements similaires et que vous souhaitez les combiner pour garder un historique plus propre, vous pouvez utiliser squash. Cela permet de fusionner plusieurs commits en un seul.

Conclusion

Le rebase interactif avec git rebase -i est une fonctionnalité puissante et flexible de Git qui vous permet de manipuler l’historique des commits de manière détaillée et contrôlée. Que vous souhaitiez nettoyer l’historique, résoudre des conflits ou organiser vos commits de manière plus logique, git rebase -i est un outil essentiel dans votre boîte à outils Git. Cependant, comme pour toutes les opérations qui modifient l’historique de Git, il est important de l’utiliser avec précaution, notamment sur des branches partagées, afin d’éviter des problèmes de synchronisation avec d’autres développeurs.

FAQs

Quand dois-je éviter d’utiliser git rebase -i ?

Évitez d’utiliser le rebase interactif sur des branches qui ont déjà été partagées avec d’autres développeurs, car cela peut causer des conflits et compliquer la gestion des versions. Utilisez-le principalement sur des branches locales avant de les partager.

Est-ce que git rebase -i peut modifier l’historique d’une branche publique ?

Oui, le rebase interactif réécrit l’historique des commits, ce qui peut poser des problèmes si vous avez déjà poussé vos commits vers une branche publique. Assurez-vous de bien comprendre les conséquences avant d’utiliser cette commande sur des branches partagées.

Le rebase interactif est-il similaire à un merge ?

Bien qu’ils aient des objectifs similaires, le rebase et la fusion (merge) diffèrent. Le merge conserve l’historique de manière non linéaire, tandis que le rebase modifie l’historique pour qu’il soit linéaire et plus facile à suivre.