2010-10-02 8 views
32

Ich arbeite an einem Projekt, bei dem ich ein Commit habe, das ein Feature mit großen Problemen einführte, die nicht sofort entdeckt wurden. Jetzt möchte ich diese Revision komplett entfernen, während ich die Arbeit nachbearbeite, aber es fällt mir schwer, meinen Kopf um diesen 3-Weg-Merge zu wickeln. Hier ist eine vereinfachte Grafik meines Projekts.Wie funktioniert die 3-Wege-Funktion in Mercurial/Meld?

 
o changeset: 134:7f81764aa03a 
| tag:   tip 
| parent:  128:451d8a19edea 
| summary:  Backed out changeset 451d8a19edea 
| 
| @ changeset: 133:5eefa40e2a29 
| | summary:  (Change I need to keep keep) 
| | 
*snip 3 commits* 
| o changeset: 129:5f6182a97d40 
|/ summary:  (Change I need to keep keep) 
| 
o changeset: 128:451d8a19edea 
| summary:  (Change that introduced a major problem) 
| 
o changeset: 127:4f26dc55455d 
| summary:  (summary doesn't matter for this question) 

Wenn ich das richtig verstehe, sind r127 und r134 genau gleich. Wenn ich hg up -C -r 133 und dann hg merge ausführen, erscheint Meld mit drei Formen einer meiner Dateien: lokal, Basis und andere. lokal scheint r133 zu sein, aber ich habe eine harte Zeit, meinen Kopf darum zu wickeln, was "Basis" und "andere" bedeuten.

Antwort

34

Lokale ist R133

Andere r134 ist

Basis ist r128 (der gemeinsame Vorfahr sowohl R133 und r 134)

Wenn Sie einen 3-Wege führen fusionieren es vergleicht alle drei zusammen, um Ihnen zu helfen, zu entscheiden, was Sie wann und von wo mitnehmen möchten. Wenn Sie sehen, was sich in der anderen Revision verändert und wie der gemeinsame Vorfahr aussieht, können Sie eine viel fundiertere Entscheidung darüber treffen, was Sie behalten und was Sie ändern möchten.

+0

Sie sagen also, dass viel manuelle Zusammenführung sein wird? – Pacerier

10

Ihre Frage ist wirklich verwirrend, aber hier sind einige Informationen, die Ihnen helfen können.

  • Was ist Basis?
  • Basis ist die unmodifizierte Version der Revision, die Sie gerade ausgecheckt und bearbeitet haben. wo möglicherweise andere Änderungen abgeklungen sind (Sie können Revisionen zwischen Ihrer aktuellen lokalen und Basis haben!). es ist nur wo die nächste Revision, wo keine andere Gabel nachher abgezweigt hat (gleiches Elternteil) (in Ihrem Fall r128)

  • Was ist Kopf?

Head ist die neueste Version der Versionskontrolle. Wenn Sie alleine an nur einer Kopie arbeiten, wird es wahrscheinlich Basis sein. aber ein Kollege könnte die gleiche Datei modifiziert und in die Versionskontrolle eingecheckt haben, dann ist der Kopf später als Ihre Basis.

  • Was ist lokal?

Local ist die geänderte Version (in Ihrem Fall R133)

  • Was andere ist?

Andere ist die einige Gabel/Zweig, der auch Ihre Basis als Elternteil (in Ihrem Fall r134)

  • Wie funktioniert 3-Wege-Merge-Arbeit?

3-Wege-Zusammenführung funktioniert (zumindest in Meld) hierarchisch.in der Regel von links nach rechts wie folgt aus:

local> Basis> Sonstiges/Kopf

local/Basis ist meist trivial, weil ihr genau das, was Sie

modifizierte

dann können Sie Ihre Änderungen in den Kopf Revision fusionieren oder der einer deiner Mitarbeiter oder was auch immer.

Es kann mehrere andere/Kopf-Revisionen geben, aber dann ist es nicht Ihre Aufgabe zu integrieren und daher mehr als 3-Wege-Vergleich macht keinen Sinn.

+12

Ihre Definition von Kopf ist nicht genau für mercurial. Die neueste Version von mercurial heißt "tip". Eine Spitze ist immer ein Kopf, aber ein Kopf ist nicht immer eine Spitze. In einer Zusammenführung ist "Kopf" niemals "Basis", da die Basis der letzte gemeinsame Vorfahre der beiden Änderungsmengen ist. –