2011-02-09 18 views
16

Tome un ejemplo simple: estoy trabajando en la rama predeterminada, tengo algunos conjuntos de cambios confirmados localmente, y saqué algunos más del repositorio principal. He estado trabajando durante unos días en mi repositorio local aislado, por lo que hay varios cambios para fusionar antes de que pueda volver a aplicar mis resultados al máster.¿Se fusiona la dirección en Mercurial?

default ---o-o-o-o-o-o-o-o-o-o-o (pulled stuff) 
      \ 
      o----o------------o (my stuff) 

Puedo hacer dos cosas ahora.

Opción # 1:

hg pull 
hg merge 

Resultado # 1:

default ---o-o-o-o-o-o-o-o-o-o-o 
      \     \ 
      o----o------------o-O 

Opción # 2:

hg pull 
hg update 
hg merge 

Resultado # 2:

default ---o-o-o-o-o-o-o-o-o-o-o-O 
      \     /
      o----o------------o 

Estos dos resultados parecen isomorfos para mí, pero en la práctica parece que la opción n. ° 2 da como resultado conjuntos de cambios mucho más pequeños (porque solo aplica mis pocos cambios a la línea principal en lugar de aplicar todos los cambios principales a mis pocos).

Mi pregunta es: ¿esto importa? ¿Debería importarme la dirección de mis fusiones? ¿Estoy ahorrando espacio si hago esto? (Hacer hg log --patch --rev tip después de la fusión lo sugiere)

Respuesta

14

Son (efectivamente) idénticos. Usted ve una diferencia en el tamaño de salida hg log --patch --rev X porque el registro muestra la diferencia del resultado y (arbitrariamente) su padre 'izquierdo' (oficialmente p1), pero no es así como se almacena (Mercurial tiene un formato de almacenamiento binario que no es parche/diff basado) y ahora es cómo se calcula (p1, p2, y más reciente-común-ancestro son todos utilizados).

La única diferencia real es que, si utiliza ramas con nombre, el nombre de la rama será el del elemento primario izquierdo.

2

También hay una diferencia si está utilizando Marcadores. Al hacer una fusión, la rama que usted es es la rama que recibe los cambios, por lo que el nuevo conjunto de cambios será parte de esa rama. Supose que tiene esta situación:

default ---o-o-o-o-o-o-o-o-o-o-o -- Head: Rev 200 
      \ 
      o----o------------o -- Head: Rev 195, Bookmark: my-stuff 

Si fusiona Rev 200 a 195 Rev, el marcador my-stuff se trasladará a Rev 201, como se va a generar un nuevo conjunto de cambios en la misma rama que tiene el marcador.

Por otro lado, si combina 195 en 200, está generando un conjunto de cambios en la rama que no tiene el marcador. El marcador my-stuff se mantendrá en Rev 195.

+1

Esto es particularmente importante si usa [Hg-Git] (http://hg-git.github.com/), ya que rastrea la posición de las ramas virtuales de Git usando marcadores. Si se fusiona de manera incorrecta, el marcador de rama de Git no se moverá y no tendrá nada que empujar. –

+0

No se garantiza que fusionar 200 en 195 moverá el marcador hacia adelante a 201. Si lo hace 'hg update my-stuff; hg merge 200' lo hará, pero si lo hace 'hg update 195; hg merge 200' no lo hará. La actualización por nombre de marcador lo hace * activo *. –

Cuestiones relacionadas