Git: ¿Cómo cambiar la base a una confirmación específica?
Me gustaría cambiar la base a una confirmación específica, no a un HEAD de la otra rama:
A --- B --- C master
\
\-- D topic
a
A --- B --- C master
\
\-- D topic
en lugar de
A --- B --- C master
\
\-- D topic
¿Cómo puedo lograr eso?
Aceptado
Puedes evitar el uso del parámetro --onto creando una rama temporal en la confirmación que desees y luego usando rebase en su forma simple:
git branch temp master^
git checkout topic
git rebase temp
git branch -d temp
Incluso puedes adoptar un enfoque directo:
git checkout topic
git rebase <commitB>
Utilice la opción "sobre":
git rebase --onto master^ D^ D
O
git rebase --onto <commitB> <commitA> <commitD>
Los 3 últimos argumentos significan:
- destino (nuevo padre, aquí es commitB),
- start-after (padre actual, padre del primer compromiso que se va a mover),
- y final inclusivo (último compromiso que se moverá).
El comentario de jsz anterior me ahorró muchísimo dolor, así que aquí hay una receta paso a paso basada en él que he estado usando para cambiar la base/mover cualquier confirmación sobre cualquier otra confirmación:
- Encuentre un punto de bifurcación anterior de la rama que se va a cambiar de base (mover); llámelo padre antiguo. En el ejemplo anterior eso es A
- Busque el compromiso encima del cual desea mover la rama; llámelo nuevo padre. En el ejemplo eso es B
- Necesitas estar en tu sucursal (la que te mudas):
- Aplica tu rebase:
git rebase --onto <new parent> <old parent>
En el ejemplo anterior eso es tan simple como:
git checkout topic
git rebase --onto B A