Estrategia de ramificación de Git para el proyecto Ágil

Tengo un proyecto que se encuentra en Git Stash Repository. El código se implementará en cuatro entornos (Dev, Test, Stage y Prod). Seguimos la metodología Ágil. Así que el equipo de desarrollo trabaja tanto para las actividades de lanzamiento como para las actividades de no liberación (lanzamiento futuro). Tengo que crear twigs basadas en este requisito. A continuación está mi plan.

Tres twigs estables: master, release y develop.

maestro es la twig pnetworkingeterminada. Desarrollar será creado desde el maestro. lanzamiento será creado desde el desarrollo

twigs de características -> se crearán desde el desarrollo. cada desarrollador tiene una twig de características y fusionan el código en la twig de desarrollo una vez hecho. Así que el deployment del entorno de desarrollo sucederá desde la twig de desarrollo.

si los cambios necesitan ir al entorno de testing, tenemos dos forms aquí. uno es combinar la twig de desarrollo con la twig de lanzamiento (la implementación del entorno de testing se realizará desde la twig de publicación). No podemos implementar esto ya que la twig de desarrollo puede tener cambios de liberación y de liberación.

Otra forma es fusionar las twigs de características directamente en la twig de publicación. para que cada cambio de desarrollador se pueda fusionar en una twig de lanzamiento. No estoy seguro de si puedo implementar este método. ¿Alguien puede decirme si esto funcionará? ¿Hay alguna forma alternativa de manejar esta situación?

derivación:

twig principal —> twig de desarrollo -> twig de liberación

desarrollar twigs — característica branch1 | característica branch2 | característica branch3


implementaciones:

Desarrollar una sucursal para deployments -> dev

twig de lanzamiento para -> implementaciones de testing

twig principal para -> implementaciones de etapa y prod

No puedo fusionar el desarrollo de la twig en la twig de publicación. Como la twig de desarrollo también tiene algunos cambios que no son de lanzamiento. Solo necesito lanzar cambios en la twig de publicación. ¿Puede include sucursales en la twig de liberación directamente? ¿Cuál es el mejor enfoque aquí?

me parece que estás muy cerca de elegir Git Flow . En realidad, si no me equivoco, esta ya es su base de la estrategia, usted describe. Lo cual es genial.

Estoy enterado de que su principal preocupación es que desea una twig de "desarrollo" sin liberación, algo así como un entorno / twig "simplemente tratando de rellenar, no comstackr". De hecho, el flujo de Git favorece un "flujo" hacia la producción. Es decir, una vez que se fusiona algo de su twig de características en la twig de desarrollo , está prácticamente progtwigda para la próxima versión (que no sea de emergencia).

La sugerencia de Git Flow sobre cómo manejar esto, es no fusionar una tarea / function en el desarrollo , hasta que esté probablemente lo suficientemente list como para pasar a la siguiente puesta en escena / lanzamiento de producto con algunas correcciones. En gitflow, siempre se fusionaría con un avance no rápido ( git merge --no-ff FEATURE_BRANCH_NAME ) de modo que si se está acercando a una puesta en escena / prod-release, y esta function no puede prepararse, se fusionaría de forma inversa (único) merge-commit, eliminándolo del desarrollo o release -branch.

Sospecho que hay una discusión más larga sobre esto, pero solo para lanzar, veo dos maneras posibles de cumplir con sus ideas:

1) Tener 2 twigs de desarrollo : una para el desarrollo, una twig para desarrollar , que pronto será concebida para la puesta en escena, y una liberación posterior después de algún control de calidad o lo que sea. Y uno para material experimental, que irá a un entorno de desarrollo / testing (por ejemplo, a través de una implementación continua). Llamémoslo desarrollo a largo ploop (este es un nombre malo y demasiado largo, así que haz uno mejor, o tu equipo te odiará :)).

Pensamientos:

  • la twig de desarrollo a menudo debe fusionarse en una twig de desarrollo a largo ploop , para mantenerla siempre actualizada.
  • Probablemente necesites 2 entornos de desarrollo para evaluar, 1 para cada una de las twigs.
  • Peligro : las twigs creadas a partir de un desarrollo a largo ploop que (quizás por error) se hayan fusionado en el desarrollo podrían arrastrar más elementos que no están listos en la twig de desarrollo . La solución para esto podría ser 1) fusionar feature-branch como non-fastforward en long-term-develop y 2) cherry-pick fusionar este commit en develop . Pero esto es propenso a errores y algo complicado, y una fusión incorrecta podría arruinar toda la twig de desarrollo , contaminándola con cosas que no están lists para la puesta en escena / producción.

2) Tener solo 1 twig de desarrollo (como usted sugiere) y crear twigs de publicación desde el maestro

Esta es probablemente la forma más fácil. Se necesita un poco más de esfuerzo de cada desarrollador, pero es less propenso a errores.

El procedimiento sería:

  • En cada comienzo de un sprint / ciclo de desarrollo, release-manager crea la siguiente twig de publicación basada en el maestro . Por ejemplo, release-sprint-42 que, cuando se crea, es igual a la twig principal .
  • Los desarrolladores crean feature-branches con base de develop . Fusionan feature-branch para desarrollarse una vez que está listo para la testing, et.c. Como usted sugiere actualmente.
  • Si la característica es "correcta" y funciona, la combinación de fusión que se creó al fusionar la twig de característica en desarrollo se selecciona con la opción -m en release-sprint-42 , por ejemplo, git cherry-pick -m 1 COMMIT_HASH . Aquí es muy importante saber qué padre está seleccionando (en mi ejemplo padre 1. Develodes debería leer y comprender http://git-scm.com/docs/git-cherry-pick ).

Pensamientos:

  • Existe el peligro de que una característica que trabaja en la twig de desarrollo no funcione en la twig release-sprint-42 , debido a la falta de dependencies. Esto, gracias a Dios, es el motivo por el que tenemos entornos de ensayo y dates de entrega internas 🙂
  • La recolección de cerezas no es lo más fácil de hacer. Pero definitivamente es la mejor manera de intentar evitar el arrastre de código no deseado a través de una combinación en una twig incorrecta.

Redondeo

Cuál es la mejor opción para usted, depende de cómo se está desarrollando. Si tiene 2 pistas, como "material de soporte diario" y "mi function principal está progtwigda para su lanzamiento en diciembre", puede optar por 2 sucursales. Si el desarrollo a largo ploop no es 1, sino varias cosas y algo en curso (es decir, si normalmente tienes muchas tareas, que abarcan varios sprints / ciclos), elegiría la opción 2.

Idealmente, sin embargo, recomendaría por defecto una estrategia, donde las cosas se dividen en piezas lo suficientemente pequeñas y los sprints son lo suficientemente grandes, que una tarea / característica por lo general puede concluirse (es decir, fusionarse y desplegarse) en 1 sprint. Pero por experiencia lo sé, rara vez se puede implementar esa ilusión 🙂

Una última cosa: REALMENTE realmente te animaría a no tener una twig de publicación (perpetuo), sino a crear una nueva twig de publicación para cada sprint / ciclo, como release-sprint-42 , release-sprint-43 , et. do. (Si lo basaste desarrollo-twig en flujo de git ideal o fuera de twig principal en el segundo escenario, he sugerido). Tener twigs de lanzamiento perpetuas a menudo en mi experiencia conduce a cosas faltantes, problemas de combinación y otras maldades. Aparte de eso, dominar y desarrollar deben ser twigs perpetuas.

Esperando esta discusión 🙂