Una cosa clave que git-flow estaba destinada a abordar era la capacidad de razonar sobre el papel de una rama determinada, y de qué se ramifica y en qué se fusiona.
Idealmente, todas las ramas se fusionan con la línea de código de la que se fusionaron. Esto suele ser una fusión de la línea principal (en git-flow esto es dev
). Presenta ramas y se fusionan desde el desarrollador, libera ramas y se fusiona desde el desarrollador (con una combinación adicional para master
). Las correcciones rápidas se ramifican y fusionan desde el maestro (con esa fusión adicional de vuelta a dev).
Cada línea de código se ramifica y se fusiona con su padre. Una línea de código puede extraer código de otras líneas de código en cualquier momento si es necesario.
Si la rama de una rama de características es un "Quiero explorar esta forma de solucionar un problema en esa rama de características", está perfectamente bien. Se ramifica desde la rama de la característica, confirma algo de código y se fusiona con la rama de la característica (o se descarta).
- derivar de la característica
- explorar idea
- fusionar para presentar
Sin embargo, lo que desea evitar es algo parecido a esto:
- bifurcación de la característica requerida
- trabajar en código
- fusionarse desde el desarrollador una vez que la función requerida esté completa
- verificar la funcionalidad (y confirmaciones adicionales) en la rama de características
- fusionarse con dev
La razón es que el comienzo y el final no coinciden, lo que hace que sea un poco más difícil entender qué es y qué fue. No es imposible, pero solo hace que le tome un poco más de tiempo a alguien entender su papel.
Sin embargo, si esta es una nueva característica que depende del código que aún no se encuentra en dev, el flujo debería ser:
- rama de dev
- fusionar desde la función requerida
- trabajar en código
- fusionarse desde el desarrollador una vez que la función requerida esté completa
- verificar la funcionalidad (y confirmaciones adicionales) en la rama de características
- fusionarse con dev
Tenga en cuenta que esto comienza con una rama de dev y termina con una fusión de dev.
Dicho todo esto, probablemente lo mejor es evitar fusionar una característica con otra. Ramifique la función, haga los preliminares necesarios ... y espere.
- rama de dev
- trabajar en código
- fusionarse desde el desarrollador una vez que la función requerida esté completa
- verificar la funcionalidad (y confirmaciones adicionales) en la rama de características
- fusionarse con dev
Esto proporciona el conjunto más estable de ramas y código.
Algo a tener en cuenta para el trabajo futuro sería tener una función para publicar las interfaces necesarias para la interoperabilidad con otras funciones, incluso si el código de implementación no está completo. Esto se fusionaría con dev, y luego la función requerida podría funcionar a partir de esas interfaces al igual que la función futura. Esto probablemente permitiría que la característica futura progrese más (codificando contra las interfaces, probando contra stubbs que implementan las interfaces) de lo que lo haría si tuviera que esperar a que la característica requerida se fusione con dev.