Самая большая разница в том, как имена ветвей записываются в истории. С именованными ветвями имя ветви внедрено в каждом наборе изменений и, таким образом, станет неизменной частью истории. С клонами не будет постоянной записи о происхождении определенного набора изменений.
Это означает, что клоны отлично подходят для быстрых экспериментов, когда вы не хотите записывать имя ветви, а именованные ветви хороши для долгосрочных ветвей ("1.x", "2.x" и аналогичных).
Обратите внимание, что в одном хранилище можно легко разместить несколько легких веток в Mercurial. Такие ветки в репозитории могут быть добавлены в закладки, чтобы вы могли легко найти их снова. Допустим, вы клонировали хранилище компании, когда оно выглядело так:
[a] --- [b]
Вы взломали и сделали [x]
и [y]
:
[a] --- [b] --- [x] --- [y]
Имеется в виду, когда кто-то помещает [c]
и [d]
в хранилище, поэтому, когда вы тянете, вы получаете график истории, подобный этому:
[x] --- [y]
/
[a] --- [b] --- [c] --- [d]
Здесь есть две головы в одном хранилище. Ваша рабочая копия всегда будет отражать один набор изменений, так называемый набор изменений родительской рабочей копии. Проверьте это с:
% hg parents
Допустим, он сообщает [y]
. Вы можете увидеть головы с
% hg heads
, и это сообщит [y]
и [d]
. Если вы хотите обновить свой репозиторий до чистой проверки [d]
, то просто сделайте (замените [d]
номером ревизии на [d]
):
% hg update --clean [d]
Затем вы увидите, что hg parents
сообщит [d]
. Это означает, что ваш следующий коммит будет иметь [d]
в качестве родителя. Таким образом, вы можете исправить ошибку, замеченную в основной ветке, и создать набор изменений [e]
:
[x] --- [y]
/
[a] --- [b] --- [c] --- [d] --- [e]
Чтобы нажать только ревизию [e]
, вам нужно сделать
% hg push -r [e]
где [e]
- хеш ревизии. По умолчанию hg push
просто сравнивает репозитории и увидит, что [x]
, [y]
и [e]
отсутствуют, но вы, возможно, не захотите делиться [x]
и [y]
.
Если исправление также влияет на вас, вы хотите объединить его с вашей веткой функций:
% hg update [y]
% hg merge
В результате график вашего хранилища будет выглядеть так:
[x] --- [y] ----------- [z]
/ /
[a] --- [b] --- [c] --- [d] --- [e]
, где [z]
- это слияние между [y]
и [e]
. Вы также могли бы выбросить ветку:
% hg strip [x]
Моя главная мысль этой истории такова: один клон может легко представлять несколько путей развития. Это всегда было верно для "обычного hg" без использования каких-либо расширений. расширение закладок очень помогает. Это позволит вам назначать имена (закладки) для наборов изменений. В приведенном выше случае вам понадобится закладка на вашей голове разработки и одна на верхнем. Закладки могут быть выдвинуты и вытянуты с Mercurial 1.6 и стали встроенной функцией в Mercurial 1.8.
Если бы вы решили создать два клона, ваш клон разработки выглядел бы так после создания [x]
и [y]
:
[a] --- [b] --- [x] --- [y]
И ваш вышестоящий клон будет содержать:
[a] --- [b] --- [c] --- [d]
Теперь вы заметили ошибку и исправили ее. Здесь вам не нужно hg update
, поскольку вышестоящий клон готов к использованию. Вы фиксируете и создаете [e]
:
[a] --- [b] --- [c] --- [d] --- [e]
Чтобы включить исправление в свой клон разработки, вы извлекаете его там:
[a] --- [b] --- [x] --- [y]
\
[c] --- [d] --- [e]
и объединить:
[a] --- [b] --- [x] --- [y] --- [z]
\ /
[c] --- [d] --- [e]
График может выглядеть иначе, но он имеет ту же структуру и конечный результат тот же. Используя клонов, вам нужно было немного меньше вести мысленную бухгалтерию.
Именованные ветви на самом деле здесь не фигурируют, потому что они не обязательны. Сам Mercurial был разработан с использованием двух клонов в течение многих лет, прежде чем мы переключились на использование именованных веток. Мы поддерживаем ветку, называемую «стабильной», в дополнение к ветке «по умолчанию» и делаем наши релизы на основе «стабильной» ветки. См. Стандартную ветвь в вики для описания рекомендуемого рабочего процесса.