Подтвердить что ты не робот

В mercurial, как видеть diff в наборе изменений слияния и одном родителе без изменений от другого родителя?

Рассмотрим это тривиальное репо:

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

Во время слияния возьмите "ghi" (на самом деле не важно, с какой стороны).

DAG:

0 - 2 - 3
 \- 1 -/

hg diff -r1:3 показывает изменение файла1 и новый файл.

hg diff -r2:3 показывает новый файл2. То же самое для hg log -p -r3 и hg st --change 3, потому что 2 является первым родителем.

Мой вопрос: как я могу увидеть изменения между 1 и 3 минус изменения в 2, что концептуально d(1:3) - d(0:2)?

Я ожидаю увидеть только изменение файла1. hg log -r3 -v показывает только "files: file1" (я думаю, потому что это единственный файл в смене ctx), но с любопытством, hg log -r3 --debug также показывает "файлы +: файл2".

Если я запустил hg view (предоставленный связанным расширением hgk) и нажав на r3, он отобразит только файл1. Я не могу прочитать код tcl/tk, но кажется, что трюк находится в функции contmergediff, где он получает список файлов в слиянии, в котором он каким-то образом пропускает файл2.

FWIW, TortoiseHg отличается от всего вышеперечисленного: нажатие на r3 показывает "M file1" и "A file2" в списке файлов, но не показывает фактических изменений в файле1. Нажмите "Другой родитель", чтобы отобразить "M file1" и "A file3", что совпадает с "diff -r1: 3".

Случай использования в реальном мире таков: r1 мой, а r2 - коллега. Ранее коллега рассмотрел r1 (diff 0: 1), но он не объединил его, прежде чем запрашивать обзор r2. Поэтому я просмотрел r2 (diff 0: 2), а позже он сделал слияние. Затем, когда я вижу diff 1: 3, я должен забыть о том, что я когда-либо рассматривал r2. Если diff слияния невелик, я могу просто использовать hgk. Но если он большой, мне действительно нужно увидеть его в vdiff.


(ОБНОВЛЕНИЕ) Теперь существует расширение mergediff. Если кто-то попытается найти работу, добавьте ответ.

4b9b3361

Ответ 1

Здесь угадайте (хотя я не уверен, действительно ли он делает то, что вы хотите). Команда

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

перечислены файлы, которые были изменены слиянием. Этот вывод можно использовать в качестве списка файлов для команды diff, чтобы отображать только те изменения, которые вам интересны.

Применительно к вашему примеру следующее должно показать, что произошло слиянием с вашими взносами в версии 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

Аналогично, приведенная ниже команда должна показать вам, как слияние повлияло на изменения вашего коллеги в версии 2:

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