Este es un problema complicado pero que muchas personas enfrentan. Prefiero usar la configuración de Gitflow como punto de partida.
Desarrollo -> Nuevas cosas que se están trabajando en
Master -> Cosas terminadas que necesitan pruebas Producción -> Cosas que se han publicado en producción.
En las características menores (más cortas), creo una rama desde el desarrollo, hago el trabajo allí y luego fusiono la rama de nuevo al desarrollo.
En las características principales (a largo plazo) creo una rama desde el desarrollo, creo ramas más pequeñas a partir de esa rama, luego me fusiono con la primera rama. Una vez que se completa la característica principal, vuelve a la rama de desarrollo.
A intervalos regulares (depende del proyecto) Fundo el desarrollo nuevamente en el maestro y comienza un ciclo de prueba. Si surgen soluciones en las pruebas, se realizan en la rama maestra (la sub rama se fusiona). Y el desarrollo puede continuar en la rama maestra durante las pruebas.
En cualquier momento, master debería fusionarse con el desarrollo, y el desarrollo debería fusionarse con cualquiera de sus sub ramas a largo plazo.
master siempre (en teoría) debería estar listo para la producción. El desarrollo siempre debe estar (en teoría) listo para la producción. La única razón por la que hay una diferencia es que proporciona un conjunto sólido de características para que los evaluadores prueben.
Cuando está listo, una confirmación en el maestro que se prueba se fusiona en la producción y el despliegue en la producción ocurre desde esa rama. Los HOTFIX que deben realizarse en caso de emergencia pueden tener lugar en la rama de Producción sin tener que fusionarse en el maestro (que puede tener muchos cambios no probados).
Mi árbol normal se parece a
LongTerm -> Development -> Master -> Production
LongTerm <- Development | |
| Development -> Master |
LongTerm <- Development -> Master |
Development <- Master |
Master -> Production
Mi regla general es que ningún cambio individual debería llevar más de unas pocas horas. Si lo hace, entonces debe hacerse en cambios más pequeños. Si se trata de una función enorme (como una reescritura de la interfaz de usuario), se aplica a largo plazo para que el desarrollo normal pueda continuar al mismo tiempo. Las sucursales a largo plazo son normalmente solo sucursales locales, mientras que Desarrollo, Maestro y Producción son sucursales remotas. Cualquier sucursal secundaria también es local. Esto mantiene el repositorio limpio para otros, sin perder la utilidad de git en un conjunto de características a largo plazo.
Sin embargo, me gustaría señalar que la existencia de una rama a largo plazo es algo raro. Normalmente, todo mi trabajo está en desarrollo. Solo cuando tengo una función (conjunto) que va a tomar tanto tiempo que necesito poder trabajar también en cosas de desarrollo normales, uso la rama LongTerm. Si es solo un conjunto de cambios que deberían estar juntos, entonces no me fusiono para dominar hasta que todo haya terminado.