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

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... Но это не моя проблема - моя проблема заключается в том, что было изменено с помощью слияния.

4b9b3361

Ответ 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