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


person David Wolever    schedule 17.12.2009    source источник
comment
Это звучит как очень полезная команда. Я с нетерпением жду ответа.   -  person Peter Rowell    schedule 17.12.2009
comment
В итоге я написал плагин для слияния: mercurial.selenic.com/wiki/MergediffExtension   -  person David Wolever    schedule 23.02.2011
comment
Отсутствие этой функциональности всегда казалось потенциальным способом внедрения троянов. Надеюсь, он будет включен в hg core.   -  person dkamins    schedule 03.11.2012
comment
В git вы можете запустить git show ‹объединить ревизию›. Хорошая запись здесь: haacked.com/archive/2014/02/ 21/reviewing-merge-commits Хотелось бы посмотреть, как это сделать в hg.   -  person Jared Kells    schedule 31.03.2014
comment
Это то, что Bitbucket показывает для запросов на вытягивание/коммитов слияния, и это потрясающе. Это действительно должно быть частью hg core.   -  person Kosta_Arnorsky    schedule 07.05.2019


Ответы (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, реализовать его.

person Steve Losh    schedule 17.12.2009
comment
Хм, похоже, я забыл сказать очевидное ранее: спасибо за ответ. В любом случае, вы слышали от каких-нибудь разработчиков HG, которые могут быть заинтересованы в том, чтобы что-то взорвать? Или, в качестве альтернативы, вы (или кто-то другой?) не будете возражать, если я буду прослушивать их, пока пытаюсь понять, как это реализовать? - person David Wolever; 23.12.2009
comment
Мне было бы интересно, потому что было бы очень приятно иметь разумный diff слияния для расширения hg-review, над которым я работаю. Я sjl в #mercurial на freenode — напишите мне. - person Steve Losh; 23.12.2009
comment
Извините за поздний ответ… Но в итоге я написал такой плагин: mercurial.selenic.com/wiki/ Расширение слияния - person David Wolever; 23.02.2011

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

Вытягивать запросы с параллельными боковые различия

person chrisp_68    schedule 29.11.2016