Mueve la twig a otro punto en la historia

Tenemos la siguiente historia

start master public | | | vvv o---o-- ... --o---o---o 

Lamentablemente, hicimos algunos commits en la twig master contiene algunos datos confidenciales. Modificamos esto en una twig separada llamada pública. Ahora queremos "cortar" la twig public para get un "estado" completo y limpio en public pero sin las partes comprometedoras de la historia que todavía están contenidas en el master . En otras palabras, queremos la siguiente historia nueva:

 start master | | vv o---o-- ... --o---o \ o <- public 

Ahora, la salida public pasará al mismo tree de trabajo que en la situación original, pero sin los detalles de la historia sensible. Posteriormente, desactivamos la antigua twig master : renombrarla para unsafe y elaborar una nueva twig master fuera de la nueva twig public . De esta manera, conservamos la historia anterior en unsafe y somos capaces de impulsar la twig public hacia el público sin ninguna preocupación:

 start unsafe | | vv o---o-- ... --o---o \ o---o-- ... --o <-- public \ / o-- .. --o-- ... --o <-- master 

¿Cuáles son los commands correctos de git para lograr esto?

PD: Por supuesto, podríamos start pago, crear una nueva sucursal y comprometer allí el tree de trabajo completo de la sucursal public . ¡Pero debe haber una manera diferente, más elegante, más divertida!

La forma correcta de fusionar todas las confirmaciones en público en una confirmación (es decir, fusionar varias confirmaciones en una, o eliminar las confirmaciones individuales por completo, etc.) es usar git rebase -i . Entonces, lo que harías es (suponiendo que el primer commit tenga un start label como lo indica tu gráfico):

 git checkout public git rebase -i start 

Aparece una window de editor donde puedes editar el order de todos los parches simplemente usa squash para todos tus parches. Después de save el file y cerrar el editor, git recombinará el historial de parches según lo solicitado. Por supuesto, la twig maestra no cambiará su historia en absoluto.

Para cambiar el nombre de su actual maestro como inseguro y comenzar todo el desarrollo en público, lo haría:

 git checkout -b unsafe master # <- creates a new branch "unsafe" git checkout master git reset --hard public # <- forces master branch to point to public 

Si no crea la twig unsafe , el restablecimiento completo perderá todas las confirmaciones en el maestro y ya no podrá acceder a ellas (de manera fácil). Así que asegúrese de crear realmente esa twig.

Una alternativa sería cambiar el nombre del master a unsafe y luego crear una nueva twig maestra:

 git branch -m master unsafe # renames master to unsafe git checkout -b master public # creates new branch master as a copy of public 

Ambos deberían dar como resultado la misma estructura de bifurcación. (Por supuesto, el segundo no tiene ese peligro de perder la historia …)