2012-03-07 11 views
97

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

Desde que se introdujo en 2.0, me he preguntado acerca del uso de graft para evitar este problema. Dado un árbol de revisión de esta manera:

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

Supongamos que tenemos que crear una rama de liberación que se salta el cambio Mal E.

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

que nos da:

A---B---C---D---E---F---G---H---I---J 
      \ 
       --F'--G'--H'--I'--J' 
  • P1: ¿Qué ha pasado aquí? Puedo entender que transplant habría generado parches de F::J, y luego los hubiera aplicado en D, pero se dice que graft usa 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 combinación directa; nada especial allí. M2 está fusionando ramas que tienen "el mismo" cambio (o al menos equivalente) en.

  • P2: ¿Es esta fusión sólo una fusión usual de 3 vías usando D, y J'M1?
  • Q3: ¿Ha almacenado/usado mercurial información adicional sobre la operación del injerto para ayudarlo con la fusión?

Y por último ...

  • P4: ¿Cuáles son los problemas potenciales con un flujo de esta manera?

Respuesta

118

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

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

Si escribimos +d para el delta entre los estados C y D, a continuación, se comienza con:

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

Girar el gráfico 90 grados hacia la derecha y los tres anteriores merge-way es el siguiente:

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

es decir, se pretende que empezamos con E y TH aplicamos e opuesto a -e para obtener D. Pienso en el parche inverso de +e. Comenzando en E también fuimos al estado F con el delta normal +f. No hay nada extraño aquí: ya tenemos todos los estados (D, E y F) en el repositorio. Visto así, está claro que podemos fusionar D y F.

La fusión es una cuestión de "completar el diamante". Así que nos encontramos con un nuevo estado M que es una mezcla de D y F y donde la diferencia con respecto a DM es similar a +f y la diferencia con respecto a FM es similar a -e. Se ve así:

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

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

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

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

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 se aplicó +f a E. Nos puede enderezar la gráfica un poco para llegar:

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

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

  • P1: ¿Qué ha pasado aquí? Entonces ... ¿Cómo funciona eso? ¿Por qué es mejor?

    A1: El uso de fusiones es mejor que parches, ya que la maquinaria de fusión requiere cambios de nombre como el cambio de nombre.

  • Q2: ¿Es esta fusión solo una fusión normal de 3 vías usando D, J 'y M1?

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

  • Q3: ¿Ha almacenado/usado mercurial información adicional sobre la operación del injerto para ayudarlo con la fusión?

    A3:

  • P4: ¿Cuáles son los problemas potenciales con un flujo de esta manera?

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

+4

Gran pregunta, gran respuesta :). +1 a ambos! –

+0

Gracias Martin. Ese es un pensamiento bastante funky por quien se le ocurrió eso. Tengo la idea, pero necesito resolver el caso general. Supongo que no importa la ruta entre los nodos a los que está injertando desde/hacia? –

+3

@PaulS: creo que todo lo que necesita saber es que el injerto puede copiar los conjuntos de cambios de una manera más sólida que la que puede hacerlo el trasplante. Robusto en el sentido de que se cambian los nombres y que puede resolver conflictos en una herramienta de fusión. Los detalles se encuentran en las extrañas fusiones que tiene, pero espero que no sean esenciales para comprender el uso diario del injerto. :-) –

6

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

Q2: Es una combinación normal.

P3: Nº

P4: Creo que es horrible tener dos ramas casi idénticos.

Cuestiones relacionadas