Deja de copiar, es hora de fusionar. Parte 2. Un conflicto de fusión que nunca sucedió (pero debería haber sido)

La última vez vimos cómo cambiar el código en una confirmación copiada crea el peligro de un conflicto que permanece en silencio hasta que ambas copias se fusionan en algún lugar, lo que puede suceder en un futuro muy lejano. ¿Pero sabes qué es peor que un conflicto de fusión?







La ausencia de conflicto.







Volvamos a la vieja situación:







primer árbol







Imaginemos que la rama "característica" existe desde hace mucho tiempo y se fusiona periódicamente con "maestra". El diagrama muestra una instantánea del árbol justo después de la última combinación A. Estamos trabajando en un sprint en la "función" llena de nuevas funciones.







Suponga que la línea "manzana" está en el archivo de configuración que controla alguna función. Ambas ramas confirman las confirmaciones M1 y F1, que no tocan este archivo.







Ahora imaginemos que hemos encontrado un error grave en una característica antigua que destruye por completo el comportamiento de todo el programa. Deteniendo abruptamente el problema, desactivamos la función cambiando la línea a "berry" y confirmando los cambios como F2.







En la vida, sucederá algo como cambiar la línea c







#define IS_FEATURE_ENABLED 1
      
      





en







#define IS_FEATURE_ENABLED 0
      
      





Pero desde que comencé a usar "manzana" y "baya", déjelas que permanezcan así.







, , , "master". , , , .







"master", "feature", .







, "master" . , F3 "feature" . :







Error arreglado







"berry" M3 "master". "feature" "apple" F3.







"feature" "master" . :







UPS







M4, "berry". "master" ! , "master" : , . , . , "feature", "master" .







, .







:







Antes de fusionar







Git (merge base): , . Git - (three-way merge), , M3 HEAD, F3 . , :







sencillo







"master" "apple" "berry". "feature" . "apple" "feature", "master" . "master" "berry" .







, "master" "feature", "berry" "feature":







incorrecto







, . ( ) "apple", "feature" , "berry" "master". , (fast-forward) .







" , ", . , , , .







Si tiene cuidado de no tocar las líneas involucradas en la copia, las expectativas se harán realidad. De lo contrario, en lugar de fusionar, obtendrá los cambios superpuestos uno encima del otro. Peor aún, si sus cambios deshacen los copiados, entonces ni siquiera obtendrá un conflicto de fusión para mostrar que algo anda mal. Dentro de nuestro equipo, llamamos a esto el problema ABA porque primero la línea contenía A, luego se cambió a B, se copió B y luego se volvió a A justo antes de la fusión en "master".







Bueno, en resumen, queríamos hacer una fusión parcial de "característica" a "maestro", pero el problema es que no hay una fusión "parcial".







¿O hay?







En el próximo artículo, te mostraré cómo hacerlo.








All Articles