Mercurial: как я могу увидеть только изменения, внесенные слиянием?

Я пытаюсь привыкнуть к проверке кода, но слияния затрудняют процесс, потому что я не знаю, как попросить Mercurial "показывать только изменения, внесенные слиянием, которых не было ни у одного из его родителей".".

Или чуть более формально (спасибо Стиву Лошу):

Покажите мне каждый кусок в слиянии, которого не было ни у одного из его родителей, и покажите мне каждый кусок, присутствующий у одного из его родителей, которого также нет в 3.

Например, предположим, что у меня есть хранилище с двумя файлами, a и b. Если "а" изменяется в ревизии 1, "b" изменяется в ревизии 2 (которая находится в отдельной ветви), и эти два изменения объединяются в ревизии 3, я получу историю, которая выглядит следующим образом:

 @ changeset: 3
    | \ резюме: объединены.
    | |
    | o  changeset:   2
    | | Резюме: изменение б
    | |
    о | набор изменений:   1
    |/ резюме: изменение
    |
    o  changeset:   0
       резюме: добавление a и b

Но если я попрошу увидеть изменения, внесенные в редакции 3, hg di -c 3Mercurial покажет мне то же самое, что если бы я попросил увидеть изменения, внесенные в ревизию 1, hg di -c 1:

 $ hg di -c 3
    --- а / а     
    +++ б / у     
    @@ -1,1 +1,1 @@ 
    -a 
    + Изменить на
    $ рт.ст. 1
    --- а / а     
    +++ б / у     
    @@ -1,1 +1,1 @@ 
    -a 
    + Изменить на

Но, очевидно, это не очень полезно - вместо этого я хотел бы сказать, что никакие новые изменения не были внесены в пересмотре 3 (или, если во время объединения произошел конфликт, я хотел бы видеть только решение этой проблемы). конфликт). Что-то вроде:

 $ hg di -c 3
    $

Итак, как я могу это сделать?

PS: я знаю, что я могу уменьшить количество слияний в моем хранилище, используя rebase... Но это не моя проблема - моя проблема в том, чтобы выяснить, что было изменено слиянием.

2 ответа

Короткий ответ: вы не можете сделать это с любой стандартной командой Mercurial.

Бег hg diff -c 3 покажет вам изменения между 3 и его первый родитель - т.е. набор изменений, в котором вы были, когда вы бежали hg merge,

Это имеет смысл, когда вы рассматриваете ветви как нечто большее, чем просто набор изменений. Когда ты бежишь hg up 1 && hg merge 2 вы говорите Mercurial: "Слияние ревизии 2 в набор изменений 1".

Это более очевидно, если вы используете именованные ветви. Скажи ревизию 2 в вашем примере был на названной ветви с именем rewrite-ui, Когда ты бежишь hg update 1 && hg merge rewrite-ui вы фактически говорите: "Объедините все изменения в rewrite-ui перейти в текущую ветку."Когда вы позже запустите hg diff -c на этом наборе изменений он показывает вам все, что было введено в default филиал (или любой другой филиал 1 случается) путем слияния, что имеет смысл.

От вашего вопроса, тем не менее, похоже, что вы ищете способ сказать:

Покажите мне каждый кусок в этом наборе изменений, который не присутствовал ни у одного из его родителей, и покажите мне каждый кусок этого подарка у любого из его родителей, который также не присутствует в 3,

Это не простая вещь для вычисления (я даже не уверен, что получил описание прямо сейчас). Однако я определенно вижу, как это было бы полезно, поэтому, если вы сможете однозначно определить его, вы можете убедить одного из нас, разработчиков Mercurial, прочитать SO, чтобы реализовать его.

Для того, чтобы делать обзоры кода, вы действительно хотите видеть только изменения в проекте, который вы просматриваете. С этой целью мы используем новую ветвь для каждой истории и используем запросы на извлечение, чтобы выделить изменения, объединив все изменения в ветку истории перед созданием запроса на извлечение. Мы размещаем наш код на bitbucket, и инструменты запроса обзора / извлечения действительно очень хороши, предлагая параллельный diff.

Подтягивать запросы с помощью параллельных различий

Другие вопросы по тегам