Consecuencias del uso de injerto en Mercurial

Recientemente, se han hecho varias preguntas sobre omisión de cambios al mantener las twigs de publicación en Mercurial. Por ejemplo:

  • Mercurial: los cambios específicos de twig siguen volviendo después de la fusión ficticia
  • ¿Por qué los retrocesos Mercurial en una twig afectan a otras twigs?

Desde que se introdujo en 2.0, me he preguntado sobre el uso de graft para evitar este problema. Dado un tree de revisión como este:

 A---B---C---D---E---F---G---H---I---J 

Supongamos que necesitamos crear una twig de lanzamiento que omita el cambio E Evil.

 hg update -r D hg graft "F::J" 

dándonos:

 A---B---C---D---E---F---G---H---I---J \ --F'--G'--H'--I'--J' 
  • P1: ¿Qué acaba de pasar aquí? Puedo entender que el transplant hubiera generado parches de F::J y luego los haya aplicado a D , pero se dice que graft utiliza la combinación de 3 vías en lugar de parches. Entonces … ¿Cómo funciona eso? ¿Por qué es mejor?

Digamos que ahora arreglo E , y lo fusiono en mi twig de lanzamiento.

  --E2----------------- / \ A---B---C---D---E---F---G---H---I---J---M1 \ \ --F'--G'--H'--I'--J'---------M2-- 

M1 es una fusión directa; nada especial allí. M2 está fusionando twigs que tienen "el mismo" cambio (o al less equivalente) en.

  • P2: ¿Es esta combinación simplemente una combinación normal de 3 vías usando D , J' y M1 ?
  • P3: ¿Mercurial ha almacenado / usado información adicional sobre la operación de injerto para ayudarlo con la fusión?

Y finalmente…

  • P4: ¿Cuáles son los posibles problemas con un flujo como este?

Cuando actualiza a D e injerta F::J , Mercurial ejecuta una serie de fusiones. Comenzará con esta fusión:

 M = three_way_merge(local=D, other=F, base=E) 

Si escribimos +d para el delta entre los estados C y D , entonces comenzamos con:

  +d +e +f ---- C ---- D ---- E ---- F ---- 

Gire el gráfico 90 grados en el sentido de las agujas del reloj y la combinación de tres vías anterior se ve así:

  -e .---- D / E \ '---- F +f 

Es decir, pretendemos que comenzamos con E y aplicamos lo opuesto a -e para llegar a D Pienso en el parche inverso de +e . Comenzando en E también fuimos al estado F con el delta +f normal. Aquí no hay nada extraño: ya tenemos todos los estados ( D , E y F ) en el repository. Visto de esta manera, está claro que podemos fusionar D y F

La fusión es una cuestión de "completar el diamante". Entonces encontramos un nuevo estado M que es una mezcla de D y F y donde la diferencia de D a M es similar a +f y la diferencia de F a M es similar a -e . Se parece a esto:

  -e +f' .---- D ----. / \ EM \ / '---- F ----' +f -e' 

El +f delta se convirtió en +f' y el -e delta se convirtió en -e' . Esto es solo una combinación normal de tres vías, pero el efecto es interesante: hemos aplicado F en D lugar de E !

Después de la fusión, el segundo padre de M a F se descarta:

  -e +f' .---- D ----. / \ EM \ '---- F +f 

Para reiterar: hemos copydo el "efecto" de F en D , es decir, hemos encontrado un delta ( +f' ) que aplicado a D da el mismo efecto que cuando +f se aplicó a E Podemos enderezar el gráfico un poco para get:

  +f' --- D ---- M \ '---- E ---- F +e +f 

El resultado es que F se injerta en D utilizando la maquinaria de tres vías completa.

  • P1: ¿Qué acaba de pasar aquí? Entonces … ¿Cómo funciona eso? ¿Por qué es mejor?

    A1: Usar fusiones es mejor que parches ya que la maquinaria de fusión tiene en count cosas como cambiar el nombre.

  • P2: ¿Es esta combinación simplemente una combinación normal de 3 vías usando D, J 'y M1?

    A2: Sí, el injerto no altera la topología del gráfico.

  • P3: ¿Mercurial ha almacenado / usado información adicional sobre la operación de injerto para ayudarlo con la fusión?

    A3: No.

  • P4: ¿Cuáles son los posibles problemas con un flujo como este?

    A4: desde una perspectiva de fusión, debería funcionar bien. Duplicará un poco de historia que puede ser confusa para las personas.

Q1: Ayuda cuando hay conflictos. Puede usar su herramienta de fusión habitual entonces (para mí son los marcadores de conflicto en línea, que edito con el modo smerge de Emacs).

P2: Es una fusión normal.

Q3: No.

P4: Creo que es feo tener dos twigs casi idénticas.