Mercurial: как я могу увидеть только изменения, внесенные слиянием?
Я пытаюсь привыкнуть к просмотру кода, но слияния затрудняют процесс, потому что я не знаю, как попросить Mercurial "показать только изменения, внесенные слиянием, которые не присутствовали ни в одном из его родителей".
Или, немного более формально (спасибо Стив Лош):
Покажите мне каждый кусок в слиянии, который не присутствовал ни в одном из его родителей, и покажите мне каждый кусок в любом из его родителей, который также не присутствует в 3.
Например, предположим, что у меня есть репозиторий с двумя файлами: a и b. Если "a" изменено в редакции 1, "b" изменяется в редакции 2 (которая находится на отдельной ветке), и эти два изменения объединены в редакции 3, я получу историю, которая выглядит так:
@ changeset: 3
|\ summary: Merged.
| |
| o changeset: 2
| | summary: Changing b
| |
o | changeset: 1
|/ summary: Changing a
|
o changeset: 0
summary: Adding a and b
Но если я попрошу посмотреть изменения, внесенные в редакцию 3, hg di -c 3
, Mercurial покажет мне то же самое, что если бы я попросил увидеть изменения, внесенные в ревизию 1, hg di -c 1
:
$ hg di -c 3
--- a/a
+++ b/a
@@ -1,1 +1,1 @@
-a
+Change to a
$ hg di -c 1
--- a/a
+++ b/a
@@ -1,1 +1,1 @@
-a
+Change to a
Но, очевидно, это не очень полезно - вместо этого мне хотелось бы сказать, что никаких изменений не было внесено в редакцию 3 (или, если в процессе слияния возник конфликт, я хотел бы видеть только разрешение этого конфликта). Что-то вроде:
$ hg di -c 3
$
Итак, как я могу это сделать?
ps: я знаю, что я могу уменьшить количество слияний в моем репозитории с помощью rebase
... Но это не моя проблема - моя проблема заключается в том, что было изменено с помощью слияния.
Ответы
Ответ 1
Короткий ответ: вы не можете сделать это с помощью какой-либо акции Mercurial.
Запуск hg diff -c 3
покажет вам изменения между 3
и его первым родителем - т.е. набором изменений, на котором вы были, при запуске hg merge
.
Это имеет смысл, если вы думаете о ветвях как о простом наборе изменений. Когда вы запускаете hg up 1 && hg merge 2
, вы говорите Mercurial: "Смените набор изменений 2
на changeet 1
".
Это более очевидно, если вы используете именованные ветки. Скажем, changeet 2
в вашем примере был на именованной ветке с именем rewrite-ui
. Когда вы запускаете hg update 1 && hg merge rewrite-ui
, вы эффективно говорите: "Объедините все изменения в ветки rewrite-ui
в текущую ветку". Когда вы позже запустите hg diff -c
в этом наборе изменений, он покажет вам все, что было введено ветке default
(или какая-либо ветвь 1
, которая будет включена) слиянием, что имеет смысл.
Из вашего вопроса, однако, похоже, что вы ищете способ сказать:
Покажите мне каждый кусок в этом наборе изменений, который не присутствовал ни у одного из его родителей, и покажите мне каждый кусок в любом из его родителей, который также не присутствует в 3
.
Это не простая вещь для расчета (я даже не уверен, что я получил описание прямо сейчас). Я определенно могу понять, как это было бы полезно, поэтому, если вы можете однозначно определить это, вы можете убедить одного из нас, Mercurial, которые читают SO для его реализации.
Ответ 2
Чтобы делать обзоры кода, вы действительно хотите увидеть только изменения в проекте, который вы просматриваете. Для этого мы используем новую ветку для каждой истории и используем запросы на тягу, чтобы осветить изменения, объединив все изменения в ветвь истории, прежде чем создавать запрос на растяжение. Мы размещаем наш код на битбакете, а инструменты запроса на просмотр/вытягивание действительно очень хороши, предлагая бок о бок diff.
Потяните запросы с бок о бок diffs