Comparez rebase et merge côte à côte sur un graphe de commits interactif, préparez un rebase interactif avec pick, squash, fixup et drop, et apprenez à interrompre ou annuler avec le reflog.
git rebase rejoue les commits de votre branche par-dessus un autre commit, ce qui donne un historique linéaire au lieu d'un commit de merge. Lancez git rebase main depuis votre branche de fonctionnalité, résolvez les éventuels conflits, puis git rebase --continue. Utilisez git rebase -i pour fusionner, renommer ou supprimer des commits, et git rebase --abort pour faire marche arrière.
Les commandes de rebase que vous taperez le plus
Rebase est la commande git que l'on redoute le plus, surtout parce qu'elle réécrit des commits. Le graphe ci-dessous montre exactement ce qui change entre un merge et un rebase, le planificateur vous permet d'essayer un rebase interactif sur des commits d'exemple, et les dernières sections traitent des conflits, de la règle qui protège vos coéquipiers et de la façon de récupérer une branche après un rebase raté.
Merge conserve l'historique réel et ajoute un commit de merge, l'option la plus sûre pour les branches partagées. Rebase donne une ligne droite plus facile à lire et à parcourir avec bisect, ce qui convient à votre propre branche de fonctionnalité avant sa revue. Beaucoup d'équipes rebasent en privé et mergent en public.
S'il est encore en cours, git rebase --abort remet tout en place. S'il est déjà terminé, lancez git reflog, trouvez l'entrée juste avant le début du rebase et faites git reset --hard vers ce hash. ORIG_HEAD pointe aussi vers l'ancienne pointe juste après un rebase, sauf si une autre commande l'a modifié.
Ne rebasez pas des commits sur lesquels d'autres personnes ont déjà basé leur travail. Le rebase crée de nouveaux commits avec de nouveaux hashes, donc toute personne qui détient les anciens se retrouve avec un historique en double et des conflits déroutants.
Les deux fusionnent un commit dans celui du dessus. squash ouvre l'éditeur pour que vous combiniez les deux messages ; fixup jette le message du commit fusionné et garde le précédent. fixup -C garde plutôt le message du commit fusionné.
Chaque commit est réappliqué sur la nouvelle base, et un commit qui a touché les mêmes lignes que la base ne peut pas être appliqué automatiquement. Modifiez le fichier, faites git add, puis lancez git rebase --continue. Vous pouvez rencontrer un conflit pour chaque commit rejoué.
git rebase -i ouvre une todo list avec une ligne par commit, le plus ancien en haut. Changez le mot en début de ligne, enregistrez et fermez l'éditeur, et git exécute la liste de haut en bas.
Commandes de la todo list dans git rebase -i
Faites d'abord un fetch pour que main soit à jour, rebasez, résolvez les conflits éventuels, puis poussez la branche réécrite en toute sécurité.
Trouvez la ligne juste avant le début du rebase et réinitialisez la branche à ce point.
--onto prend trois points : la nouvelle base, l'ancienne base et la branche. Seuls les commits situés après l'ancienne base sont déplacés.
feature-b a été créée à partir de feature-a. Cette commande place uniquement les commits propres à feature-b par-dessus main.
Merge ou rebase : ce qui arrive à l'historique
Choisissez comment combiner les branches
Merge
Rebase
commit de merge
Merge laisse F1 et F2 intacts et ajoute un nouveau commit avec deux parents.
Rebase copie F1 et F2 sur M3. Les copies (marquées ') ont de nouveaux hashes ; les originaux sont laissés de côté.
Planificateur de rebase interactif
Choisissez une action pour chaque commit, du plus ancien au plus récent, et voyez la todo list et le résultat.
Action pour le commit {n}
Todo list ouverte par git
Historique après le rebase
La première ligne ne peut pas être squash ou fixup : aucun commit au-dessus ne peut l'accueillir.
Tous les commits ont été supprimés. La branche pointerait vers sa base.
inclut {n} commit(s) fusionné(s)
message modifié
Commencer gratuitement · Sans carte bancaire