software control version-control mercurial branch dvcs cherry-pick

version-control - mercurial software version control



Consecuencias del uso de injerto en Mercurial (2)

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

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

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

Supongamos que necesitamos crear una rama 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 rama 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 ramas que tienen "el mismo" cambio (o al menos 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 repositorio. 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 ----. / / E M / / ''---- 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 ----. / / E M / ''---- F +f

Para reiterar: hemos copiado 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 obtener:

+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 cuenta 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 ramas casi idénticas.