Mercurial merge awesomeness - was fehlt mir?

8

Ich habe Mercurial eine Weile benutzt, und es gibt eine "Tatsache", die oft gegeben wird.

In der Tat hat es mich getroffen, als ich gestern ein Video von Fogcreek gesehen habe, dieses Video: Fog Creek Kiln: Schalte die Macht frei von DVCS für deine Firma , dass da etwas zu sein scheint, was bei mir nicht funktioniert.

Bei etwa 1:39 in diesem Video und darüber hinaus heißt es, dass während andere Versionskontrollsysteme Revisionen (dh Snapshots) verfolgen, DVCS 'wie Mercurial Track Changesets (dh was zwischen den Snapshots passiert ist.)

Dies gibt ihnen einen Vorteil bei der Zusammenführung von Szenarien und zeigt dann ein Beispiel. Wenn Sie eine Funktion in einem Zweig verschieben und dieselbe Funktion in einem anderen Zweig ändern, kann Mercurial diesen zusammenführen.

Und ich habe gesehen, dass das anderswo erwähnt ist, obwohl ich keine direkten Verbindungen jetzt finden kann.

Das scheint bei mir nicht zu funktionieren.

Bearbeiten: Dies ist ein Problem mit der standardmäßigen Merge-Tool-Konfiguration "beyond compare3" für TortoiseHg. Ich habe die Konfiguration unten zu meiner Mercurial.ini-Datei hinzugefügt, und jetzt funktioniert es wie erwartet. Sicher, es wird an das GUI-Tool gesendet, wenn es nicht automatisch ausgeführt werden kann, aber jetzt läuft die in dieser Frage beschriebene Zusammenführung ohne Eingabeaufforderungen und macht einfach das Richtige aus der Box

%Vor%

Um dies zu testen, habe ich diese Datei an ein Repository übergeben:

%Vor%

Dann habe ich in zwei verschiedenen parallelen Änderungssätzen, die von dieser Verzweigung ausgehen, die folgenden zwei Änderungen vorgenommen:

  1. Ich habe die Function1-Funktion an den unteren Rand der Datei verschoben
  2. Ich habe die Nachricht in Function1
  3. geändert

Ich habe dann versucht zu verschmelzen, und Mercurial gibt mir ein Merge-Konflikt-Fenster und versucht herauszufinden, was ich getan habe.

Im Grunde versucht es den Text in Funktion2 zu ändern, der jetzt in der Position ist, in der sich Funktion1 befand, bevor sie verschoben wurde.

Das sollte nicht passieren!

Hier sind die Quelldateien zum Reproduzieren meines Beispiels:

Batch-Datei zur Erstellung des Repositorys:

%Vor%

Die 3 Versionen der Datei, example1.linq, example2.linq und example3.linq:

Beispiel1.linq:

%Vor%

Beispiel2.linq:

%Vor%

Beispiel3.linq:

%Vor%     
Lasse Vågsæther Karlsen 17.11.2010, 10:05
quelle

1 Antwort

7

Nun, Sie treffen momentan eine der Einschränkungen von, im Prinzip, JEDEM aktuellen VCS (DVCS oder nicht, spielt keine Rolle).

Die Sache ist, dass VCS derzeit sprachunabhängig sind, die Basis ihres Merge-Algorithmus ist ein Text-Diff. Es bedeutet, dass sie danach suchen, was sich ändern lässt und was der zugehörige Kontext ist.
Der wichtige Teil hier ist der Kontext. Es ist nichts mehr, dass einige Zeilen vor und nach den Änderungen, die Sie vorgenommen haben.

Das bedeutet, dass sie wirklich schlecht im Umgang mit der Code-Neuorganisation innerhalb einer Datei sind, weil Sie im Grunde alle Kontexte verarbeiten, auf die sie sich verlassen können.
In Ihrem Beispiel haben Sie in Ihrem Beispiel durch den Wechsel der beiden Funktionen nicht nur den Kontext zwischen den beiden Changesets komplett invertiert, sondern noch schlimmer, da Sie nach der letzten Funktion keine zusätzlichen Zeilen mehr haben, haben Sie implizit den Kontext der letzten Änderung reduziert und die Chancen verringert dass ein Merge-Algorithmus herausfinden konnte, was Sie wirklich gemacht haben.

Ich kenne derzeit nur ein Diff-Tool von msft für XML, das versucht, mit der Semantik Ihrer Änderung und nicht nur mit ihrer textlichen Darstellung umzugehen.
Ich weiß auch, dass die Jungs von PlasticSCM versuchen, solche Features für einige Mainstream-Sprachen zu implementieren, aber es ist wirklich ein Ort, an dem es Raum für Verbesserungen gibt.

    
gizmo 17.11.2010, 10:30
quelle