Konsekwencje zastosowania przeszczepu w Mercurialu

98

Ostatnio pojawiło się kilka pytań dotyczących pomijania zmian podczas utrzymywania gałęzi wydań w Mercurial. Na przykład:

Odkąd został wprowadzony w 2.0, zastanawiałem się nad użyciem, graftaby uniknąć tego problemu. Biorąc pod uwagę takie drzewo wersji:

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

Załóżmy, że musimy stworzyć gałąź wydania, która pomija zmianę Zła E.

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

dając nam:

A---B---C---D---E---F---G---H---I---J
             \
              --F'--G'--H'--I'--J'
  • P1: Co się tutaj właśnie stało? Rozumiem, transplantże wygenerowałoby to łatki z F::J, a następnie zastosowałoby je D, ale graftmówi się, że używa raczej trójdrożnego scalania niż łat. Więc ....... jak to działa? Dlaczego to jest lepsze?

Powiedzmy, że teraz naprawię Ei połączę to z moją gałęzią wydania.

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

M1 to proste scalanie; nic specjalnego. M2 łączy oddziały, które mają "te same" (lub przynajmniej równoważne) zmiany.

  • Q2: Czy to scalanie tylko normalny 3-way Scalanie użyciu D, J'i M1?
  • P3: Czy firma Mercurial przechowała / wykorzystała dodatkowe informacje o operacji przeszczepu, aby pomóc jej w połączeniu?

I w końcu...

  • P4: Jakie są potencjalne problemy z takim przepływem?
Paul S.
źródło

Odpowiedzi:

119

Podczas aktualizacji Di przeszczepiania F::JMercurial wykonuje wiele połączeń. Zacznie się od tego scalenia:

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

Jeśli napiszemy +ddla delty między stanami Ca D, to zaczynamy od:

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

Obróć wykres o 90 stopni w prawo, a powyższe trójdrożne scalenie wygląda następująco:

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

Oznacza to, że udajemy, że zaczęliśmy Ei zastosowaliśmy przeciwieństwo, -eaby dostać się do D. Myślę o odwrotnej łatce +e. Zaczynając Erównież przeszliśmy do stanu Fz normalną deltą +f. Nie ma tu nic dziwnego - mamy wszystkie stany ( D, E, i F) w repozytorium już. W ten sposób widać, że możemy połączyć Di F.

Łączenie się to kwestia „ukończenia diamentu”. Więc znaleźć nowy stan M, który jest mieszanką Di Fi gdzie różnica w stosunku Ddo Mjest podobna do +fa różnica od Fcelu Mjest podobny do -e. To wygląda tak:

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

+fDelta się +f'i -edelta stała -e'. To tylko zwykłe trójstronne scalanie, ale efekt jest interesujący: zastosowaliśmy się Fdo Dzamiast E!

Po scaleniu drugi element nadrzędny Mdo Fjest usuwany:

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

Powtórzę: skopiowaliśmy „efekt” Fna D, to znaczy znaleźliśmy delta ( +f'), która zastosowana Ddaje taki sam efekt, jak przy +fzastosowaniu do E. Możemy nieco wyprostować wykres, aby uzyskać:

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

Rezultat jest taki, że Fzostaje wszczepiony Dprzy użyciu pełnej trójdrożnej maszyny.

  • P1: Co się tutaj właśnie wydarzyło? Więc ....... jak to działa? Dlaczego to jest lepsze?

    Odp .: Używanie scalania jest lepsze niż poprawek, ponieważ mechanizm scalający bierze pod uwagę takie rzeczy, jak zmiany nazw.

  • P2: Czy to scalanie jest zwykłym 3-drogowym scalaniem przy użyciu D, J 'i M1?

    A2: Tak, przeszczep nie zmienia topologii wykresu.

  • P3: Czy firma Mercurial zapisała / wykorzystała dodatkowe informacje o operacji przeszczepienia, aby pomóc jej w połączeniu?

    A3: Nie.

  • P4: Jakie są potencjalne problemy z takim przepływem?

    A4: Z punktu widzenia scalania powinno działać dobrze. To powieli historię, która może być myląca dla ludzi.

Martin Geisler
źródło
4
Świetne pytanie, świetna odpowiedź :). +1 do obu!
Laurens Holst
Dzięki Martin. To całkiem fajne myślenie tego, kto to wymyślił. Mam pomysł, ale muszę wypracować ogólny przypadek. Zgaduję, że zachowuje się niezależnie od ścieżki między węzłami, do / z których przeszczepisz?
Paul S
3
@PaulS: Myślę, że wszystko, co musisz wiedzieć, to to, że przeszczep może kopiować zestawy zmian w bardziej solidny sposób niż przeszczep. Solidne w tym sensie, że zmiana nazw jest obsługiwana, a konflikty można rozwiązywać w narzędziu scalającym. Szczegóły są w dziwnych połączeniach, które robi, ale mam nadzieję, że nie jest to niezbędne do zrozumienia dla codziennego użytku przeszczepu! :-)
Martin Geisler
3
Nie, ale jestem frajerem, próbując zrozumieć rzeczy, których nie potrzebuję ;-) Pracowałem nad bardziej ogólnym przykładem, używając twojego jako podstawy.
Paul S
@PaulS Jeśli tak, to prawie boję się wam o tym wspomnieć ... ale możesz sprawdzić Darcs i jego teorię łatek. Powyższa sztuczka dotycząca obracania wykresu o 90 stopni przypomina mi wiele o tym, jak mówią o dojeżdżaniu do pracy podczas łączenia. Całkiem włochate rzeczy :-)
Martin Geisler
6

P1: Pomaga, gdy są konflikty. Możesz wtedy użyć zwykłego narzędzia do scalania (dla mnie są to wbudowane znaczniki konfliktów, które edytuję w trybie smerge-mode Emacsa).

P2: To normalne scalanie.

P3: Nie.

P4: Myślę, że brzydko jest mieć dwie prawie identyczne gałęzie.

Dzwonienie
źródło