2010-07-09 10 views
8

¿Mercurial siempre está utilizando las herramientas de combinación externas cuando dos ramas que se fusionan tienen cambios en el mismo archivo?Mercurial y fusionar herramientas?

¿O primero se ve si se puede fusionar el archivo en sí, y solo punting a la herramienta externa si no puede?

La razón por la que estoy pidiendo es que soy (una vez más) releyendo lo tutorial written by Joel Spolsky on Mercurial y uno dice, al comparar la forma en Subversion y Mercurial es la fusión es que:

Por el contrario, mientras trabajábamos por separado en Mercurial, Mercurial estaba ocupado manteniendo una serie de conjuntos de cambios. Entonces, cuando queremos fusionar nuestro código, Mercurial en realidad tiene mucha más información: sabe lo que cada uno de nosotros cambió y puede volver a aplicar esos cambios, en lugar de solo mirar el producto final e intentar adivinar cómo expresarlo. juntos.

Solo que mi experiencia me dice que parece implicar la herramienta de fusión externa cuando dos ramas tienen cambios en los mismos archivos. Y, por lo tanto, ¿eso no hace que el argumento anterior sea incorrecto?

o debería interpretar esto como sigue:

  • Subversion sólo combina el estado final de las dos ramas, y tiene más trabajo que hacer en una sola unidad
  • Mercurial se funde cada conjunto de cambios de forma individual, lo que permite para que funcione con unidades de cambios más pequeñas, con mayores posibilidades de éxito de fusión

¿Alguien puede arrojar algo de luz sobre esto?


Editar: Déjeme darle un ejemplo:

@echo off 

setlocal 

if exist repo rd /s /q repo 

md repo 
cd repo 
hg init . 

rem --- version 0 --- 
echo 1 >test.txt 
echo 2 >>test.txt 
echo 3 >>test.txt 
echo 4 >>test.txt 
echo 5 >>test.txt 
hg add test.txt 
hg commit -m "v0" 

rem --- version 1 --- 
echo 1 >test.txt 
echo 2 v1 >>test.txt 
echo 3 >>test.txt 
echo 4 >>test.txt 
echo 5 >>test.txt 
hg commit -m "v1" 

rem --- version 2 --- 
hg update 0 
echo 1 >test.txt 
echo 2 >>test.txt 
echo 3 >>test.txt 
echo 4 v2 >>test.txt 
echo 5 >>test.txt 
hg commit -m "v2" 

rem --- merge --- 
hg update 1 
hg merge 2 

Esta primera crea un archivo con el siguiente contenido:

1 
2 
3 
4 
5 

Luego se cambia a:

1 
2 v1 
3 
4 
5 

Entonces va de nuevo a la versión inicial (conjunto de cambios), y lo cambia a:

1 
2 
3 
4 v2 
5 

Entonces se intenta combinar los dos.

Ahora, según la (única) respuesta actual, esto no debería ser un problema, ya que los cambios no están en conflicto.

Sin embargo, en este punto, se invoca Beyond Compare (mi herramienta de combinación externa).

Respuesta

3

mergetool se invoca solo en caso de que haya un conflicto que deba resolverse. Los cambios en el mismo archivo en diferentes ramas constituyen tal conflicto.

Aparte de eso, el algoritmo de fusión real no está basado en conjuntos de cambios, sino que está basado en archivos para permitir los mejores resultados de fusión. Vea el Mercurial Wiki para más detalles.

Mercurial deja la combinación sin procesar, por lo que tiene la oportunidad de verificar su código antes de enviar el conjunto de cambios de fusión.

+0

Consulte mi pregunta editada –

+0

Disculpa, mientras editaba editaba. Debería ser más claro ahora. Los criterios para la invocación de mergetool son cambios en el mismo archivo, lo cual es perfectamente razonable. –

6

La gran diferencia entre la fusión mercurial y la fusión svn es que el algoritmo mercurial merge tiene acceso al último antecesor común entre las dos revisiones que se fusionan. Si su historia se parece a

A--B 
\-C 

SVN convertirá sus herramientas de mezcla pierden en B y C. Mercurial lanzará su herramienta con A, B y C y algunas herramientas de hacer mejor las cosas con eso.

Mercurial hace su propia fusión interna antes de iniciar su herramienta donde usa A, B y C para tomar algunas de las decisiones obvias. Puede desactivarlo alterando la configuración premerge para una herramienta.

Su prueba no está dando buenos resultados porque está fusionando 2 con su propio antecesor. Si en lugar de hacer un conjunto de cambios antes de crear hg update 0 2, por lo que tiene una historia real de ramificación así:

@ changeset: 2:790856e061f4 
| tag:   tip 
| parent:  0:bfba1d8f77af 
| user:  Ry4an Brase 
| date:  Fri Jul 09 16:50:34 2010 -0500 
| summary:  added v2 
| 
| @ changeset: 1:7a9c581561b6 
|/ user:  Ry4an Brase 
| date:  Fri Jul 09 16:50:16 2010 -0500 
| summary:  added v1 
| 
o changeset: 0:bfba1d8f77af 
    user:  Ry4an Brase 
    date:  Fri Jul 09 16:49:29 2010 -0500 
    summary:  first 

entonces cuando hg merge obtendrá:

1 
2 v1 
3 
4 v2 
5 

sin su lanzamiento herramienta de combinación.

Cuestiones relacionadas