tl; dr
La sintaxis correcta para rebase B
además de A
usar git rebase --onto
en su caso es:
git checkout B
git rebase --onto A B^
o rebase B
encima de A
comenzar desde el commit que es el padre deB
referencia con B^
o B~1
.
Si estás interesado en la diferencia entre git rebase <branch>
y git rebase --onto <branch>
sigue leyendo.
El rápido: git rebase
git rebase <branch>
va a rebasar la rama que actualmente ha desprotegido, al que hace referencia HEAD
, en la parte superior de la última cometen es accesible desde <branch>
pero no de HEAD
.
Este es el caso más común de rebase y podría decirse que requiere menos planificación por adelantado.
Before After
A---B---C---F---G (branch) A---B---C---F---G (branch)
\ \
D---E (HEAD) D---E (HEAD)
En este ejemplo, F
y G
son confirmaciones a las que se puede acceder branch
pero no desde HEAD
. Decir git rebase branch
que tomará D
, esa es la primera confirmación después del punto de bifurcación, y volver a crearla (es decir, cambiar su padre ) encima de la última confirmación accesible desde, branch
pero no desde HEAD
, es decir G
.
The Precise: git rebase --onto con 2 argumentos
git rebase --onto
le permite volver a crear una base a partir de una confirmación específica . Le otorga un control exacto sobre lo que se está rebajando y dónde. Esto es para escenarios en los que necesita ser preciso.
Por ejemplo, imaginemos que necesitamos un rebase HEAD
precisamente al F
inicio E
. Solo estamos interesados en incorporar F
a nuestra rama de trabajo mientras que, al mismo tiempo, no queremos conservarla D
porque contiene algunos cambios incompatibles.
Before After
A---B---C---F---G (branch) A---B---C---F---G (branch)
\ \
D---E---H---I (HEAD) E---H---I (HEAD)
En este caso, diríamos git rebase --onto F D
. Esto significa:
Rebase el commit accesible desde HEAD
cuyo padre está D
encima F
.
En otras palabras, cambie el padre de E
de D
a F
. La sintaxis de git rebase --onto
es entonces git rebase --onto <newparent> <oldparent>
.
Otro escenario en el que esto es útil es cuando desea eliminar rápidamente algunas confirmaciones de la rama actual sin tener que hacer un rebase interactivo :
Before After
A---B---C---E---F (HEAD) A---B---F (HEAD)
En este ejemplo, para eliminar C
y E
de la secuencia usted diría git rebase --onto B E
, o volvería HEAD
a poner encima de B
donde estaba el padre anterior E
.
El cirujano: git rebase --onto con 3 argumentos
git rebase --onto
puede ir un paso más allá en términos de precisión. De hecho, le permite volver a crear una base arbitraria de confirmaciones encima de otra.
Aquí hay un ejemplo:
Before After
A---B---C---F---G (branch) A---B---C---F---G (branch)
\ \
D---E---H---I (HEAD) E---H (HEAD)
En este caso, queremos cambiar el rango exacto E---H
encima F
, ignorando a dónde HEAD
apunta actualmente. Podemos hacerlo diciendo git rebase --onto F D H
, lo que significa:
Rebase el rango de confirmaciones cuyo padre está D
por H
encima F
.
La sintaxis de git rebase --onto
con un rango de confirmaciones se convierte en git rebase --onto <newparent> <oldparent> <until>
. El truco aquí es recordar que la confirmación a la que hace referencia <until>
se incluye en el rango y se convertirá en la nueva una HEAD
vez que se complete el rebase.