Mercurial: как я могу увидеть только изменения, внесенные слиянием? - PullRequest
22 голосов
/ 17 декабря 2009

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

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

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

Например, предположим, что у меня есть хранилище с двумя файлами, a и b. Если «а» изменяется в ревизии 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 ... Но это не моя проблема - моя проблема - выяснить, что было изменено слиянием.

Ответы [ 2 ]

12 голосов
/ 17 декабря 2009

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

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

Это имеет смысл, когда вы рассматриваете ветви как нечто большее, чем просто набор изменений. Когда вы запускаете hg up 1 && hg merge 2, вы говорите Mercurial: «Объединить набор изменений 2 с набором изменений 1».

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

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

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

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

0 голосов
/ 29 ноября 2016

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

Запросы на извлечение с параллельными различиями

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...