¿Es mejor fusionar "a menudo" o solo después de la finalización hacer una gran fusión de ramas de características?

40

Digamos que se están desarrollando múltiples ramas, Ay Btambién una rama incremental de "corrección de errores" C.

Ahora Cya está "terminado" y se fusionó con el maestro. Ay Btodavía están en desarrollo y no se solucionarán antes (tal vez) otra rama de corrección de errores se fusione con el maestro.

¿Es una buena idea fusionarse Clo antes posible en las nuevas ramas de funciones? ¿Para que las nuevas funciones se mantengan lo más cerca masterposible? ¿O es mejor dejar que la nueva característica se desarrolle en su propio "mundo" y que solo se fusione con el maestro una vez que haya terminado?

De todos modos, habrá conflictos, por lo que se debe dedicar tiempo a solucionarlos.

paul23
fuente
55
@gnat que se trata de fusionar características se ramifica en una línea principal, me pregunto si la fusión de la función principal con la característica mientras se desarrolla la característica es buena, para "resolver conflictos temprano".
paul23
1
@ paul23, diría que es una necesidad práctica.
Berin Loritsch
3
Honestamente, una gran parte de mis problemas de versiones desaparecieron cuando comencé a usar el diseño adecuado en mi código, como aislar módulos y crear un modelo de trabajo bien definido. Si tropieza demasiado con los problemas durante las fusiones, es posible que tenga otro problema más grave al acecho en alguna parte. Un buen diseño es increíblemente útil para evitar conflictos innecesarios.
T. Sar - Restablece a Monica el
2
Es posible que desee fusionarse regularmente con el maestro para mantenerse cerca "lo suficiente" como para no hacer que la fusión sea demasiado dolorosa.
Thorbjørn Ravn Andersen

Respuestas:

71

Cuanto más viva una rama, más puede desviarse de la rama principal y más confusa y complicada será la fusión resultante cuando finalmente esté terminada. Diez pequeños conflictos son más fáciles de resolver que un conflicto masivo, y en realidad pueden evitar que los desarrolladores dupliquen o desperdicien esfuerzos. Teniendo en cuenta que, usted debe combinar masteren Ay Bcon regularidad; una vez al día es una recomendación bastante común, aunque si tiene mucha actividad en sus sucursales, es posible que desee fusionarse varias veces al día.

Además de facilitar la resolución de conflictos, usted menciona específicamente Cuna rama de corrección de errores. Como desarrollador, me gustaría que mi sucursal tenga todas las últimas correcciones de errores, para garantizar que no repita el comportamiento que provocó un error o escriba pruebas basadas en datos erróneos.

De todos modos, habrá conflictos, por lo que se debe dedicar tiempo a solucionarlos.

Si sabe que habrá conflictos, es posible que desee adoptar una estrategia de ramificación diferente. Mantenga múltiples cambios en el mismo archivo (s) en la misma rama siempre que sea posible, y reducirá o eliminará la cantidad de conflictos. Refactorice las historias para que sean completamente independientes tanto como sea posible, y vuelva a trabajar las ramas para cubrir múltiples historias (la rama, la característica y la historia no siempre son intercambiables).

mmathis
fuente
33
Fusionar o rebase , ya que el rebase a menudo produce un historial de confirmación más limpio.
Chrylis -en huelga-
11
@chrylis: Rebasar puede ser peligroso si se considera que "las sucursales cubren varias historias" significa que dos desarrolladores trabajan en la misma sucursal.
Meriton - en huelga el
9
@meriton de los documentos oficiales: no modifique las confirmaciones que existen fuera de su repositorio y las personas pueden haber basado su trabajo en ellas. Si sigue esa directriz, estará bien. Si no lo hace, la gente lo odiará y sus amigos y familiares lo despreciarán. LOL
Xtreme Biker reinstala a Monica el
66
@ XtremeBiker: una nueva versión en Git cambia el historial. Git funciona como en la vida real a este respecto: para cambiar la historia, necesitas una conspiración. Hay una rama en el repositorio para Git que se renueva regularmente, y es muy pública. La razón por la que esto funciona es porque hay una conspiración: todos los que usan esta rama acuerdan reescribir la historia en ciertos momentos, por lo que se asegurarán de que estén en condiciones de fusionar todo en esos momentos.
Jörg W Mittag
1
@ paul23 Considere seriamente entregar A y B a una nueva sucursal compartida antes de entregarlos al maestro. Si ambas son revisiones radicales, las quieres juntas para una ronda de pruebas antes de infligir la combinación en master. Si está seguro de que podría entregar uno directamente al maestro y luego entregar el otro a una nueva sucursal actualizada. Es probable que desee poder ver el código original de la segunda característica en caso de que la fusión no funcione correctamente o necesite rediseñar algo.
Sinc
11

Asumiendo que su intención es fusionar A, B nuevamente en el maestro y mantener una sola base de código, nunca es una buena idea desviarse demasiado del maestro. Desviarse del maestro durante demasiado tiempo, especialmente cuando las correcciones de errores y otros desarrollos se fusionan para dominar a medida que se desarrollan A, B, ciertamente causarán conflictos.

