Versioning avec Git & GitHub · Étape 14

Rebase une branche locale et comprends la réécriture

Rejoue des commits privés sur une nouvelle base, compare les anciens et nouveaux identifiants et vérifie un historique linéaire.

Durée indicative · ~1 h 35Niveau intermédiairePrérequis conseillé · Leçon 13 — résolution de conflitPratique · TP
L’idée reçue

« Rebase déplace simplement la branche comme un fast-forward. »

Rebase recrée les commits sur une nouvelle base. Leur contenu peut être équivalent, mais leurs parents et leurs identifiants changent.

01Observe la divergence

cd /tmp/soria-git-branches-$USER/rebase
git log --oneline --decorate --graph --all
git merge-base main feature/reports
git rev-list --reverse main..feature/reports

La branche contient deux commits de documentation. Main contient un nouveau commit de politique.

02Conserve les identifiants initiaux

git rev-list --reverse main..feature/reports > /tmp/rebase-old-shas.txt
git show feature/reports
git status --porcelain

Le working tree doit être propre avant rebase. La liste des hashes permettra de prouver la réécriture.

03Rebase la branche privée

git switch feature/reports
git rebase main

Git identifie les commits propres à la branche, déplace temporairement la référence, puis rejoue leurs patches au-dessus de main.

04Vérifie la nouvelle base

git merge-base main feature/reports
git rev-parse main
git rev-list --reverse main..feature/reports
git log --oneline --decorate --graph --all

Le merge-base doit maintenant être exactement le HEAD de main. La branche reste deux commits en avance.

05Compare les hashes

git rev-list --reverse main..feature/reports > /tmp/rebase-new-shas.txt
diff -u /tmp/rebase-old-shas.txt /tmp/rebase-new-shas.txt || true

Les hashes diffèrent parce que chaque commit possède désormais un autre parent. Ne pousse pas ces nouveaux identifiants sur une branche partagée sans coordination.

06Vérifie la linéarité

git rev-list --merges main..feature/reports
git log --first-parent --oneline feature/reports
git status --porcelain

La sortie des merges doit être vide pour cette branche de laboratoire.

07Gère un conflit de rebase

git status
git diff
git add <fichiers-resolus>
git rebase --continue
# ou git rebase --abort

Lors d’un rebase, chaque commit est rejoué séparément. Un conflit peut donc survenir plusieurs fois si plusieurs commits touchent la même zone.

08Choisis le périmètre sûr

Branche
Rebase
Condition
locale privée
approprié
aucun autre utilisateur ne dépend des hashes
branche PR personnelle
possible
force-push protégé et coordination
main ou branche partagée
à éviter
références communes déjà consommées
Challenge autonome

Prouve la réécriture

Enregistre base et hashes, rebase deux commits, puis fournis nouvelle base, nouveaux hashes, absence de merge commit et état propre.

Ce que tu retiens

Rebase rejoue des commits et réécrit leurs identifiants. Il est utile pour une branche privée courte, mais dangereux lorsqu’un historique est déjà partagé.

Ta progression

Chargement de l’état… Se connecter pour synchroniser.