Git rebase : rebase ou merge, rebase interactif et annulation

Guide de git rebase

Git rebase : rebase ou merge, rebase interactif, annulation | We.Inc

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

Questions fréquentes

Faut-il utiliser rebase ou merge ?

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.

Comment annuler un rebase ?

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

Quelle est la règle d'or du rebase ?

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.

Quelle est la différence entre squash et fixup ?

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

Pourquoi git rebase s'arrête sur un conflit ?

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

Ce que fait réellement rebase

Récupérer une branche avec le reflog

Commandes du rebase interactif

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

Un rebase complet, conflits compris

Mettre à jour une branche de fonctionnalité sur main

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

Annuler un rebase terminé avec le reflog

Trouvez la ligne juste avant le début du rebase et réinitialisez la branche à ce point.

Déplacer une branche sur une autre base

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

Détacher une branche d'une autre branche de fonctionnalité

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

Voir aussi: Guides

Produit

Pour qui

Fonctionnalités

Ressources

Entreprise

Plan du site