Frage

Ich habe für eine Weile mit Mercurial, und es gibt eine „Tatsache“, die viele Male gegeben.

In der Tat, es traf mich, während ein Video von FogCreek gestern beobachtet, Dieses Video: Fog Creek Kiln. Entsperren die Macht der DVCS für Ihr Unternehmen , dass es scheint etwas zu sein, das hier für mich nicht funktioniert

Um etwa 01.39 in diesem Video und weiter macht es einen Punkt, zu sagen, dass, während andere Versionskontrollsysteme Titel Revisionen (dh. Snapshots) DVCS‘wie Mercurial Spur Changesets (dh., Was zwischen den Schnappschüssen passiert ist.)

Das gibt ihnen einen Vorteil bei der Zusammenführung Szenarien, und dann zeigt es ein Beispiel. Wenn Sie eine Funktion in einem Zweig bewegen, und die gleiche Funktion in einem anderen Zweig ändern, Mercurial ist in der Lage, das fusionieren.

Und ich habe dies an anderer Stelle erwähnt gesehen, obwohl ich nicht jetzt keine direkten Links finden kann.

Dies scheint nicht zu Arbeit für mich.


Edit: Dies ist ein Problem mit dem Standard "beyondcompare3" Merge-Tool-Konfiguration für TortoiseHg. Ich fügte hinzu, die Konfiguration unter meiner Mercurial.ini-Datei, und jetzt funktioniert es wie erwartet. Sicher, es wird auf das GUI-Tool Punt, wenn es nicht AutoMerge kann, aber jetzt ist die Serie in dieser Frage hier beschriebene läuft ohne Eingabeaufforderungen und tut genau das Richtige aus dem Kasten

[ui]
merge = bc3

[merge-tools]
bc3.executable = C:\Program Files (x86)\Beyond Compare 3\bcomp.exe
bc3.args = $local $other $base $output /automerge /reviewconflicts /closescript
bc3.priority = 1
bc3.premerge = True
bc3.gui = True

Um dies zu testen, begehen ich diese Datei in ein Repository:

void Main()
{
    Function1();
    Function2();
}

public void Function1()
{
    Debug.WriteLine("Function 1");
    for (int index = 0; index < 10; index++)
        Debug.WriteLine("f1: " + index);
}

public void Function2()
{
    Debug.WriteLine("Function 1");
}

Dann in zwei verschiedenen parallelen Differenzmengen aus diesem einer Verzweigung, ich habe die folgenden zwei Änderungen vor:

  1. zog ich die Function1 Funktion zum Ende der Datei
  2. Ich habe die Nachricht innerhalb Function1

ich fusionieren dann versucht, und Mercurial gibt mir ein merge Konflikt Fenster zu Figur auszuprobieren, was ich tat.

Im Grunde ist es versucht, den Text in Function2 zu ändern, die nun in der Lage ist, dass Function1 war, bevor es verschoben wurde.

Das sollte nicht passieren!


Hier ist die Quelldateien für mein Beispiel reproduzieren:

Batch-Datei zur Herstellung Repository:

@echo off

setlocal

if exist repo rd /s /q repo
hg init repo
cd repo

copy ..\example1.linq example.linq
hg commit -m "initial commit" --addremove --user "Bob" --date "2010-01-01 18:00:00"

copy ..\example2.linq example.linq
hg commit -m "moved function" --user "Bob" --date "2010-01-01 19:00:00"

hg update 0
copy ..\example3.linq example.linq
hg commit -m "moved function" --user "Alice" --date "2010-01-01 20:00:00"

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

Example1.linq:

<Query Kind="Program" />

void Main()
{
    Function1();
    Function2();
}

public void Function1()
{
    Debug.WriteLine("Function 1");
    for (int index = 0; index < 10; index++)
        Debug.WriteLine("f1: " + index);
}

public void Function2()
{
    Debug.WriteLine("Function 1");
}

Example2.linq:

<Query Kind="Program" />

void Main()
{
    Function1();
    Function2();
}

public void Function2()
{
    Debug.WriteLine("Function 1");
}

public void Function1()
{
    Debug.WriteLine("Function 1");
    for (int index = 0; index < 10; index++)
        Debug.WriteLine("f1: " + index);
}

Example3.linq:

<Query Kind="Program" />

void Main()
{
    Function1();
    Function2();
}

public void Function1()
{
    Debug.WriteLine("Function 1b");
    for (int index = 0; index < 10; index++)
        Debug.WriteLine("f1: " + index);
}

public void Function2()
{
    Debug.WriteLine("Function 1");
}
War es hilfreich?

Lösung

Nun, Sie derzeit eine der Begrenzung, trifft grundsätzlich alle aktuellen VCS (DVCS oder nicht, es spielt keine Rolle).

Die Sache ist die, dass VCS ist derzeit sprachunabhängig, die Basis ihres Merge-Algorithmus eine textuelle diff ist. Es bedeutet, dass sie suchen, was ändern und was ist der Zusammenhang mit Kontext .
Der wichtige Teil hier ist der Kontext. Es ist nichts mehr, dass einige Zeilen vor und nach den Änderungen.

Das bedeutet, dass sie wirklich schlecht sind mit Code Umorganisation innerhalb einer gleichen Datei zu tun, weil Sie im Grunde all das Kontext Aufschrauben können sie sich verlassen.
Typischerweise in Ihrem Beispiel, indem Sie die beiden Funktionen Schalten Sie nicht nur vollständig den Zusammenhang zwischen den beiden Differenzmengen invertiert, aber noch schlimmer, indem nach der letzten Funktion keine zusätzlichen Leitungen, reduziert Sie implizit den Kontext der letzten Änderung, würden dadurch die Chancen dass ein Merge-Algorithmus bekam der Lage, herauszufinden, was Sie wirklich getan hat.

Ich weiß momentan nur etwa ein Diff-Tool, von MSFT, für XML, die mit dem semantischen Ihrer Änderung und nicht nur seine Textdarstellung zu behandeln versucht.
Ich weiß auch, dass die Jungs von PlasticSCM versuchen, eine solche Funktion für einige Mainstream-Sprachen zu implementieren, aber es ist wirklich ein Ort, wo es Raum für Verbesserungen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top