Git: ¿Cómo cambiar la base a una confirmación específica?

Resuelto Ondra Žižka asked hace 12 años • 12 respuestas

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?

Ondra Žižka avatar Oct 13 '11 00:10 Ondra Žižka
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
Adam Dymitruk avatar Oct 12 '2011 17:10 Adam Dymitruk

Incluso puedes adoptar un enfoque directo:

git checkout topic
git rebase <commitB>
r0hitsharma avatar Jul 08 '2014 17:07 r0hitsharma

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á).
Adam Dymitruk avatar Oct 12 '2011 17:10 Adam Dymitruk

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:

  1. 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
  2. Busque el compromiso encima del cual desea mover la rama; llámelo nuevo padre. En el ejemplo eso es B
  3. Necesitas estar en tu sucursal (la que te mudas):
  4. 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
Nestor Milyaev avatar Oct 13 '2017 10:10 Nestor Milyaev