He notado algo últimamente mirando algunos proyectos populares en GitHub, que no hay develop
sucursal. Y, de hecho, la guía GitHub Flow tampoco lo menciona. Según tengo entendido, master
siempre debe ser totalmente estable y reflejar la producción. Si los desarrolladores están trabajando en ramas de características y luego las fusionan master
cuando están listas, eso significa que hay un período de tiempo en el que las características / arreglos se fusionan master
y la master
rama es realmente más nueva que la producción.
¿No tendría más sentido que el equipo cree ramificaciones de características / arreglos develop
, se fusione con eso y luego, cuando la próxima versión esté totalmente lista para su lanzamiento, develop
se fusione master
y se cree una etiqueta? Imagínese si las personas se están fusionando directamente master
, y se informa un error en la producción que se vuelve difícil de solucionar porque la master
base de código de la rama ha cambiado significativamente. Luego, los desarrolladores solo tienen que decirle al usuario que espere hasta la próxima versión para ver el problema resuelto.
EDITAR: Esta pregunta es diferente a "ramificarse o no ramificarse". Se dirige específicamente a las personas que se alejan del uso de la rama de desarrollo y las razones que la rodean, ya que se promocionó como la mejor práctica durante mucho tiempo.
Respuestas:
Proviene de la mentalidad de CI donde hay integración varias veces al día.
Hay pros y contras de ambos.
En nuestro equipo también hemos abandonado la rama de desarrollo, ya que consideramos que no proporcionó ningún beneficio adicional, sino algunos inconvenientes. Hemos configurado nuestro software CI (Teamcity) para compensar los inconvenientes:
La razón por la que esto funciona es porque todas las solicitudes de extracción contienen código potencialmente liberable, pero esto no significa que implementemos todas las confirmaciones en el maestro.
La razón principal por la que abandonamos la rama de desarrollo es porque tiende a ser demasiado grande y demasiado lenta para ver lo que realmente contenía. Si hemos implementado algo un poco prematuramente, simplemente ramificamos una rama de revisión y la implementamos directamente.
fuente
master
, por lo que si surge un error más tarde mientrasmaster
está en un estado de flujo, ¿puede ramificar fácilmente una revisión de la etiqueta 1.3?Una rama de desarrollo es más importante si su proceso de lanzamiento es complejo y necesita tener candidatos de lanzamiento serios.
Por ejemplo, imagine que está escribiendo software que es firmware en automóviles. Esto es ... no trivial de solucionar y es probable que cualquier versión tenga un conjunto completo de pruebas de integración / no CI ejecutadas en hardware real.
En ese caso, puede tener más sentido aislar un "candidato de liberación" en una rama no maestra (como "desarrollar"). Eso permite que su equipo que ejecuta esas pruebas tenga una rama en la que fusionar características.
Webapps u otro software fácilmente actualizado no tienen esta restricción.
Sin embargo, tenga en cuenta que:
fuente
Hay dos filosofías que he visto en proyectos, y creo que la elección es solo cuestión de gustos:
Designe a 'maestro' como el lanzamiento de producción y desarrolle en una rama de 'desarrollo'.
Desarrolle en 'maestro' y tenga una rama con un nombre diferente para lanzamientos de producción estables. Esto tiene aún más sentido si su proyecto tiene varias ramas de lanzamiento a la vez (p. Ej., El preferido actual es Release-1.8, pero también sigue manteniendo Release-1.7).
Ambos son enfoques comunes y tienen sus pros y sus contras.
fuente
Los lanzamientos a producción se pueden etiquetar, por lo que la situación que se lanzó siempre se puede reproducir sin dedicar una rama completa para este propósito.
Si se encuentra un error crítico en la producción en un momento en que el maestro no se puede liberar, entonces es bastante fácil verificar la etiqueta e iniciar una nueva rama "hotfixes-for-release-1.2.0" desde allí. Pero eso debería ser bastante raro.
La mayoría de las veces en nuestras aplicaciones web, master ha cambiado desde la última versión, pero no de manera muy significativa, por lo que simplemente podemos hacer una nueva versión de master que tenga la solución. Ayuda a hacer lanzamientos muy frecuentes de todos modos.
fuente
Eso no es Github Flow.
Este es el proceso de implementación / fusión de Github Flow, de acuerdo con su enlace:
(El énfasis es mío)
En otras palabras,
master
nunca se adelantará a la producción. Del mismo modo,master
siempre estará en un estado estable y liberable (aparte de los errores no descubiertos), ya que todo se revisa, se prueba y se lanza a producción antes de fusionarsemaster
.fuente
master
siempre es su posición de reversión si falla la rama de características que empuja a la producción. Si no lo hace, se fusionamaster
y se convierte en la nueva alternativa. Me gusta.El problema que veo es que Git / Hub flow deploy / merge asume que una característica se está desarrollando / probando / fusionando / implementando a la vez, y a menudo, en mi experiencia, este no es el caso. Si fusionamos una característica a la vez, hay una mayor posibilidad de problemas de regresión, que solo se encuentran después de que las características se fusionen para dominar y posiblemente en producción.
Es necesario que haya una forma de probar varias funciones, combinar varias funciones e implementarlas. He estado usando una 'rama de paquete' (una rama creada desde el maestro con ramas de características listas para prueba fusionadas en ella) que se implementa en qa / uat. Las correcciones durante uat ocurren solo en la rama de características, y esas se vuelven a fusionar en la rama del paquete. Después de que se aprueba una subsección de la rama del paquete, solo las características aprobadas dentro del paquete se solicitan de extracción para dominar, y el ciclo es continuo.
Lo uso con Gitflow, pero estoy pensando en usarlo para el flujo de GitHub. El tema QA / UAT de muchas características a la vez parece significativo. Otro problema con el flujo de GitHub es que asume todos los desarrolladores sr, y ese no es siempre el caso.
Preferiría usar el flujo de GitHub debido a su simplificación. Con un paquete como función, creo que estaría mejor preparado. Es posible que el paquete sea similar al lanzamiento; Sin embargo, todavía estoy reflexionando sobre esto también.
Otro problema es que el proceso de solicitud de extracción ocurre al final antes de fusionarse con master; sin embargo, a veces desea revisar el código antes de la prueba de qa comercial, por lo tanto, mucho antes de la fusión
fuente