git rebase — Historique linéaire et propre
Module 02 60 min
Objectifs de la section
- Comprendre ce que fait
git rebaseet comment il diffère degit merge - Effectuer un rebase de base pour garder l'historique linéaire
- Utiliser le rebase interactif pour nettoyer les commits
- Connaître les règles d'or du rebase
Rebase vs Merge
La différence fondamentale
Merge préserve l'historique exact, rebase crée un historique linéaire et propre.
Avec rebase :
Quand utiliser quoi
| Situation | Recommandation |
|---|---|
| Mettre à jour votre branche avec main | git rebase main |
| Intégrer une fonctionnalité terminée | git merge --no-ff |
| Nettoyer des commits locaux avant PR | git rebase -i |
| Branche partagée avec d'autres | git merge (plus sûr) |
La règle d'or du rebase
Ne jamais rebaser des commits qui ont déjà été poussés vers un dépôt partagé. Le rebase réécrit l'historique et créera des conflits pour vos coéquipiers.
git rebase de base
# Mettre à jour votre branche feature avec les derniers commits de main
git switch feature/login
git rebase main
# Si des conflits se produisent pendant le rebase :
# 1. Résoudre le conflit dans le fichier
git add fichier-resolu.py
# 2. Continuer le rebase
git rebase --continue
# Annuler le rebase et revenir à l'état d'avant
git rebase --abort
# Ignorer le commit actuel (cas rare)
git rebase --skip
Visualisation du processus de rebase
Rebase interactif — git rebase -i
Le rebase interactif vous permet de réécrire, combiner, supprimer ou réordonner des commits avant de les pousser.
# Rebase interactif des 3 derniers commits
git rebase -i HEAD~3
# Rebase interactif depuis un commit spécifique
git rebase -i abc1234
# Rebase interactif depuis la divergence avec main
git rebase -i main
L'éditeur interactif
Git ouvre votre éditeur avec quelque chose comme :
pick a3f4b2c feat: ajout formulaire de connexion
pick b7c9d1e fix: corriger validation email
pick c2e8f3a docs: mettre à jour README
# Commandes :
# p, pick = utiliser le commit
# r, reword = utiliser le commit, mais modifier le message
# e, edit = utiliser le commit, mais s'arrêter pour amender
# s, squash = utiliser le commit, mais le fusionner avec le précédent
# f, fixup = comme squash, mais supprimer le message de ce commit
# d, drop = supprimer le commit
Exemples pratiques de rebase interactif
Combiner plusieurs commits (squash)
git rebase -i HEAD~3
# Dans l'éditeur, changer :
pick a3f4b2c feat: ajout formulaire de connexion
squash b7c9d1e fix: corriger validation email # ← changer pick en squash
squash c2e8f3a fix: autre correction # ← changer pick en squash
# Git combine les 3 commits en un seul et vous demande un nouveau message
Corriger un message de commit
git rebase -i HEAD~2
# Dans l'éditeur :
reword a3f4b2c fix # ← changer pick en reword
pick b7c9d1e feat: login
# Git s'arrête sur ce commit et ouvre l'éditeur pour le message
Supprimer un commit
git rebase -i HEAD~3
# Dans l'éditeur :
pick a3f4b2c feat: login
drop b7c9d1e WIP: commit temporaire # ← changer pick en drop
pick c2e8f3a feat: tableau de bord
Résumé des commandes clés
| Commande | Description |
|---|---|
git rebase <branche> | Rebaser sur une branche |
git rebase -i HEAD~N | Rebase interactif des N derniers commits |
git rebase --continue | Continuer après résolution |
git rebase --abort | Annuler le rebase |
git rebase --skip | Ignorer le commit actuel |