rama - git pull
¿Cómo mover ciertos compromisos para basarse en otra rama en git? (5)
Creo que es
git checkout master
git checkout -b good_quickfix2
git cherry-pick quickfix2^
git cherry-pick quickfix2
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)
Entonces comencé a trabajar en quickfix2, pero por accidente tomé quickfix1 como la rama de origen para copiar, no el maestro. 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 cierta revisión en quickfix2, pero el parche no conserva el historial de confirmación. ¿Hay alguna forma 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
Así que deberías ir desde
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.
Consulte git config --global rebase.autostash true
, especialmente después de Git 2.10 .
La única forma de trabajo que encontré:
git show>~/some_file.txt
git checkout master
git checkout -b new_branch
git apply -stat ~/some_file.txt
git apply -check ~/some_file.txt
git apply ~/some_file.txt
Entonces necesitas volver a confirmar los cambios, pero es mucho más fácil que hacerlo manualmente ...
Lo más simple que puedes hacer es elegir un rango. Hace lo mismo que el rebase --onto
pero es más fácil para los ojos :)
git cherry-pick quickfix1..quickfix2
Puede usar git cherry-pick
para seleccionar el compromiso que desea copiar.
Probablemente, la mejor manera es crear la rama a partir del maestro, luego en esa rama use git cherry-pick
en las 2 confirmaciones de quickfix2 que desee.