tl; dr
La syntaxe correcte pour rebaser B
en plus d' A
utiliser git rebase --onto
dans votre cas est:
git checkout B
git rebase --onto A B^
ou rebase B
en plus de A
commencer à 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, F
et G
sont des commits accessibles depuis branch
mais pas depuis HEAD
. Dire git rebase branch
prendra 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 branch
mais pas depuis HEAD
, c'est-à-dire G
.
The Precise: git rebase --onto avec 2 arguments
git rebase --onto
vous 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 HEAD
précisément en plus de F
partir de E
. Nous sommes uniquement intéressés par l'intégration F
dans notre branche de travail alors que, en même temps, nous ne voulons pas conserver D
car 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 HEAD
duquel le parent est D
au-dessus F
.
En d'autres termes, changez le parent de E
de D
à F
. La syntaxe de git rebase --onto
est 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 C
et E
de la séquence, vous diriez git rebase --onto B E
, ou rebasez HEAD
par-dessus l' B
emplacement de l'ancien parent E
.
The Surgeon: git rebase --onto avec 3 arguments
git rebase --onto
peut 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---H
par-dessus F
, en ignorant où HEAD
pointe 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 D
jusqu'à H
au - dessus de F
.
La syntaxe de git rebase --onto
avec 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 HEAD
fois le rebase terminé.