З моменту написання попередньої частини пройшло два тижні, але за цей час відбулося чимало подій. Зарелізілісь Mercurial 1.5 і TortoiseHg 1.0. а Джоел Спольскі написав туторіал по mercurial. Що характерно, оповідання своє, Джоел розбавив балками віндового консолі, що дозволяє мені в таємниці сподіватися, що перед цим він читав мій блог :)
Втім, навіть настільки серйозна конкуренція не відіб'є у мене бажання продовжити свій убогий огляд.
Сьогодні тема буде невелика і, на перший погляд, проста. Однак і тут можна заплутатися. Отже - голови (heads) в Mercurial.
Голова, це ревізія, яка не має нащадків. При лінійної розробці (без гілок), все взагалі кристально ясно - остання ревізія є поточної робочої ревізією і головою всієї розробки. При наявності гілок, все трохи ускладнюється.
Створимо для тестів новий робочий каталог і репозиторій.
Доведемо справу до першої ревізії.
Як видно, головою є наша перша і поки єдина ревізія.
Право називатися головою перейшло до наступної ревізії. І при лінійної розробці, цей титул так і буде переходити від попередньої до наступної.
Анонімні гілки
Ті гілки-бранчі, які ми розглядали минулого разу насправді є лише окремим випадком гілок (іменовані гілки). Крім них, можливі і анонімні гілки.
Анонімну гілка створити простіше простого (настільки просто, що можна створити випадково, коли вона і не потрібна). Відкотимося на попередню ревізію і продовжимо розробку паралельно вже зробленому.
Зверніть увагу: «created new head». Тепер у 0-й ревізії відразу дві ревізії-нащадка, а у них самих нащадків немає - вони обидві голови:
У нас утворилося дві гілки розробки (при тому, що branch як і раніше один - default). У цих гілках можна продовжувати паралельну розробку (голова кожної гілки буде переходити до наступних ревізій), можна плодити ще гілки, ну і найприємніше: гілки можна зливати разом.
Ми злили дві гілки (об'єднали дві голови в одну). Тепер обидві попередні голови є предками нової ревізії, яка і стала нашої поточної єдиною головою.
Зауважте, що у ревізії може бути не більше двох предків, тобто злити одночасно можна тільки дві голови. Так як у нас тільки дві голови і було, то нам вистачило виклику hg merge без параметрів. Якщо ж голів було б більше, довелося б точно вказувати яку з них слід злити з поточної.
Іменовані гілки (branches)
Тепер подивимося на branch'і новим поглядом.
Створимо для тестів новий репозиторій:
Зробимо пару комита в default-гілка:
А тепер відгалузилося гілка «one» і туди ще парочку.
Перевіримо, що у нас з гілками і головами:
От халепа, гілки у нас тепер дві, а голова все одна.
Ревізія # 1, яка є останньою в галузі default і, на перший погляд, повинна бути її головою, насправді їй бути не може. Просто тому, що вона має нащадка (ревізію # 2, нехай вона і з іншої гілки). Таким чином, галузь default взагалі залишилася без голови і позначена в списку, як (inactive).
Так приробити їй голову! Спочатку повернемося в default-гілку:
Зверніть увагу на те, чому ці гілки називаються «іменованими». «Ім'я» default тут просто є синонімом останньої ревізії з відповідною гілки. Тобто, ми могли рівно з тим же успіхом написати hg update 1.
Ми створили голову в гілці default (created new head).
Перевіримо, що вийшло
Тепер є дві голови, а default стала повноцінною гілкою.
Замість hg merge one я випендритися і написав hg merge 3 з тим, щоб знову вказати на те, що one. це всього лише «іменування» ревізії # 3 (останньої в іменованої гілці one).
Голови злилися в одну. Так як ми «вливали» гілку one в гілку default. голова ця належить default. Гілка one. таким чином, залишилася взагалі без голови і стала inactive.
Гілки з подветви
Для трохи кращого розуміння (або остаточного заплутування), розглянемо наступне перекручення:
Мало того, що тут у нас дві іменовані гілки, так ще й в кожної з них, по дві анонімні. Тобто в підсумку, у нас 4 голови (# 3, # 4, # 5 і № 6).
Отже, питання, на що вказують імена default і test. Відповідь: вони вказують на останні ревізії в своїх гілках (відповідно, # 5 і № 6). Це видно в списку гілок:
В яку ревізію будуть вливатися зміни при merge. В ту, в якій перебуваємо. Перейдемо в # 4 і смержімся з test.
І що у нас вийшло? А вийшло ось що:
Пішла тільки одна голова (# 6) і одна голова змінила ревізію (# 4 → 7). Всі інші залишилися, в тому числі і одна з голів гілки test. за рахунок чого, та продовжує бути активною.
Можна зробити ще багато подібних безглуздих речей ...