2010-12-01 3 views
11

ce repo trivial Tenir compte:Dans mercurial, comment voir diff entre dans un changeset de fusion et un parent sans changements de l'autre parent?

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 

Au cours de fusion, prendre "GHI" (ne compte pas vraiment de quel côté).

Le DAG est:

0 - 2 - 3 
\- 1 -/ 

hg diff -r1:3 montre Fichier1 changer et de nouvelles file3.

hg diff -r2:3 affiche le nouveau fichier2. Idem pour hg log -p -r3 et hg st --change 3, car 2 est le premier parent.

Ma question est: comment puis-je voir les changements entre 1 et 3 moins les changements dans 2, qui est conceptuellement d(1:3) - d(0:2)?

Je m'attends à voir seulement le changement de fichier1. hg log -r3 -v montre seulement "files: file1" (je suppose que c'est le seul fichier dans le ctx de changement), mais curieusement, hg log -r3 --debug montre également "files +: file2".

Si j'exécute hg view (fourni par l'extension hgk fournie) et que vous cliquez sur r3, cela affiche uniquement fichier1. Je ne peux pas lire le code tcl/tk, mais il semble que l'astuce est dans une fonction contmergediff où il obtient la liste des fichiers dans une fusion, dans lequel il omet en quelque sorte file2. FWIW, TortoiseHg est différent de tout ce qui précède: cliquer sur r3 affiche "M file1" et "A file2" dans la liste des fichiers, mais ne montre aucun changement réel dans file1. Cliquez sur "Autre Parent" montre "M fichier1" et "A fichier3", qui est le même que "diff -r1: 3". Un cas d'utilisation dans le monde réel est le suivant: r1 est à moi, et r2 est un collègue. Plus tôt, le collègue a examiné r1 (diff 0: 1), mais il ne l'a pas fusionné avant de demander la révision de r2. J'ai donc passé en revue r2 (diff 0: 2), et plus tard il a fait la fusion. Puis quand je vois diff 1: 3, je dois oublier que j'ai déjà examiné r2. Si le diff de fusion est petit, je peux juste utiliser hgk. Mais si c'est gros, j'ai vraiment besoin de le voir dans vdiff.


(MISE À JOUR) Il existe maintenant un mergediff extension. Si quelqu'un essaie et trouve le travail, s'il vous plaît ajouter une réponse.

+1

Pour mieux comprendre votre cas d'utilisation, vous voulez voir ce que votre collègue a fait avec * vos * changements (rev.1) lors de la fusion? –

+0

@Oben Sonne: exactement, et symétriquement, ce qu'il a dû changer ses trucs pour la fusion. Depuis que je sais ce qui est 0: 1, et ce qui est 0: 2, je veux seulement voir le changement réel entre 1: 3 et 2: 3, mais hg diff 1: 3 comprend 0: 2 et 2: 3 comprend 0: 1. –

Répondre

6

Voici une estimation (bien que je ne sois pas sûr si cela fait vraiment ce que vous voulez). La commande

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

répertorie les fichiers qui ont été modifiés par fusion. Cette sortie peut être utilisée comme une liste de fichiers pour la commande diff, pour afficher uniquement les modifications qui vous intéressent.

appliquée à votre exemple, ce qui suit devrait montrer ce que la fusion a fait avec vos contributions en révision 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 

De même, la commande ci-dessous devrait vous montrer comment la fusion affectée de votre collègue changements en révision 2:

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

Fonctionne comme un charme! (Le modèle doit être cité '' {files} '', cependant.) –

+0

@Geoffrey: Super! Juste mis à jour la réponse pour utiliser des modèles cités. –

+2

Récemment, j'ai écrit [un billet de blog qui illustre cette question et ma réponse plus détaillée] (http://obensonne.bitbucket.org/blog/20110315-what-the-merge.html). –

Questions connexes