« 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
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é.