Folgen der Verwendung von Transplantaten in Mercurial

98

In letzter Zeit gab es mehrere Fragen zum Überspringen von Änderungen beim Verwalten von Release-Zweigen in Mercurial. Beispielsweise:

Seit es in 2.0 eingeführt wurde, habe ich mich gefragt, ob ich graftdieses Problem vermeiden soll. Bei einem Revisionsbaum wie diesem:

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

Angenommen, wir müssen einen Release-Zweig erstellen, der die Evil-Änderung überspringt E.

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

geben uns:

A---B---C---D---E---F---G---H---I---J
             \
              --F'--G'--H'--I'--J'
  • Q1: Was ist gerade hier passiert? Ich kann verstehen, dass transplantPatches daraus generiert F::Jund dann angewendet wurden D, aber es graftwird gesagt, dass die 3-Wege-Zusammenführung anstelle von Patches verwendet wird. Also ....... wie funktioniert das? Warum ist es besser?

Nehmen wir an, ich behebe das Problem jetzt Eund füge es in meinen Release-Zweig ein.

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

M1 ist eine gerade Verschmelzung; nichts besonderes da. M2 führt Zweige zusammen, bei denen "die gleichen" (oder zumindest gleichwertigen) Änderungen vorgenommen wurden.

  • Q2: Ist das merge nur eine normale 3-Wege - Zusammenführung mit D, J'und M1?
  • F3: Hat Quecksilber zusätzliche Informationen über die Transplantatoperation gespeichert / verwendet, um die Zusammenführung zu erleichtern?

Und schlussendlich...

  • F4: Was sind die potenziellen Probleme bei einem solchen Fluss?
Paul S.
quelle

Antworten:

119

Beim Aktualisieren Dund Transplantieren F::Jführt Mercurial eine Reihe von Zusammenführungen aus. Es beginnt mit dieser Zusammenführung:

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

Wenn wir +dfür das Delta zwischen den Zuständen Cund schreiben D, beginnen wir mit:

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

Drehen Sie das Diagramm um 90 Grad im Uhrzeigersinn, und die obige Drei-Wege-Zusammenführung sieht folgendermaßen aus:

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

Das heißt, so tun wir , dass wir mit gestartet Eund angewandt , um das Gegenteil von dem -ezu bekommen D. Ich denke an den umgekehrten Patch von +e. Ab in haben Ewir auch Fdas normale Delta angegeben +f. Hier gibt es nichts seltsam - wir alle Staaten haben ( D, E, und F) im Repository bereits. So gesehen ist es klar, dass wir zusammenführen können Dund F.

Beim Zusammenführen geht es darum, "den Diamanten zu vervollständigen". Wir finden also einen neuen Zustand M, der eine Mischung aus Dund ist, Fin dem der Unterschied von Dzu Mähnlich ist +fund der Unterschied von Fzu Mähnlich ist -e. Es sieht aus wie das:

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

Das +fDelta wurde +f'und das -eDelta wurde -e'. Dies ist nur ein normaler Drei-Wege - Merge, aber die Wirkung ist interessant: wir angewandt haben , Fauf Dstatt E!

Nach dem Zusammenführen wird das zweite übergeordnete Element von Mto Fgelöscht:

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

Um es noch einmal zu wiederholen: Wir haben den "Effekt" von Fauf kopiert D, dh wir haben ein Delta ( +f') gefunden, das angewendet wurde, Dum den gleichen Effekt zu erzielen, als wenn +fes angewendet wurde E. Wir können das Diagramm ein wenig begradigen, um Folgendes zu erhalten:

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

Das Ergebnis ist, dass mit der vollständigen Drei-Wege-Maschine Faufgepfropft wird D.

  • Q1: Was ist gerade hier passiert? Also ....... wie funktioniert das? Warum ist es besser?

    A1: Die Verwendung von Zusammenführungen ist besser als Patches, da die Zusammenführungsmaschinerie Dinge wie Umbenennungen berücksichtigt.

  • F2: Ist diese Zusammenführung nur eine normale 3-Wege-Zusammenführung mit D, J 'und M1?

    A2: Ja, das Pfropfen ändert nichts an der Topologie des Diagramms.

  • F3: Hat Quecksilber zusätzliche Informationen über die Transplantatoperation gespeichert / verwendet, um die Zusammenführung zu erleichtern?

    A3: Nein.

  • F4: Was sind die potenziellen Probleme bei einem solchen Fluss?

    A4: Aus Sicht der Zusammenführung sollte es in Ordnung funktionieren. Es wird eine Geschichte duplizieren, die für die Menschen verwirrend sein könnte.

Martin Geisler
quelle
4
Tolle Frage, tolle Antwort :). +1 für beide!
Laurens Holst
Danke Martin. Das ist ein ziemlich flippiges Denken von jedem, der sich das ausgedacht hat. Ich habe die Idee, muss aber den allgemeinen Fall klären. Ich vermute, es gilt unabhängig vom Pfad zwischen den Knoten, zu denen Sie transplantieren.
Paul S
3
@PaulS: Ich denke, alles, was Sie wissen müssen, ist, dass Transplantate Änderungssätze robuster kopieren können als Transplantate. Robust in dem Sinne, dass Umbenennungen behandelt werden und Sie Konflikte in einem Zusammenführungstool lösen können. Die Details sind in den seltsamen Zusammenführungen enthalten, aber das ist hoffentlich nicht unbedingt zu verstehen für den täglichen Gebrauch von Transplantaten! :-)
Martin Geisler
3
Nein, aber ich bin ein Trottel, wenn ich versuche, Dinge zu verstehen, die ich nicht brauche ;-) Ich habe ein allgemeineres Beispiel durchgearbeitet, das dein Beispiel sowieso als Basis verwendet.
Paul S
@PaulS Wenn ja, dann habe ich fast Angst, Ihnen das zu sagen ... aber Sie können Darcs und seine Patch-Theorie nachschlagen . Der obige Trick, das Diagramm um 90 Grad zu drehen, erinnert mich sehr daran, wie sie beim Zusammenführen über das Pendeln von Patches sprechen. Ziemlich haariges Zeug :-)
Martin Geisler
6

Q1: Es hilft, wenn es Konflikte gibt. Sie können dann Ihr übliches Zusammenführungswerkzeug verwenden (für mich sind es Inline-Konfliktmarkierungen, die ich im Emmer-Smerge-Modus bearbeite).

F2: Es ist eine normale Zusammenführung.

Q3: Nein.

F4: Ich finde es hässlich, zwei fast identische Zweige zu haben.

Klingeln
quelle