2010-12-01 21 views
11

consideran este repo trivial:En mercurial, ¿cómo ver diff en un conjunto de cambios de combinación y un padre sin cambios del otro padre?

mkdir temp 
cd temp 
hg init 
echo abc > file1 
hg ci -A -m init 
echo def >> file1 
echo hey > file2 
hg ci -A -m A 
hg up -r0 
echo ghi >> file1 
echo hey > file3 
hg ci -A -m B 
hg merge 
hg ci -m merge 

durante combinación, tome "ghi" (en realidad no importa de qué lado).

El DAG es:

0 - 2 - 3 
\- 1 -/ 

hg diff -r1:3 espectáculos ARCHIVO1 cambian y nueva archivo3.

hg diff -r2:3 muestra un nuevo archivo2. Lo mismo para hg log -p -r3 y hg st --change 3, porque 2 es el primer elemento principal.

Mi pregunta es: ¿cómo puedo ver los cambios entre 1 y 3 menos los cambios en 2, que es conceptualmente d(1:3) - d(0:2)?

Espero ver solo el cambio de archivo1. hg log -r3 -v solo muestra "archivos: archivo1" (supongo que porque es el único archivo en el cambio ctx), pero curiosamente, hg log -r3 --debug también muestra "archivos +: archivo2".

Si ejecuto hg view (proporcionado por la extensión incluida hgk) y hago clic en r3, se muestra solo el archivo1. No puedo leer el código tcl/tk, pero parece que el truco está en una función contmergediff donde obtiene la lista de archivos en una combinación, en la que de alguna manera omite el archivo2.

FWIW, TortoiseHg es diferente de todo lo anterior: al hacer clic en r3 se muestra "M file1" y "A file2" en la lista de archivos, pero no muestra ningún cambio real en file1. Haga clic en "Otro padre" muestra "M archivo1" y "Un archivo3", que es lo mismo que "diff -r1: 3".

Un caso de uso del mundo real es este: r1 es mío, y r2 es de un colega. Anteriormente, el colega revisó r1 (diff 0: 1), pero no lo fusionó antes de solicitar la revisión de r2. Así que revisé r2 (diff 0: 2), y luego él hizo la fusión. Luego, cuando vea diff 1: 3, debo olvidar que alguna vez revisé r2. Si la diferencia de fusión es pequeña, puedo usar hgk. Pero si es grande, realmente necesito verlo en vdiff.


(ACTUALIZADO) Ahora hay un mergediff extension. Si alguien lo intenta y lo encuentra funcionar, por favor agregue una respuesta.

+1

Para comprender mejor su caso de uso, ¿desea ver qué ha hecho su colega con * sus * cambios (rev.1) durante la fusión? –

+0

@Oben Sonne: exactamente, y simétricamente, lo que tuvo que cambiar sus cosas para la fusión. Como sé lo que es 0: 1 y lo que es 0: 2, solo quiero ver el cambio real entre 1: 3 y 2: 3, pero hg diff 1: 3 incluye 0: 2 y 2: 3 incluye 0: 1. –

Respuesta

6

He aquí una suposición (aunque no estoy seguro de si realmente hace lo que quiere). El comando

$ hg log --template {files} -r <merge-revision> 

enumera los archivos, que se han cambiado mediante una combinación. Esta salida se podría usar como una lista de archivos para el comando diff, para mostrar solo los cambios que le interesen.

aplicado a su ejemplo, lo siguiente debería mostrar lo que la fusión hizo con sus contribuciones de revisión 1:

$ hg diff -r 1:3 `hg log --template '{files}' -r 3` 
diff --git a/file1 b/file1 
--- a/file1 
+++ b/file1 
@@ -1,2 +1,2 @@ 
abc 
-def 
+ghi 

Del mismo modo, el siguiente comando que debe mostrar cómo la fusión afectada cambios que su de colega en la revisión 2:

$ hg diff -r 2:3 `hg log --template '{files}' -r 3` 
# no output, since your colleague decided to keep her *ghi* 
+0

¡Funciona como un encanto! (La plantilla necesita ser citada ''{files}' ', sin embargo). –

+0

@Geoffrey: ¡Genial! Acabo de actualizar la respuesta para usar plantillas citadas. –

+2

Recientemente escribí [una publicación de blog que ilustra esta pregunta y mi respuesta más detallada] (http://obensonne.bitbucket.org/blog/20110315-what-the-merge.html). –

Cuestiones relacionadas