Mantenimiento de múltiples parches/ramas de funciones para múltiples ramas de desarrollo (y etiquetas) en paralelo
Frecuentes
Visto 633 veces
3
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 hastaG
pero también incluye nuestros parchesA*
yD*
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 deE
conA*
yD*
aplicado.- Para hacerlo más complicado cometer
E
es en realidad un backport deD
sobre la0.9
rama por lo que nuestroD*
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
- Para hacerlo más complicado cometer
- 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.
1 Respuestas
1
Hay dos formas de hacer esto, y las obtuvo correctamente: rebase (incluye selección y parche, el mismo resultado al final) o fusión.
- Configure todas las ramas que necesita parchear y aplique los parches (
origin/trunk
yorigin/0.9_compat
). - Aplicar los parches en las ramas.
- La diferencia está sólo en el el mantenimiento de estrategia, que es
git pull
(fusionar) vsgit 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 git fork patch branching-and-merging or haz tu propia pregunta.
No conozco nada mejor que recoger cerezas aquí. - Hugo
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. - Lars Francke