Имеет ли значение направление слияния в Mercurial?

Возьмем простой пример: я работаю над веткой по умолчанию, некоторые изменения были зафиксированы локально, и я взял еще несколько из основного репозитория. Я работал в течение нескольких дней в своем изолированном локальном репозитории, поэтому нужно объединить немало изменений, прежде чем я смогу вернуть свои результаты обратно в 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 приводит к меньшим наборам изменений (потому что он применяет только мои несколько изменений к основной линии вместо применения всех изменений основной линии к моим нескольким).

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

2 ответа

Решение

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

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

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

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, так как вы генерируете новый набор изменений в той же ветке, в которой есть закладка.

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

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