Имеет ли значение направление слияния в Mercurial? - PullRequest
16 голосов
/ 09 февраля 2011

Возьмем простой пример: я работаю над веткой по умолчанию, некоторые изменения были зафиксированы локально, и я вытащил еще несколько из главного репозитория. Я работал в течение нескольких дней в своем изолированном локальном репозитории, поэтому нужно объединить немало изменений, прежде чем я смогу отправить свои результаты обратно в master.

default ---o-o-o-o-o-o-o-o-o-o-o  (pulled stuff)
            \
             o----o------------o  (my stuff)

Теперь я могу сделать две вещи.

Вариант № 1:

hg pull
hg merge

Результат № 1:

default ---o-o-o-o-o-o-o-o-o-o-o
            \                   \
             o----o------------o-O

Вариант № 2:

hg pull
hg update
hg merge

Результат № 2:

default ---o-o-o-o-o-o-o-o-o-o-o-O
            \                   /
             o----o------------o

Эти два результата кажутся мне изоморфными, но на практике кажется, что вариант № 2 приводит к меньшим наборам изменений (поскольку он применяет только мои несколько изменений к основной линии вместо применения всех изменений основной линии к моим нескольким). *

Мой вопрос: имеет ли это значение? Должен ли я заботиться о направлении моих слияний? Я экономлю место, если я делаю это? (Выполнение hg log --patch --rev tip после слияния предполагает это.)

Ответы [ 2 ]

14 голосов
/ 09 февраля 2011

Они (эффективно) идентичны. Вы видите разницу в выходном размере hg log --patch --rev X, потому что log показывает разность результата и (произвольно) его «левого» родителя (официально p1), но это не то, как он хранится (Mercurial имеет двоичный формат хранения различий, который не '). t patch / diff based) и теперь он рассчитывается (используются p1, p2 и самый последний общий предок).

Единственная реальная разница в том, что если вы используете именованные ветви, то имя ветви будет именем левого родителя.

2 голосов
/ 15 декабря 2011

Существует также разница, если вы используете закладки.При выполнении слияния ветвь, которой вы являетесь, является ветвью, которая получает изменения, поэтому новый набор изменений будет частью этой ветки.Предположим, у вас есть такая ситуация:

default ---o-o-o-o-o-o-o-o-o-o-o   -- Head: Rev 200
            \
             o----o------------o   -- Head: Rev 195, Bookmark: my-stuff

Если вы объедините Rev 200 с Rev 195, закладка my-stuff перейдет к Rev 201, так как вы генерируете новый набор изменений в той же ветви, в которойbookmark.

С другой стороны, если вы объединяете 195 в 200, вы генерируете набор изменений в ветви, у которых нет закладки.Закладка my-stuff останется в Rev 195.

...