Mantenimiento de múltiples parches/ramas de funciones para múltiples ramas de desarrollo (y etiquetas) en paralelo

Hemos bifurcado un proyecto en git(hub) y queremos mantener algunos parches en nuestra bifurcación mientras también recreamos esos parches en sus lanzamientos (etiquetas) y ramas de lanzamiento.

Estructura inicial del repositorio

La estructura ascendente es bastante simple:

origin/trunk A---B---D---F---H---...
                  \
origin/0.9         C---E---G---...
                       |
                   (tag 0.9)

El problema

El proyecto upstream aumentó la versión de una dependencia en las confirmaciones. A y D pero fueron principalmente por conveniencia y estamos seguros de que podemos mantener una versión de compatibilidad por un tiempo.

He creado una rama de características trunk_compat y usado git revert --no-commit para crear parches para confirmaciones A y D como los necesitamos. He ramificado esto origin/trunk

mine/trunk_compat              A*---D*
                              / 
origin/trunk A---B---D---F---H-...
                  \
origin/0.9         C---E---G---...
                       |
                   (tag 0.9)

Así que ahora es bastante fácil para mí seguir origin/trunk y mantengo mis parches rebasando o fusionando dependiendo de si publico esto o no.

Nuestra objetivo es mantener estos parches para ambas ramas (trunk y 0.9) así como recrear una versión de lanzamiento de 0.9 (como está etiquetado de E).

Y no sé cómo hacerlo correctamente.

  • Necesito una 0.9_compat branch que tiene todos los commits hasta G pero también incluye nuestros parches A* y D* para que podamos poner eso en nuestro servidor de integración continua y ver si funciona
  • necesito una etiqueta 0.9_compat que tiene el estado de E con A* y D* aplicado.
    • Para hacerlo más complicado cometer E es en realidad un backport de D sobre la 0.9 rama por lo que nuestro D* el parche también debe aplicarse aquí
    • Esta no es una fusión o reorganización adecuada porque el proyecto ascendente está en SVN y este es el espejo git-svn que estamos bifurcando
  • En el futuro aguas arriba se ramificará 0.10 etc. y queremos mantener nuestros parches en esas ramas también

Puedo hacer esto seleccionando mucho o simplemente aplicando parches manualmente (creo), pero eso no se siente bien y creo que no utilizo git en toda su extensión.

preguntado el 22 de mayo de 12 a las 16:05

No conozco nada mejor que recoger cerezas aquí. -

Gracias. He ido por ese camino ahora también. Parece bastante torpe, pero parece funcionar. Para la rama ya existente, seleccioné mis parches y luego los modifiqué para que estuvieran en el orden correcto. -

1 Respuestas

Hay dos formas de hacer esto, y las obtuvo correctamente: rebase (incluye selección y parche, el mismo resultado al final) o fusión.

  1. Configure todas las ramas que necesita parchear y aplique los parches (origin/trunk y origin/0.9_compat).
  2. Aplicar los parches en las ramas.
  3. La diferencia está sólo en el el mantenimiento de estrategia, que es git pull (fusionar) vs git pull --rebase (rebase) para estas ramas.

La diferencia entre las estrategias es que para git pull, git intentará fusionar los cambios remotos en su sucursal local (lo que dará como resultado que tenga muchas confirmaciones de git merge, pero su parche sha permanecerá igual) y para git pull --rebase git primero buscará los cambios remotos y solo luego intentará aplicar sus cambios locales en la parte superior (lo que resultará en que su parche sha cambie después de cada extracción). Yo diría que rebase es más apropiado (este argumento es más fuerte si el repositorio remoto es originalmente git), porque siempre permanecerá en el HEAD del proyecto + sus parches, sin un lío innecesario de confirmación de fusión.

respondido 22 nov., 12:03

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.