tl; dr
La syntaxe correcte pour rebaser Ben plus d' Autiliser git rebase --ontodans votre cas est:
git checkout B
git rebase --onto A B^
ou rebase Ben plus de Acommencer à partir du commit qui est le parent deB référencé avec B^ou B~1.
Si vous êtes intéressé par la différence entre git rebase <branch>et git rebase --onto <branch>lisez la suite.
Le rapide: git rebase
git rebase <branch>va rebaser la branche que vous avez actuellement extraite, référencée par HEAD, en plus du dernier commit accessible depuis <branch>mais pas depuis HEAD.
C'est le cas le plus courant de rebasage et sans doute celui qui nécessite moins de planification à l'avance.
Before After
A---B---C---F---G (branch) A---B---C---F---G (branch)
\ \
D---E (HEAD) D---E (HEAD)
Dans cet exemple, Fet Gsont des commits accessibles depuis branchmais pas depuis HEAD. Dire git rebase branchprendra D, c'est le premier commit après le point de branchement, et le rebase (c'est-à-dire changer son parent ) au-dessus du dernier commit accessible depuis branchmais pas depuis HEAD, c'est-à-dire G.
The Precise: git rebase --onto avec 2 arguments
git rebase --ontovous permet de rebaser à partir d'un commit spécifique . Cela vous donne un contrôle exact sur ce qui est rebasé et où. C'est pour les scénarios où vous devez être précis.
Par exemple, imaginons que nous ayons besoin de rebaser HEADprécisément en plus de Fpartir de E. Nous sommes uniquement intéressés par l'intégration Fdans notre branche de travail alors que, en même temps, nous ne voulons pas conserver Dcar il contient des modifications incompatibles.
Before After
A---B---C---F---G (branch) A---B---C---F---G (branch)
\ \
D---E---H---I (HEAD) E---H---I (HEAD)
Dans ce cas, dirions-nous git rebase --onto F D. Ça signifie:
Rebase le commit accessible à partir HEADduquel le parent est Dau-dessus F.
En d'autres termes, changez le parent de Ede Dà F. La syntaxe de git rebase --ontoest alors git rebase --onto <newparent> <oldparent>.
Un autre scénario dans lequel cela s'avère utile est lorsque vous souhaitez supprimer rapidement certains commits de la branche actuelle sans avoir à faire un rebase interactif :
Before After
A---B---C---E---F (HEAD) A---B---F (HEAD)
Dans cet exemple, pour supprimer Cet Ede la séquence, vous diriez git rebase --onto B E, ou rebasez HEADpar-dessus l' Bemplacement de l'ancien parent E.
The Surgeon: git rebase --onto avec 3 arguments
git rebase --ontopeut aller plus loin en termes de précision. En fait, cela vous permet de rebaser une plage arbitraire de commits par-dessus une autre.
Voici un exemple:
Before After
A---B---C---F---G (branch) A---B---C---F---G (branch)
\ \
D---E---H---I (HEAD) E---H (HEAD)
Dans ce cas, nous voulons rebaser la plage exacte E---Hpar-dessus F, en ignorant où HEADpointe actuellement. Nous pouvons le faire en disant git rebase --onto F D H, ce qui signifie:
Rebasage la gamme de commits dont le parent est Djusqu'à Hau - dessus de F.
La syntaxe de git rebase --ontoavec une plage de commits devient alors git rebase --onto <newparent> <oldparent> <until>. L'astuce ici est de se souvenir que le commit référencé par <until>est inclus dans la plage et deviendra le nouveau une HEADfois le rebase terminé.