En el flujo de GitHub, ¿está bien basar la rama de características en otra rama de características?

22

Usamos GitHub Flow en nuestro proyecto y la mayoría de las veces, abrimos una nueva rama de características desde master , hacemos un trabajo allí, abrimos un PR, revisamos el código y volvemos a fusionarnos en master .

Sin embargo, mi trabajo actual depende de otro problema en el que se está trabajando feature-branch-A. ¿Es kosher crear mi rama a partir de esa otra rama o va en contra del espíritu de GitHub Flow?

La alternativa sería basar mi rama en maestro y fusionar los cambios de feature-branch-A(con frecuencia).

¿Qué opción se prefiere en el flujo de GitHub?

Borek Bernard
fuente

Respuestas:

24

Aquí está el flujo de trabajo que sigo cuando me ramifico desde una ramificación de características:

  1. Crear feature-branch-Bdesdefeature-branch-A
  2. Trabajar en feature-branch-B
  3. Si se agregan más confirmaciones feature-branch-Adespués de la bifurcación, rebase feature-branch-Benfeature-branch-A
  4. Finalice el trabajo feature-branch-By espere hasta que feature-branch-Ase fusione master.
  5. Después de feature-branch-Afusionarse master, rebase feature-branch-Benmaster
  6. Fusionarse feature-branch-Benmaster

Al seguir el flujo de trabajo anterior, parecerá que se bifurcó masterdespués de que feature-branch-Ase fusionó. No tiene que esperar hasta que feature-branch-Ase fusione para comenzar a trabajar feature-branch-B. Sin embargo, obtendrá una historia limpia sin árboles complicados.

geoji
fuente
¡Esta fue exactamente la respuesta que estaba buscando! Me ahorraste el dolor de cabeza de resolver eso, ¡gracias!
Vance Palacio
No rebasar los commits ya publicados ... daolf.com/posts/git-series-part-2
Sebi2020
8

Creo que esto está completamente bien si creas la característica en otra característica.

Pero no lo hagas con bastante frecuencia. Veo un desarrollador que hizo esto y una o dos semanas lanzó 10 PR para fusionarse. Eso fue completamente agotador para otros miembros para su revisión y difícil de fusionar también. Intenta no hacer árboles en git. Eso ayuda con la bisección para encontrar errores.

Ladislav Prskavec
fuente
7

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).

  1. derivar de la característica
  2. explorar idea
  3. fusionar para presentar

Sin embargo, lo que desea evitar es algo parecido a esto:

  1. bifurcación de la característica requerida
  2. trabajar en código
  3. fusionarse desde el desarrollador una vez que la función requerida esté completa
  4. verificar la funcionalidad (y confirmaciones adicionales) en la rama de características
  5. 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:

  1. rama de dev
  2. fusionar desde la función requerida
  3. trabajar en código
  4. fusionarse desde el desarrollador una vez que la función requerida esté completa
  5. verificar la funcionalidad (y confirmaciones adicionales) en la rama de características
  6. 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.

  1. rama de dev
  2. trabajar en código
  3. fusionarse desde el desarrollador una vez que la función requerida esté completa
  4. verificar la funcionalidad (y confirmaciones adicionales) en la rama de características
  5. 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.


fuente
En su tercer conjunto de pasos, el inconveniente es que el paso 1 debe contener algo de "confirmación ficticia". En mi situación, no tengo nada útil que comprometer hasta que required-featurese fusionen.
Borek Bernard
Todavía lo señalo como uno de mis artículos favoritos sobre ramificación: Estrategias avanzadas de ramificación SCM . Si bien se centra en un sistema de control de versiones centralizado, las ideas de los roles que presenta se corresponden exactamente con git-flow.
Y en cuanto a la confirmación ficticia, es por eso que el último párrafo está allí. Lo que habría sido útil es una característica que se ejecutó y completó como "proporcionar interfaces para hacer cosas". Entonces, tanto la característica requerida como la característica futura podrían funcionar fuera de esas interfaces. Si bien la función requerida funcionó en la implementación de las interfaces, la función futura podría eliminarlas y hacer pruebas contra ellas, esperando que la función requerida se fusione con el desarrollador.
Me pregunto qué tan malos son tus segundos pasos. ¿Es un problema en la práctica que una sucursal no tenga un "mismo" inicio y final? No creo que me moleste demasiado, pero ¿tal vez sea un factor de desorden importante?
Borek Bernard
Se trata de describir claramente a través de la rama, confirmar y fusionar el historial de qué rama es la rama principal. Dentro de git-flow, debe seguir el sistema descrito en las ramas de características de git flow . La rama de características se ramifica desde la rama de desarrollo y se fusiona de nuevo para desarrollarse. Cuando comienzas a ramificarte desde otras ramas de características, queda menos claro cuál es el papel de esa rama. Le animo a que espere hasta que se complete la función requerida si no puede avanzar en el código sin él ahora.
1

Una rama de características normalmente se considera menos estable que el tronco (desarrollo / maestro), por lo que posiblemente se someta a más cambios subyacentes de lo normal si basa su trabajo en uno.

Además, aunque normalmente está mal visto si la rama ha sido empujada, no es raro volver a colocar las ramas de características en su rama principal, para obtener un historial más agradable, pero eso sería muy complicado si hubiera ramas adicionales colgando de ella, por lo que Básicamente, está creando una nueva restricción para el propietario de la sucursal principal, así como posibles dolores de cabeza para usted.

Dicho esto, no hay una regla estricta en su contra. Estos son solo patrones y mejores prácticas después de todo.

Editar: se perdió parte de su pregunta. Fusionar la rama de características con la suya, que se basa en el maestro, en realidad no evita ninguno de los problemas mencionados anteriormente, y en realidad podría crear un historial aún más complicado.

Por lo tanto, si estuviera en su lugar y pudiera diferir el trabajo hasta que se realizara una función, o hacer otra cosa primero, lo haría.

axl
fuente