¿Cómo mover ciertas confirmaciones para que se basen en otra rama en git?

Resuelto Alex Yarmula asked hace 14 años • 5 respuestas

La situación:

  • el maestro está en X
  • Quickfix1 está en X + 2 confirmaciones

Tal que:

o-o-X (master HEAD)
     \
      q1a--q1b (quickfix1 HEAD)

Luego comencé a trabajar en Quickfix2, pero por accidente tomé Quickfix1 como la rama fuente para copiar, no como la maestra. Ahora Quickfix2 está en X + 2 confirmaciones + 2 confirmaciones relevantes.

o-o-X (master HEAD)
     \
      q1a--q1b (quickfix1 HEAD)
              \
               q2a--q2b (quickfix2 HEAD)

Ahora quiero tener una rama con Quickfix2, pero sin las 2 confirmaciones que pertenecen a Quickfix1.

      q2a'--q2b' (quickfix2 HEAD)
     /
o-o-X (master HEAD)
     \ 
      q1a--q1b (quickfix1 HEAD)

Intenté crear un parche a partir de una determinada revisión en Quickfix2, pero el parche no conserva el historial de confirmaciones. ¿Hay alguna manera de guardar mi historial de confirmaciones, pero tener una rama sin cambios en Quickfix1?

Alex Yarmula avatar Mar 03 '10 14:03 Alex Yarmula
Aceptado

Este es un caso clásico de rebase --onto:

 # let's go to current master (X, where quickfix2 should begin)
 git checkout master

 # replay every commit *after* quickfix1 up to quickfix2 HEAD.
 git rebase --onto master quickfix1 quickfix2 

Entonces deberías pasar de

o-o-X (master HEAD)
     \ 
      q1a--q1b (quickfix1 HEAD)
              \
               q2a--q2b (quickfix2 HEAD)

a:

      q2a'--q2b' (new quickfix2 HEAD)
     /
o-o-X (master HEAD)
     \ 
      q1a--q1b (quickfix1 HEAD)

Esto se hace mejor en un árbol de trabajo limpio.
Vergit config --global rebase.autostash true , especialmente después de Git 2.10 .

VonC avatar Mar 03 '2010 07:03 VonC

Puede utilizar git cherry-pickpara elegir la confirmación que desea copiar.

Probablemente la mejor manera es crear la rama a partir de master y luego, en esa rama, usar git cherry-picklas 2 confirmaciones de quickfix2 que desee.

DJ. avatar Mar 03 '2010 07:03 DJ.

Lo más sencillo que puedes hacer es elegir un rango. Hace lo mismo que el rebase --ontopero es más fácil para la vista :)

git cherry-pick quickfix1..quickfix2
Christoph avatar Aug 15 '2012 06:08 Christoph