¿Cómo mover ciertas confirmaciones para que se basen en otra rama en git?
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?
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 .
Puede utilizar git cherry-pick
para 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-pick
las 2 confirmaciones de quickfix2 que desee.
Lo más sencillo que puedes hacer es elegir un rango. Hace lo mismo que el rebase --onto
pero es más fácil para la vista :)
git cherry-pick quickfix1..quickfix2