Parece que tienes algunos problemas aquí:
1. Identificación de funciones para una versión específica
Este es un problema de gestión de proyectos y un problema de coordinación. ¿ Esta función se lanzará antes, al mismo tiempo o después de esta otra función? Si las versiones quieren que ocurra una característica a la vez, identifíquelo. Si las características se van a agrupar en versiones, averigüe cuáles son las agrupaciones y aplíquelas con los desarrolladores y los responsables de la toma de decisiones. Use su sistema de seguimiento de problemas o tickets para etiquetar los lanzamientos. Deje en claro que si una característica de un lanzamiento específico es un no-go, entonces todos lo son.
2. Estrategias de ramificación
Git-flow es la respuesta fácil para problemas como estos, y a menudo las personas usan una variante de git-flow incluso si no saben de qué se trata. No voy a decir que es un problema para todos los problemas, pero ayuda mucho.
Parece que se encuentra con un problema con las estrategias de lanzamiento no deterministas, donde las características son scattershot aprobadas y algo que comenzó a desarrollarse hace mucho tiempo podría lanzarse después de algo que comenzó más recientemente: características de salto de rana.
Las ramas de características de larga duración o las versiones de lanzamiento simultáneas son probablemente la mejor respuesta para este tipo de problemas. Fusiona (o modifica, si te sientes cómodo) lo último de master en tus ramas de larga duración. Tenga cuidado de fusionar solo las características que ya están activas, de lo contrario, se encontrará con los problemas que ha tenido ahora (demasiadas características mezcladas en una rama).
Las ramas "revisión" o "corrección de errores" son una parte esencial de este proceso; úselas para pequeñas soluciones únicas que tienen un ciclo corto de control de calidad.
Según su descripción, incluso podría ser mejor no mantener una rama oficial de "desarrollo". En cambio, bifurque todas las características fuera del maestro y cree bifurcaciones de lanzamiento fusionadas una vez que se identifica un lanzamiento.
3. Ambientes
No combine las ramas de git con sus entornos, excepto para la producción == master. Se debe suponer que la rama de "desarrollo" está rota. Las ramas de lanzamiento se envían a entornos de prueba, ya sea un entorno de control de calidad o un entorno intermedio. Si es necesario, inserte una rama de características específicas en un entorno.
Si tiene más de una rama de características que necesita ser liberada por separado pero que se están probando al mismo tiempo ..... ¯ \ _ (ツ) _ / ¯ .... ¿activar otro servidor? Quizás fusionarlos en una rama desechable ... comprometer arreglos / cambios en las ramas originales y volver a fusionarse en la rama desechable; hacer la aprobación final y UAT en las ramas de lanzamiento individuales.
4. Eliminar características no aprobadas de una sucursal
Esto es lo que los pensamientos anteriores intentan evitar, porque sin duda es lo más doloroso de tratar de hacer. Si tiene suerte, las características se han fusionado en su desarrollo o ramas de prueba atómicamente usando merge commits. Si no tienes suerte, los desarrolladores se han comprometido directamente con la rama de desarrollo / prueba.
De cualquier manera, si usted se está preparando para un lanzamiento y tienen cambios no aprobados, necesitará usar Git a echarse atrás esas confirmaciones no aprobados por la rama de lanzamiento; La mejor idea es hacerlo antes de probar el lanzamiento.
La mejor de las suertes.