Git: comienza de nuevo en una nueva sucursal, eliminando las confirmaciones de la historia

Primera pregunta aquí!

Estamos usando git para el control de versiones de un proyecto. Nuestro repository se ve así:

master: C0-C1-C2-C3-C4 \ development: C5-C6-C7 

Cuando comenzamos el proyecto, se nos aconsejó usar el flujo de trabajo de gitflow. De todos modos, dado que somos un equipo pequeño sin experiencia previa en git, trabajando en un proyecto bastante pequeño, ahora pensamos que podría ser excesivo. En cambio, nos gustaría comenzar a usar un model de twig de características .

Para resumir, nos gustaría tener algo como esto:

 master: C0-C1-C2-C5-C6-C7 

Entonces, desde C7 en adelante, podemos comenzar de cero "(pero manteniendo lo que hemos hecho hasta ahora), pero ahora usando twigs separadas para las características.

Como puede ver, también nos gustaría deshacernos de C3 y C4 . Esto se debe a que son completamente inútiles (los commits agregan algunos files que se agregaron en C6 y C7 ), y también porque nos gustaría comenzar con una sola twig principal limpia, sin fusiones en nuestro historial.

Pensé que sería bastante simple, pero después de un par de horas buscando en Google, estoy un poco perdido. Leí sobre crear una nueva sucursal huérfana, copyr el contenido de C7 y luego eliminar mis otras twigs, pero no estoy seguro de que sea el enfoque correcto.

Ah, y por cierto, no podemos crear un nuevo repository. Este es un repository privado que se nos ha dado en el context de un curso académico, y es el único que tenemos.

Gracias por adelantado.

Usted quiere

 C0-C1-C2-C5-C6-C7 [master] 

El problema se vuelve más simple cuando miras tu repository como tal.

 C0-C1-C2-C5-C6-C7 [development] \ C3-C4 [master] 

"Ramas" son solo tags en commits. Se pueden cambiar de nombre y mover como quieras. development ya está donde quieres que esté el master . Así que cambie el nombre de master y development .

 git branch -m master old/master git branch -m development master 

Ta da!

 C0-C1-C2-C5-C6-C7 [master] \ C3-C4 [old/master] 

Como su master ha divergido del master remoto, deberá forzar el empuje.

 git push -u --force origin master 

El -u asegurará que su nueva twig master rastree el master remoto.

Finalmente, cuando esté listo, elimine old/master .

 git branch -D old/master 

Todavía se puede recuperar, por un time, a través de git reflog .

Yo haría lo siguiente:

 git checkout master git branch master_backup # Save the older master repo locally just in case git reset --hard C2 # This sets the branch to C0-C1-C2 git cherry-pick C5..C7 # This sets the branch to C0-C1-C2-C5-C6-C7 

Es posible que tenga que resolver conflictos en el último command. Esto no generará ningún commit de fusión, pero cambiará algunos de sus SHA1:

 git mergetool 

Luego, reemplace la twig maestra remota:

 git push origin :master git push origin master:master 

También puedes lograr esto con

 git checkout master git rebase development git reabse -i <SHA of initial commit> master 

Ahora puede reorderar, seleccionar y editar las confirmaciones que desea conservar. No olvides empujar tus twigs reorganizadas e informar a tu compañero de trabajo para extraer las "nuevas" twigs para que no vuelvan a enviar ningún compromiso anterior a tu repository.