Vorwort
Mir ist klar, dass es bereits viele Fragen zum Zusammenführen von SVN-Zweigen in Stack Overflow gibt. Ich habe viele von ihnen gelesen, habe aber immer noch nicht die Informationen gefunden, die ich suche. Bitte lesen Sie diese Frage vollständig durch, bevor Sie vorschlagen, sie als Duplikat zu schließen.
Ich muss einen SVN-Zweig in einen anderen zusammenführen. Ich bin ziemlich vertraut mit der Theorie der Verzweigung und Verschmelzung, aber ich habe mich immer mit der Praxis beschäftigt, die Zusammenführung durchzuführen, genauer gesagt, Konflikte zu identifizieren und zu lösen. Ich vermute, dass die Hauptursache für dieses Problem ein mangelndes Verständnis der für die Ausführung der Aufgabe erforderlichen Tools ist, nämlich TortoiseSVN und die verschiedenen Tools zur visuellen Zusammenführung, die verfügbar sind.
Gestützt auf das Lesen verschiedener verwandter Stack Overflow-Fragen habe ich Sourcegear DiffMerge und Beyond Compare als Kandidaten für die Durchführung der dreifachen Zusammenführung. Ich habe DiffMerge ausprobiert, aber ich hatte Mühe, es effektiv zu nutzen. Ich erwartete, die folgenden drei Dateien während der Konfliktlösung zu sehen
Aber was ich stattdessen sehe, ist
Das brachte mich dazu, mich zu fragen, wie ich das Ergebnis der Zusammenführung nach jeder Aktion sehen kann, die ich bei der visuellen Lösung von Konflikten mache. Ich habe auch darum gekämpft, eine solche Aktion durchzuführen, zum Beispiel eine bestimmte Änderung von Zweig A oder B zu akzeptieren. Nachdem ich etwas mehr über das Thema gelesen habe, scheint es nun, dass die Basisrevision tatsächlich der Ort ist, an dem die Ergebnisse der Zusammenführung erscheinen sollte gezeigt werden, ist das richtig?
Ich denke, ein Screencast- oder Video-Tutorial, das die Verschmelzung von Zweigen mit TortoiseSVN und einem visuellen Merge-Tool demonstriert, würde wahrscheinlich die meisten meiner offenen Fragen zur effektiven Verwendung dieser Tools beantworten. Ich interessiere mich mehr für das Lösen von Konflikten, die die Zusammenführung selbst durchführen, aber es wäre großartig, wenn beide abgedeckt wären.
Tatsächlich gibt es Zweiwege- und Dreiwege-Merging-Tools. Ein Zweiweg sollte drei Fenster zeigen. Die Quellzweigversion A, die Zielzweigversion B und ein Ergebnis der Zusammenführung. Bei einer Dreierzusammenführung wird zusätzlich die Basisversion angezeigt. Sie können sich eine dreifache Art der Verschmelzung als Ergebnisgleichung = Ziel + (Basis - Quelle) vorstellen. Tatsächlich berechnet der Algorithmus eine Menge von Diffs zwischen Basis und Quelle und eine andere Menge zwischen Basis und Ziel und streicht dann alle Diffs aus, die beiden gemeinsam sind. Dann zeigt es Ihnen eine Liste der verbleibenden Diffs zur Entscheidung. Bei Diffs in Quelle oder Ziel, bei denen derselbe Codeabschnitt in der anderen Verzweigung nicht betroffen ist, wird automatisch die Verwendung des entsprechenden Diffs vorgezogen. Wenn sich die Diffs in beiden Zweigen im selben Codeabschnitt befinden, werden die Diffs als Konflikt markiert und Ihr Werkzeug führt Sie normalerweise nacheinander durch die Konflikte. Konflikte werden nicht vorab festgelegt und der Code wird erst dann in der Ergebnisdatei angezeigt, wenn Sie eine Entscheidung treffen. Sie erhalten die Option, zum nächsten Diff oder zum nächsten Konflikt zu springen. Alle Konflikte müssen von Ihnen entschieden werden. Basierend auf Ihren Kenntnissen möchten Sie manchmal sogar nicht konfligierende Diff zurücksetzen (neu entscheiden), um die Zusammenführung abzuschließen.
Der Prozess der Zusammenführung einer Datei geht also im Grunde durch diffs oder nur durch konfligierende Diffs nacheinander und entscheidet, ob Quellverzweigung, Zielverzweigung oder der betreffende Code bearbeitet werden soll, um eine neue zu erstellen fusionierte Änderung. Die Änderungen, die Sie vornehmen, sollten im Ergebnisfenster angezeigt werden. Sobald Sie alle Konflikte festgelegt haben, sollte das Tool das Speichern des Ergebnisses ermöglichen, das dann zu einer neuen Version im Zielzweig wird. Das Fenster mit der Basisdatei wird normalerweise nur für eine Referenz als Version angezeigt, die weder eine Quell- noch eine Zieländerung aufweist.
Einige Tools ermöglichen eine automatische Zusammenführung. Falls es keine widersprüchlichen Diffs gibt, verwendet das Tool die vorher festgelegte Diff-Auflösung, ohne Ihnen irgendwelche Fragen zu stellen. Nehmen Sie alle Änderungen von Quell- und Zielzweig automatisch vor. Obwohl diese Änderungen lexikalisch nicht in Konflikt stehen, können sie auf andere Weise Konflikte verursachen. Der resultierende Code wird möglicherweise nicht kompiliert oder logisch korrekt. Aber kein Merge-Tool kann das entscheiden. Aus diesem Grund sollten Merge-Ergebnisse von einem Menschen gelesen und überprüft und dann kompiliert und durch eine Testsuite durchlaufen werden, bevor sie in den Zielzweig übernommen werden.
Sie können KDiff3 installieren, um eine dreifache Zusammenführung mit TortoiseSVN durchzuführen. Es integriert sich automatisch mit TortoiseSVN auf der Windows-Plattform.
Die drei Dateien, die Sie sehen, sind gemeinsame Vorfahren beider Zweige, Datei von Zweig A und Datei von Zweig B. Sie lösen die Konflikte dann in der Datei, die den Zweig darstellt, den Sie mit TO verbinden.
Ich finde, dass es ein sehr intelligentes Werkzeug ist und im Normalfall automatisch die richtige Option zum Zusammenführen einfacher Konflikte auswählt.
Wenn es nicht sicher ist, werden Sie gefragt, was zu tun ist.
Ich habe gelegentlich Probleme gehabt, wo es falsch herum gewählt hat. Das waren Gelegenheiten, bei denen der Zweig- / Zusammenführungspfad jedoch ziemlich komplex war.
Und wie GrayWizard sagt, ist es manchmal einfacher, die rohe Datei zu betrachten. Subversion wird eine einzelne Raw-Datei in dem Zweig, mit dem Sie zusammenführen, mit einem Markup versehen, um Ihnen zu zeigen, welche Änderungen von welcher Revision stammen. Ich musste ein- oder zweimal diese Datei in meiner IDE öffnen und von dort aus reparieren.
Perforce hatte ein Merge-Tool, das Ihnen alle vier Versionen (Basis, A, B und merge) und würde Ihnen visuell zeigen, wie Ihre Zusammenführung aussehen würde.
Bei komplexen Zusammenführungen finde ich es tatsächlich hilfreich, nur die rohe Datei zu betrachten (vorausgesetzt, es sind keine Byte-Daten) und die Revisionsstücke selbst zu vergleichen. Wenn Ihre Zusammenführung sehr kompliziert ist (überlappende Zusammenführungen, verschobener Code usw.), ist dies möglicherweise die einzige Möglichkeit.
Eine andere Sache, die ich gesehen habe, ist, eine Kopie des Arbeitssatzes zu exportieren und dann mit einem Side-by-Side-Werkzeug manuell zusammenzuführen (wie Beyond Compare ) und dann einfach direkt einchecken.
Das einzige, was mich immer an Fusionen geweckt hat, war, dass sie von dem, was ich erwartet hatte, rückwärts waren. Das hat mir immer Probleme mit der Basisrevision bereitet.
Tags und Links merge diff svn branch tortoisesvn