Mueva el viejo compromiso a una nueva sucursal

Accidentalmente comencé a trabajar en una nueva function en medio de otra. Mi repository simplemente se ve así:

A - B - C - D - E master 

Pero espero que se vea así:

 A - B - D - E master \ C new-feature 

Parece una pregunta simple, pero aún no he encontrado una respuesta buscando. Parece que la selección de cerezas está cerca de lo que quiero, y tal vez también algunas modificaciones, pero soy nuevo en Git y se apreciará algo de ayuda.

Primero, para hacer la nueva sucursal:

 git branch new-feature C 

A continuación, para reparar el maestro

 git checkout master git rebase -i B 

Cuando aparezca el editor, elimine C de la list. Guardar y Salir.

Estaré usando algunas operaciones bastante peligrosas aquí, así que solo toma nota.

Esta respuesta hace varias suposiciones:

  1. Su twig master final debería verse así: A - B - D - E

  2. La última twig de new-feature debería verse así: A - B - C

  3. La ausencia de compromiso C no afectará la aplicación de confirmaciones D y E además de la confirmación B

Si ese no es el caso, actualice aquí.

Primero, en la twig principal , creamos una nueva twig como respaldo. Vamos a llamarlo 'copy de security'.

 git branch backup 

Esto es para permitirnos restaurar fácilmente la twig maestra en caso de que algo salga mal más tarde. Por supuesto, podríamos usar git reflog pero esto es mucho más conveniente.

Luego, en la twig principal, haz a:

 git rebase -i HEAD~3 

Esto debería encender un editor de text para git rebase (modo interactivo). Encuentra la línea para cometer C y quítala.

Ahora, su twig principal debería verse así:

A - B - D' - E'

No te preocupes porque escriba A - B - D' - E' lugar de A - B - D - E D y D' son esencialmente equivalentes en términos de sets de cambios. Lo mismo para E y E' .

Estamos llegando allí. Estoy asumiendo que la confirmación C en la twig de new-feature derivar de la confirmación B Encuentre la confirmación SHA1 para la confirmación B , luego (omita los corchetes angulares a continuación):

git checkout -b new-feature <SHA1 of commit B>

Esto creará una twig llamada new-feature que comienza en la confirmación B y la verifica por usted. Ahora estamos en una new-feature twig de new-feature y se ve así:

A - B

El último paso es averiguar la confirmación SHA1 de la confirmación C Lo tenemos en la twig de backup . Usando git log backup (o algún otro método), encuentre la confirmación SHA1 de la confirmación C en la twig de respaldo. Después de eso, en la new-feature twig de new-feature , haz:

git cherry-pick <SHA1 of commit C>

Por supuesto, omita los corchetes angulares.

Ahora, la new-feature twig de new-feature debería verse así:

A - B - C'

Supongamos que se encuentra actualmente en el master sucursal

  1. git branch new-feature master~2 Ahora se crea una new-feature twig y apunta al compromiso C. (Todavía está trabajando en Branch master una vez terminado)
  2. git rebase --onto master~3 master~2 Esto trasplanta todos los commits del master~2 al jefe del master en commit B (es decir, master~3 ).

OK, ya terminaste!

Siempre use la git help <cmd> para más detalles.