В Mercurial, как увидеть diff между в наборе изменений слияния и одним родителем без изменений от другого родителя? - PullRequest
11 голосов
/ 02 декабря 2010

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

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 и новый файл3.

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

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

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

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

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

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


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

1 Ответ

6 голосов
/ 03 декабря 2010

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

$ 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

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

$ hg diff -r 2:3 `hg log --template '{files}' -r 3`
# no output, since your colleague decided to keep her *ghi*
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...