Qu’est-ce que Git Rebase ?
Git rebase est une commande puissante qui modifie la façon dont vos commits sont présentés dans votre historique Git. Contrairement à la fusion, qui crée un nouveau commit de fusion combinant les branches, le rebase réécrit votre historique de commits en déplaçant les commits de votre branche sur la pointe d’une autre branche, généralement la branche principale (souvent nommée main
ou master
). Cela donne un historique de projet plus propre et linéaire, sans l’apparence potentiellement désordonnée de nombreux commits de fusion.
Imaginez que vous écrivez une histoire : la fusion consiste à ajouter un nouveau chapitre qui fait référence aux chapitres précédents. Le rebase consiste à réécrire l’histoire de sorte que le nouveau chapitre suive parfaitement le dernier, éliminant toute mention explicite des révisions précédentes.
Comprendre les mécanismes
Lorsque vous effectuez un rebase, Git prend essentiellement vos commits, un par un, et les rejoue au-dessus du dernier commit de la branche cible. Cela crée de nouveaux commits avec des hachages SHA-1 différents, laissant les commits originaux intacts mais détachés de la lignée de la branche principale. Cela donne un historique linéaire, améliorant considérablement la lisibilité et facilitant le suivi des modifications.
Exemple visuel :
Avant Rebase :
A---B---C (main)
D---E---F (feature)
Après Rebase :
A---B---C---D'---E'---F' (main & feature)
Notez que D, E et F sont remplacés par D’, E’ et F’, qui sont effectivement les mêmes modifications mais avec de nouveaux hachages de commit.
Flux de travail Rebase : guide étape par étape
- Récupérer et mettre à jour : Assurez-vous que votre branche locale est à jour avec le dépôt distant.
- Rebase : Lancez le processus de rebase.
- Résoudre les conflits (le cas échéant) : Si des conflits surviennent, Git interrompra le rebase. Résolvez-les manuellement, mettez les modifications en scène, puis poursuivez le rebase.
- Push forcé (avec précaution) : Étant donné que vous avez réécrit l’historique, vous devez utiliser un push forcé. Cependant, utilisez uniquement
--force-with-lease
pour éviter de supprimer accidentellement un travail partagé.
git fetch origin
git checkout feature-branch
git pull origin main
git rebase main
git add .
git rebase --continue
git push --force-with-lease origin feature-branch
Rebase interactif : affinez votre historique
Le rebase interactif (git rebase -i HEAD~N
, où N est le nombre de commits à inclure) vous permet de modifier vos messages de commit, de fusionner plusieurs commits en un seul, de réorganiser les commits ou même de supprimer des commits. Cela offre un contrôle granulaire sur l’historique de votre projet, vous permettant de créer un récit plus raffiné et cohérent.
Quand utiliser Rebase (et quand ne pas l’utiliser)
Rebase est idéal pour :
- Nettoyer l’historique de votre branche locale avant de la fusionner dans une branche partagée.
- Créer un historique de projet linéaire et plus facile à comprendre.
Ne rebasez jamais les commits qui ont déjà été poussés vers un dépôt partagé. Cela créera un historique confus et potentiellement désastreux qui peut être difficile à résoudre. Utilisez la fusion pour les branches partagées.
Résolution des conflits pendant Rebase
Des conflits peuvent survenir lors d’un rebase si les modifications de votre branche se chevauchent avec les modifications de la branche cible. Git mettra le rebase en pause, et vous devrez modifier manuellement les fichiers en conflit. Après les avoir résolus, utilisez git add
pour mettre les modifications en scène, puis utilisez git rebase --continue
pour reprendre le processus. Si vous rencontrez des problèmes, vous pouvez utiliser git rebase --abort
pour annuler le rebase et revenir à votre état d’origine.
Conclusion
Git rebase est un outil puissant pour maintenir un historique Git propre et compréhensible. En comprenant ses mécanismes et en respectant la règle cruciale de ne jamais rebaser les commits partagés, vous pouvez améliorer considérablement votre flux de travail et faciliter le développement collaboratif. N’oubliez pas de vous entraîner avec des branches locales avant de l’appliquer à des projets partagés.