Наслідки використання трансплантата в Меркуріалі


98

Останнім часом виникає кілька запитань про пропуск змін при збереженні гілок випуску в Mercurial. Наприклад:

Оскільки він був представлений в 2.0, я задумався про те, graftщоб уникнути цієї проблеми. З огляду на таке дерево перегляду:

A---B---C---D---E---F---G---H---I---J

Припустимо, нам потрібно створити гілку випуску, яка пропускає зміну Evil E.

hg update -r D
hg graft "F::J"

даючи нам:

A---B---C---D---E---F---G---H---I---J
             \
              --F'--G'--H'--I'--J'
  • Q1: Що тільки що сталося тут? Я можу зрозуміти, що transplantгенерував би патчі F::J, а потім застосував їх D, але, graftяк кажуть, використовує 3-бічне злиття, а не патчі. Отже ....... як це працює? Чому краще?

Скажемо, я зараз виправляю Eта об’єдную це у свою гілку випуску.

                  --E2-----------------
                 /                     \
A---B---C---D---E---F---G---H---I---J---M1
             \                            \
              --F'--G'--H'--I'--J'---------M2--

М1 - пряме злиття; нічого особливого там немає. M2 - це об'єднання гілок, на яких "однакові" (або принаймні еквівалентні) зміни.

  • Q2: Чи є це злиття лише звичайним тристороннім злиттям D, J'і M1?
  • Q3: Чи зберігала / використовувала додаткова інформація про операцію з трансплантатом, яка допомагає їй у злитті?

І, нарешті...

  • Q4: Які потенційні проблеми з таким потоком?

Відповіді:


119

Під час оновлення до Dта прищеплення F::JMercurial виконує ряд об'єднань. Почнеться з цього злиття:

M = three_way_merge(local=D, other=F, base=E)

Якщо ми пишемо +dдля дельти між державами Cі D, тоді почнемо з:

        +d     +e     +f
---- C ---- D ---- E ---- F ----

Поверніть графік на 90 градусів за годинниковою стрілкою, і вищевказане тристороннє злиття виглядає так:

    -e  
  .---- D
 /
E
 \
  '---- F
    +f

Тобто ми робимо вигляд, що ми почали з того, Eі застосували навпаки, -eщоб потрапити D. Я думаю, як зворотний пластир +e. Починаючи у Eми також поїхали до стану Fз нормальною дельтою +f. Там немає нічого дивного тут - у нас є все держави ( D, Eі F) в сховище вже. Так побачене так, зрозуміло, що ми можемо злитися Dі F.

Злиття - це питання "заповнення алмазу". Таким чином , ми знаходимо новий стан , Mяке є поєднанням Dі Fі де різниця від Dдо Mаналогічна +fі різниця від Fдо Mаналогічна -e. Це виглядає приблизно так:

    -e     +f'
  .---- D ----.
 /             \
E               M
 \             /
  '---- F ----'
    +f     -e'

+fДельта стала +f'і -eдельта стала -e'. Це просто звичайне трьоходове злиття, але ефект цікавий: ми застосували Fна Dзамість E!

Після злиття, то другий з батьків Mдо Fвідкидається:

    -e     +f'
  .---- D ----.
 /             \
E               M
 \
  '---- F
    +f

Повторююсь: ми скопіювали "ефект" Fна D, тобто ми знайшли дельта ( +f'), яка застосовується для Dотримання того ж ефекту, що і коли +fбуло застосовано E. Ми можемо трохи випрямити графік, щоб отримати:

       +f'
--- D ---- M
     \
      '---- E ---- F
        +e     +f

В результаті цього Fприщеплюється Dза допомогою повноцінної триходової техніки.

  • Q1: Що тільки що сталося тут? Отже ....... як це працює? Чому краще?

    А1: Використання злиття краще, ніж виправлення, оскільки техніка об'єднання враховує такі речі, як перейменування.

  • Q2: Чи є це злиття лише звичайним тристороннім злиттям, використовуючи D, J 'і M1?

    A2: Так, щеплення не змінює топологію графіка.

  • Q3: Чи зберігала / використовувала додаткова інформація про операцію з трансплантатом, яка допомагає їй у злитті?

    A3: Ні.

  • Q4: Які потенційні проблеми з таким потоком?

    A4: З точки зору злиття це повинно працювати добре. Це повторить деяку історію, яка може заплутати людей.


4
Чудове запитання, чудова відповідь :). +1 обом!
Лорен Холст

Дякую, Мартіне. Це якесь досить прикольне мислення, хто б це не придумав. У мене є ідея, але потрібно опрацювати загальну справу. Я здогадуюсь, що це має значення незалежно від шляху між вузлами, на які ви щеплете?
Пол S

3
@PaulS: Я думаю, що все, що вам потрібно знати, - це те, що трансплантат може копіювати набори змін навколо більш надійним способом, ніж трансплантація. Надійна в тому сенсі, що перейменування обробляються і що ви можете вирішити конфлікти в інструменті злиття. Деталі знаходяться в дивних злиттях, але це, сподіваємось, не суттєво зрозуміти для щоденного використання трансплантата! :-)
Мартін Гейслер

3
Ні, але я приборщик для спроб зрозуміти речі, які мені не потрібно ;-) Я працював над більш загальним прикладом, використовуючи ваш як-небудь базу.
Пол S

@PaulS Якщо так, то я майже боюся згадати це про вас ... але ви можете шукати Дарка та його теорії патчів. Наведений вище трюк щодо обертання графіка на 90 градусів дуже нагадує мені, як вони говорять про виправлення патчів під час об'єднання. Досить волохата штука :-)
Мартін Гейслер

6

Q1: Це допомагає, коли виникають конфлікти. Тоді ви можете використовувати свій звичайний інструмент злиття (для мене це вбудовані маркери конфлікту, які я редагую у режимі смерти Emacs).

Q2: Це звичайне злиття.

Q3: Ні.

Q4: Я думаю, що це некрасиво мати дві майже однакові гілки.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.