Clasificando un desastre de Git

Acabo de henetworkingar un proyecto que se mantuvo usando Git. En un punto, el código se implementó en 3 sistemas separados y cada sistema mantuvo su propio repository de Git descentralizado.

Cada uno de los 3 sistemas extendió el sistema base original en 3 direcciones diferentes. Ninguno de los 3 sistemas ha sido sincronizado uno contra el otro. Algunos cambios están en la twig principal, otros están en twigs nuevas.

¿Cómo puedo juntar las 3 fonts diferentes para que pueda:

  1. encuentre una base común para trabajar;
  2. descubra qué cambios son correcciones de errores que deberían aplicarse en los 3 sistemas; y
  3. mantenga los 3 sistemas de una manera sensata para que haya solo una twig común y separe las personalizaciones requeridas para los 3 sistemas diferentes.

Probablemente comenzaría empujando todos los repositorys para separar las sucursales en un repository central, desde el cual puedo rebasear, fusionar etc. entre twigs fácilmente.

Una buena herramienta de visualización como git-age , gitnub , gitx , risita puede hacer maravillas, pero su tarea probablemente será bastante tediosa a less que pueda encontrar los puntos de ramificación. Si hay parches similares aplicados a todas las sucursales, puede usar la rebase (interactiva) para reorderar las confirmaciones de manera que estén en el mismo order. Luego puede comenzar a "upload y cerrar" sus twigs, moviendo el punto de la twig hacia arriba al poner las confirmaciones en el maestro. Aquí se puede encontrar una buena descripción sobre cómo reorderar commits usando rebase.

Lo más probable es que las acciones que necesita realizar se describan en los enlaces proporcionados por el índice de Git Howto . Una buena hoja de trucos siempre es agradable tenerlo a tu scope. Además, sospecho que el seguimiento de Eric Sinks después de " DVCS y DAGs, Parte 1 " contendrá algo útil (No fue así, pero fue una lectura interesante).

Otros enlaces útiles son: Git Magic , Git Ready y SourceMage Git Guide

Espero que todos los repos tengan buenos posts de confirmación que le digan el propósito de cada parche, es eso o revisión del código 🙂

En cuanto a cómo mantener las personalizaciones, hemos tenido suerte con lo siguiente:

Comenzamos por separar (o mantener separados) el código personalizado del código genérico. Entonces probamos dos enfoques; ambos que funcionaron bien:

  1. Todas las implementaciones tienen sus propios repositorys donde se guardó la personalización.
  2. Todas las implementaciones tienen su propia sucursal en un repository de "personalización".

Después del primer deployment y viendo que el segundo era un hecho, dedicamos un time a prever futuros puntos de personalización / corte para networkingucir la duplicación en repositorys personalizados (alt. 1, que es el enfoque que usamos actualmente) y en la base / núcleo repo.

Y sí, intentamos refactorizar sin piedad cada vez que notamos el deslizamiento de la split núcleo / personalización 🙂

DE ACUERDO. Después de mucho trabajo, he logrado hacerlo. Para cualquier persona que se embarque en una tarea similar, implicará una gran cantidad de:

  git rebase 

commands y cuando las cosas se estropearon:

  git reflog 

seguido por

  git reset --hard HEAD @ {ref}