Consideraría estrategias similares a las siguientes

  1. Quien sea responsable de A, B debe observar de cerca al maestro y fusionarse en cualquier cambio.
  2. Mejor aún, si tiene automatización de compilación y prueba, asegúrese de que A, B se fusionen en master y pasen las pruebas todas las noches.
  3. Basándote en tu comentario a otra respuesta, parece que A, B podría tardar un tiempo en desarrollarse. En este caso, incluso puede considerar que A, B se fusionen entre sí para que, al final, no tenga mayores problemas para fusionar ambos en el maestro.
  4. En un nivel superior, piense por qué necesita 2 líneas separadas de largo desarrollo. ¿Podría descomponerse en fusiones más pequeñas? ¿Podrías irrumpir en microservicios separados?
kenchew
fuente
5

Por lo general, a menudo es mejor que uno masivo.

Las solicitudes de extracción más pequeñas y frecuentes son casi siempre mejores.

Empecé a usar indicadores de configuración principalmente para poder hacer solicitudes de extracción más tempranas para poder, a su vez, fusionar el código más fácilmente, pero dejar la función desactivada. Cuanto más pequeña sea la solicitud de extracción, más fácil será revisar el código, incluso si hay más solicitudes de extracción totales. La mayoría de los humanos de cualquier tipo no podrán realizar revisiones significativas de solicitudes de extracción masivas. Es demasiado difícil para la RAM mental de uno comprender todas las posibles implicaciones de un cambio masivo de código.

Hay una sobrecarga adicional al crear un indicador de configuración, por lo que no vale la pena en las características más pequeñas. Pero entonces su solicitud de extracción será pequeña de todos modos.

Sin embargo, puede haber situaciones en las que la función tenga que ser lanzada de una vez. Incluso entonces, podría ser mejor hacer solicitudes de extracción más pequeñas a otra sucursal hecha para ese propósito.

La mayoría de mis colegas se quejan cuando alguien crea una solicitud de extracción masiva, y en su mayor parte, con razón.

También tenga en cuenta que a veces necesito seleccionar los commits en ramas separadas. Si lo que necesita ser recogido de cereza se puede poner en un solo compromiso, hace que sea más fácil moverlo a otras ramas. Este es un caso en el que en realidad tener pocas confirmaciones es mejor, pero no es exactamente el proceso estándar si su cereza está buscando.

Mark Rogers
fuente
1
Las banderas de funciones pueden ser costosas (USD 450 millones en 45 minutos). Este ejemplo también es mencionado por el tío Bob (pero sin ningún tipo técnico (como cabría esperar)).
Peter Mortensen
1
Sí, existe la sobrecarga de eventualmente eliminarlos, aunque generalmente no es tan difícil. Uno podría mantenerlos por más tiempo, pero luego la bandera está proporcionando un mayor uso. Estoy de acuerdo si se hace al azar o sin seguimiento, entonces las cosas pueden ir mal. Aunque las cosas pueden salir mal cuando una solicitud de extracción grande se vuelve difícil de revisar. Por otro lado, algunas personas pueden no estar en condiciones de agregar algo como una bandera de configuración a la aplicación en la que están trabajando. En general, ayuda con UAT y el despliegue de una función.
Mark Rogers
3

En Refactorización de Martin Fowler, el consejo que da es que nunca se debe ramificar una rama del maestro por más de un día. IIRC, debe hacer un pequeño cambio, probar para asegurarse de que no rompió nada, y luego fusionarlo nuevamente.

Johnny compota de manzana
fuente
2
Bueno, Ay Brealice importantes revisiones nuevas y radicales sobre cómo funciona la aplicación, no se "terminan" en un mes. Sin embargo, también son inútiles antes de que
terminen
8
Es posible que no sean inútiles antes de que terminen: proporcionan valor al ser un paso hacia el resultado completo y reducen el trabajo requerido en el futuro. Usando técnicas como alternar características, ramificar por abstracción, o simplemente hacer la parte de la interfaz de usuario al final, debería ser posible fusionarlo de manera segura en el trabajo incompleto para dominarlo.
bdsl
1
Es por eso que cambiar el nombre de su local por encima de cualquier cambio en la rama maestra es útil para el desarrollo a largo plazo. Mantiene su trabajo como si acabara de ramificarse
NKCampbell
2

Otra opción para los cambios de larga duración que pueden estar terminados pero no listos para usar es colocarlos detrás de un indicador de función para que puedan fusionarse en el maestro pero no tengan riesgo de romper nada. Luego, cuando estén listos para usarse, se puede quitar el indicador de función.

Qwertie
fuente
1
Banderas de funciones = código zombie (hasta que resucite)
Peter Mortensen
@PeterMortensen Bueno, debes apuntar a eliminar las banderas lo antes posible, pero podría funcionar para ciertas situaciones
Qwertie
3
@PeterMortensen no si la bandera está encendida para al menos una persona
Ian