Подтвердить что ты не робот

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

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

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 после слияния предполагает это.)

4b9b3361

Ответ 1

Они (фактически) идентичны. Вы видите разницу в размере вывода hg log --patch --rev X, потому что журнал показывает разницу результата и (произвольно) его "левого" родителя (официально p1), но это не то, как он хранится (у Mercurial есть формат хранения двоичных данных, t patch/diff based), и теперь он вычисляет (p1, p2 и most-recent-common-ancestor).

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

Ответ 2

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

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.