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