Wenn Zweige für verschiedene Entwicklungslinien verwendet werden, werden Sie an einem bestimmten Punkt die Änderungen die Sie in einem Zweig gemacht haben wieder mit dem Stamm zusammenführen wollen, oder umgekehrt.
Es ist wichtig zu verstehen, wie Verzweigen und Zusammenführen in Subversion funktioniert bevor Sie es benutzen, denn es kann unter Umständen sehr komplex werden. Wir empfehlen Ihnen, das Kapitel Branching and Merging des Subversion Buchs zu lesen. Dieses Kapitel beschreibt ausführlich das Verzweigen und Zusammenführen und gibt auch einige Beispiele, wie man diese Werkzeuge am besten benutzt.
Der nächste wichtige Punkt ist, dass Zusammenführen immer in der Arbeitskopie stattfindet. Wenn Sie Änderungen in einem Zweig zusammenführen möchten, müssen Sie eine Arbeitskopie für diesen Zweig auschecken und den Assistenten mittels → in dieser Arbeitskopie aufrufen.
Es ist grundsätzlich eine gute Idee, Revisionen in einer unmodifizierten Arbeitskopie zusammenzuführen. Wenn Ihre Arbeitskopie Änderungen enthält, übertragen Sie diese zuerst. Falls nämlich das Zusammenführen nicht zu dem von Ihnen gewünschten Ergebnis führt, und sie die Änderungen Rückgängig machen, wird dieser Befehl alles, inklusive Ihrer eigenen Änderungen verwerfen.
Es gibt drei Anwendungsfälle für das Zusammenführen, welche, wie weiter unten beschrieben, ein wenig unterschiedlich gehandhabt werden. Die erste Seite des Assistenten fragt Sie nach der gewünschten Methode.
Diese Methode wird benutzt wenn Sie Änderungen an einem Zweig (branch) oder Stamm (trunk) der Entwicklung gemacht haben und diese nun mit einem anderen Zweig (bzw. Stamm) zusammenführen möchten.
Damit weisen Sie Subversion an, folgendes zu tun: „Berechne die Änderungen, die nötig sind um von Revision X des Zweiges A zu Revision Y des Zweiges A zu gelangen und wende diese Änderungen auf meine Arbeitskopie (von Stamm oder Zweig B) an.“
Diese Methode behandelt den Fall dass Sie einen Funktionszweig, wie im Subversion Buch behandelt, angelegt haben. Alle Änderungen am Stamm wurden Woche für Woche mit dem Zweig zusammengeführt, und nun möchten Sie, da die Funktion im Zweig fertig ist, diese wieder im Stamm zusammenführen. Weil Sie den Funktionszweig immer mit dem Stamm synchronisiert haben, sind die letzten Versionen des Funktionszweiges und des Stammes, mit Ausnahme der auf dem Funktionszweig implementierten Neuerungen identisch.
Hierbei handelt es sich um einen Spezialfall des weiter unten beschriebenen Zusammenführens von Bäumen. Es wird als Quelle nur die URL des Entwicklungsszweiges benötigt. Die Funktion verwendet die Protokollierung der Datenintegration, um die korrekten Revisionsbereiche zu ermitteln und führt zusätzlich Überprüfungen durch ob der Zweig mit allen Änderungen aus dem Stamm zusammengeführt wurde. Dadurch wird sichergestellt, dass Sie nicht versehentlich Änderungen von anderen zurücknehmen, die seit Ihrer letzten Synchronisation mit dem Stamm übertragen wurden.
Nach dem Zusammenführen ist der Funktionszweig komplett in die Hauptentwicklungslinie zurückgeführt worden. Der Zweig ist nun überflüssig und kann gelöscht werden.
Sobald Sie einen Zweig wieder eingegliedert haben, sollten Sie ihn nicht mehr für die Weiterentwicklung nutzen. Der Grund ist, dass wenn Sie ihren existierenden Zweig später mit dem Stamm synchronisieren wollen, die Änderungsverfolgung ihre Wiedereingliederung als Änderung am Stamm sieht, die noch nicht in den Zweig übertragen wurde und versucht, die Zweig nach Stamm Integration zurück in den Zweig zu integrieren! Die Lösung für dieses Problem besteht darin, für die nächste Phase der Weiterentwicklung einen neuen Zweig vom Stamm aus anzulegen.
Dies ist ein allgemeinerer Fall des wieder Eingliederns eines Zweiges. Damit weisen Sie Subversion an, folgendes zu tun: „Berechne die Änderungen, die nötig sind um von der HEAD Revision des Stammes zur HEAD Revision des Zweiges zu gelangen und wende diese Änderungen auf meine Arbeitskopie (des Stammes) an.“ Das Ergebnis ist, dass der Stamm danach exakt wie der Zweig aussieht.
Falls Ihr Server oder das Projektarchiv die Protokollierung der Datenintegration nicht unterstützen, ist das die einzige Methode mit der Sie einen Zweig in den Stamm zurückintegrieren können. Ein anderer Anwendungsfall tritt auf, wenn Sie mit Herstellerzweigen arbeiten und die Änderungen aufgrund einer neuen Auslieferung in Ihrem Stamm zusammenführen müssen. Für weiterführende Informationen lesen Sie bitte das Kapitel vendor branches im Subversion Buch.
Im Von: Feld geben Sie die URL des Zweiges an, der die Änderungen enthält welche Sie mit der Arbeitskopie zusammenführen möchten. Sie können auch auf klicken, um den gewünschten Zweig zu finden. Wenn Sie bereits Änderungen aus diesem Zweig zusammengeführt haben, finden Sie den Namen in der Liste der bereits benutzten URLs.
Geben Sie den zusammenzuführenden Revisionsbereich in das Feld Revisionsbereich ein. Das kann eine einzelne Revision, eine durch Kommata getrennte Liste von Revisionen, ein durch Bindestrich getrennter Revisionsbereich oder eine Kombination aus allem sein.
Es gibt einen wichtigen Unterschied in der Spezifikation von Revisionsbereichen, wie sie in TortoiseSVN und und im Kommandozeilenclient verwendet werden. Am einfachsten stellt man sich das als einen Zaun mit Pfählen und Brettern dazwischen vor.
Mit dem Kommandozeilenclient legt man die Revisionen der zusammenzuführenden Bereiche als „Zaunpfähle“ fest, die die Punkte davor und danach festlegen.
Mit TortoiseSVN legen Sie die zusammenzuführenden Änderungen als „Zaunbretter“ fest. Der Grund dafür wird deutlich, wenn Sie den Log-Dialog verwenden, um die Revisionen festzulegen, in dem jede Revision als ein Satz von Änderungen erscheint.
Wenn Sie Revisionen in Blöcken zusammenführen, würde die Methode im Subversion Buch sie zunächst 100-200 und danach 200-300 zusammenführen lassen. Mit TortoiseSVN sind es zunächst 100-200 und dann 201-300.
Dieser Unterschied hat zu hitzigen Diskussionen auf der Mailingliste geführt. Wir räumen ein, dass es einen Unterschied zum Kommandozeilenclient gibt, aber wie sind davon überzeugt, dass die von uns implementierte Methode für die mehrzahl der GUI Anwender einfacher zu verstehen ist.
Der einfachste Weg um den Revisionsbereich zu wählen, ist ein Klick auf . Dies zeigt Ihnen die letzten Änderungen inklusive der Logmeldungen an. Wenn Sie nur die Änderungen einer einzelnen Revision benötigen, wählen Sie die gewünschte Revision. Wenn Sie einen Revisionsbereich benötigen, wählen Sie diesen mit gedrückter Umsch Taste aus. Klicken Sie auf und die Liste der zusammenzuführenden Revisionsnummern wird für Sie ausgefüllt.
Wenn Sie bereits übertragene Änderungen rückgängig machen wollen, erreichen Sie das, indem Sie den gewünschten Revisionsbereich Rückwärts zusammenführen. Dadurch werden die Änderungen dieses Revisionsbereichs aus Ihrer Arbeitskopie entfernt.
Wenn Sie bereits Änderungen aus diesem Zweig zusammengeführt haben, so haben Sie hoffentlich auch in der Logmeldung notiert, welche Revisionen das waren. In diesem Fall können Sie einfach mit Hilfe der Schaltfläche nachschauen. Verwenden Sie die Endrevision des letzten Zusammenführens als Startrevision der geplanten Aktion. Wenn Sie zum Beispiel zuletzt die Revisionen 37 bis 39 mit Ihrer Arbeitskopie zusammengeführt haben, sollte die Startrevision für die aktuelle Aktion 40 sein.
Neuere Versionen von Subversion protokollieren die bisher durchgeführten Datenintegrationen mit. Deshalb müssen Sie sich nicht merken, welche Revisionen Sie bereits zusammengeführt haben. Wenn Sie den Revisionsbereich leer lassen, werden alle bisher noch nicht integrierten Revisionen ausgewählt. Lesen Sie in „Verfolgung der Datenintegration“ wie das funktioniert.
Falls außer Ihnen noch andere Personen Daten in das Projektarchiv übertragen, seien Sie vorsichtig mit der Verwendung der HEAD Revision. Diese entspricht eventuell nicht der Revision die Sie erwarten, weil seit Ihrer letzten Aktualisierung jemand anderes Daten übertragen haben könnte.
Klicken Sie auf und gehen Sie zu „Optionen beim Zusammenführen“
Um einen Funktionszweig mit dem Stamm zusammenzuführen, müssen Sie den Assistenten aus einer Arbeitskopie des Stammes heraus aufrufen
Im Von: Feld geben Sie die vollständige URL des Zweiges an, den Sie zurückintegrieren möchten. Sie können auch auf klicken um die URL besser zu finden.
Um einen Zweig wieder Eingliedern zu können, müssen einige Bedingungen erfüllt sein. Zunächst muss der Server die Verfolgung der Datenintegration unterstützen. Die Tiefe der Arbeitskopie muss unendlich sein (keine dünn besetzte Arbeitskopie) und sie darf weder lokalen Änderungen noch Objekte auf einer anderen URL oder einer anderen Revision als HEAD enthalten. Alle Änderungen am Stamm während der Entwicklung des Zweiges müssen in den Zweig übertragen worden sein (oder als übertragen markiert worden sein). Der Bereich der zusammenzuführenden Revisionen wird dann automatisch berechnet.
Um mit dieser Methode einen Funktionszweig mit dem Stamm zusammenzuführen, müssen Sie den Assistenten aus einer Arbeitskopie des Stamms starten.
Im Von: Feld geben Sie die URL des Stammes (trunk) an. Dies mag Ihnen jetzt vielleicht falsch vorkommen, aber bedenken Sie dass der Stamm der Ausgangspunkt ist von dem aus Sie die Änderungen des Funktionszweiges zusammenführen möchten. Sie können auch auf klicken um die URL besser zu finden.
Im Bis: Feld geben Sie die vollständige URL des Zweiges an.
Sowohl im Von Revision Feld als auch im Bis Revision Feld geben Sie die letzte Revision an in der die beiden Zweige synchron waren. Wenn Sie sicher sind dass niemand anders seit Ihrer letzten Synchronisation eine Übertragung gemacht hat, können Sie in beiden Feldern die HEAD Revision angeben. Falls jedoch in der Zwischenzeit die Möglichkeit einer Übertragung besteht, geben Sie die letzte Revision Ihrer Synchronisation an.
Sie können auch auf klicken, um die Revision zu wählen.
Auf dieser Seite des Assistenten können Sie weitere Optionen angeben, bevor Sie das Zusammenführen starten. In den meisten Fällen können Sie die Standardeinstellungen verwenden.
Sie können die Tiefe für das Zusammenführen festlegen, das heißt, wie weit das Zusammenführen in Ihre Arbeitskopie herabsteigen soll. Die Tiefendefinitionen sind in „Rekursionstiefe“ beschrieben. Die Vorgabe ist Arbeitskopie, was den aktuell eingestellten Wert verwendet und meistens korrekt sein wird.
Meistens möchten Sie, dass die Vergangenheit von Dateien berücksichtigt wird, so dass Änderungen relativ zu einem gemeinsamen Vorgänger zusammengeführt werden. Manchmal möchten Sie aber auch Dateien zusammenführen, zwischen denen eine Beziehung besteht - allerdings nicht in Ihrem Projektarchiv. Sie haben zum Beispiel Versionen 1 und 2 einer externen Bibliothek in zwei verschiedene Verzeichnisse importiert. Obwohl zwischen diesen ein logischer Zusammenhang besteht, weiß Subversion nichts davon, weil es nur die separat importierten Dateibäume sieht. Wenn Sie versuchen, die Unterschiede zwischen den beiden Versionen zusammenzuführen, werden Sie ein vollständiges Entfernen gefolgt von einem vollständigen Hinzufügen erhalten. Damit Subversion nur pfadbasierte Differenzen anstelle von vergangenheitsbasierten Differenzen erzeugt, wählen Sie die Vorfahren ignorieren Option. Weitere Informationen zu diesem Thema finden Sie im Subversion Buch in Noticing or Ignoring Ancestry
Sie können festlegen, wie Änderungen an Zeilenumbrüchen und Leerzeichen behandelt werden sollen. Diese Optionen sind in „Zeilenende- und Leerzeichenoptionen“ beschrieben. Die Vorgabe ist, dass alle Zeilenenden- und Leerzeichenänderungen als echte, zusammenzuführende Änderungen behandelt werden.
Die Option Zusammenführen erzwingen dient dazu, Baumkonflikte zu vermeiden, wenn durch ein eingehendes Löschen eine veränderte oder nicht versionierte lokale Datei betroffen ist. Falls dadurch die Datei gelöscht wird, kann sie im Ursprungszustand nicht wieder hergestellt werden, weshalb die Option standardmäßig deaktiviert ist.
Falls Sie Ihre Datenintegrationsschritte verfolgen und eine Revision als zusammengeführt markieren wollen, ohne die Daten wirklich zusammenzuführen, aktivieren Sie die Option Zusammenführen nur aufzeichnen. Es gibt mehrere Gründe, dies zu tun. Zum Beispiel könnten die zusammenzuführenden Änderungen zu komplex für den Algorithmus sein, so dass Sie die Daten von Hand integrieren und die Revisionen als zusammengeführt markieren, damit die Änderungsverfolgung darüber informiert ist. Oder Sie möchten verhindern, dass eine bestimmte Revision zusammengeführt werden kann. Clients die die Verfolgung der Datenintegration bereits beherrschen, werden diese Revision dann überspringen.
Nun, da alles vorbereitet ist, müssen Sie nur noch auf klicken. Falls Sie eine Vorschau der Ergebnisse wünschen, können Sie einen durchführen, der das Zusammenführen lediglich simuliert und die Arbeitskopie nicht verändert. Eine Liste der veränderten Dateien und der eventuell resultierenden Konflikte wird angezeigt. Da die Protokollierung der Datenintegration das Zusammenführen weiter verkompliziert, gibt es kein sicheres Verfahren, im Vorhinein festzustellen, wo Konflikte auftreten. Dadurch kann es vorkommen das beim Trockenlauf als konfliktbehaftet markierte Dateien sich in Wirklichkeit problemlos zusammenführen lassen.
Der Fortschrittsdialog zeigt nun jeden Schritt des Zusammenführens mit den betroffenen Revisionen an. Eventuell wird hier eine Revision mehr, als von Ihnen erwartet, angezeigt. So wird zum Beispiel, falls Sie die Revision 123 zusammenführen, im Fortschrittsdialog „Zusammenführen von Revisionen 122 bis 123“ angezeigt. Das Zusammenführen ist mit dem Vergleichen verwandt. Der Prozess erzeugt eine Liste von Änderungen zwischen zwei Punkten im Projektarchiv und wendet diese Änderungen auf Ihre Arbeitskopie an. Der Fortschrittsdialog zeigt lediglich den Start- und Endpunkt der Differenzbildung an.
Das Zusammenführen ist nun beendet. Es ist eine gute Idee, wenn Sie sich das Ergebnis anschauen und prüfen, ob es Ihren Erwartungen entspricht. Datenintegration ist normalerweise eine komplizierte Sache. Konflikte können auftreten, wenn der Zweig sich zu weit vom Stamm entfernt hat.
Bei Subversion Clients vor Version 1.5 müssen Informationen über zusammengeführte Revisionen von Hand protokolliert werden. Wenn Sie die Änderungen überprüft haben und diese nun übertragen möchten, beachten Sie dass die Logmeldung dieser Übertragung immer die bereits zusammengeführten Revisionsnummern enthalten sollte. Wenn Sie später erneut Revisionen zusammenführen möchten/müssen werden Sie froh sein zu wissen, was alles Sie bereits zusammengeführt haben und was nicht. Denn wenn Sie eine Revision ein weiteres Mal zusammenführen, würde dies zwingend zu einem Konflikt führen. Für genauere Informationen lesen Sie bitte Best Practices for Merging im Subversion Buch.
Wenn Ihr Server und alle Clients unter Subversion 1.5 oder neuer laufen, wird die Protokollierung der Datenintegration sämtliche zusammengeführten Revisionen aufzeichnen und verhindern, dass eine Revision mehr als einmal integriert wird. Das vereinfacht Ihre Arbeit ungemein, da sie nun jedes Mal den gesamten Revisionsbereich wählen können und sichergestellt ist, dass nur neue Revisionen wirklich zusammengeführt werden.
Das Verwalten von Zweigen ist wichtig. Falls Sie Ihren Zweig stets mit dem Stamm synchron halten wollen, stellen Sie sicher, dass Sie Änderungen häufig zusammenführen, damit Stamm und Zweig nicht zu weit auseinanderdriften. Wie bereits erklärt sollten Sie wiederholtes Zusammenführen der gleichen Änderungen vermeiden.
Wenn Sie gerade einen Funktionszweig in den Stamm integriert haben, enthält der Stamm nun sämtliche neuen Funktionen. Der Zweig ist nunmehr überflüssig und kann deshalb gelöscht werden.
Subversion kann keine Datei mit einem Ordner zusammenführen und umgekehrt - nur Ordner mit Ordner und Dateien mit Dateien können zusammengeführt werden. Wenn Sie auf eine Datei klicken um den Zusammenführen-Dialog zu öffnen, müssen Sie eine URL zu einer Datei angeben, wenn Sie auf einen Ordner klicken um den Zusammenführen-Dialog zu öffnen müssen Sie für den Vorgang eine URL zu einem Ordner angeben.
Mit Subversion 1.5 wurden Möglichkeiten zur Verfolgung der Datenintegration eingeführt. Wenn Sie Änderungen von einem Baum in einem anderen zusammenführen, werden die entsprechenden Revisionsnummern gespeichert. Diese Information kann für weitere Zwecke herangezogen werden.
Sie können vermeiden, dass eine Revision mehrfach integriert wird. Sobald eine Revision als bereits zusammengeführt markiert ist, werden zukünftige Datenintegrationen diese Revision überspringen.
Wenn Sie einen Zweig in den Stamm zurückintegrieren, kann Ihnen der Log-Dialog die Übertragungen des Zweiges im Log des Stamms anzeigen und Ihnen damit die Verfolgung der Änderungen vereinfachen.
Wenn Sie den Log-Dialog aus dem Zusammenführen-Dialog heraus aufrufen, werden bereits zusammengeführte Revisionen in grau angezeigt.
Wenn Sie die Annotierungen für eine Datei anzeigen, können Sie sich den Originalautor der Änderungen anstelle des Autors, der die Änderungen zusammengeführt hat, anzeigen lassen.
Sie können Revisionen als nicht zusammenführbar markieren, indem Sie diese in die Liste der bereits zusammengeführten Revisionen aufnehmen, ohne das Zusammenführen tatsächlich anzustoßen.
Die zusammengeführten Revisionen und Pfade werden durch den Subversion Client beim Zusammenführen in der svn:mergeinfo Eigenschaft abgespeichert. Sobald die Änderungen übertragen wurden, speichert der Server sie in einer Datenbank. Falls jetzt Logdaten, Annotierungen oder Zusammenführen angefordert werden, kann der Server entsprechend reagieren. Damit das System korrekt arbeitet, müssen Sie sicherstellen, dass der Server, das Projektarchiv und alle Clients aktualisiert werden. Ältere Clients füllen die svn:mergeinfo nicht aus und ältere Server beantworten die Anfragen neuerer Clients nicht.
Lesen Sie mehr über die Verfolgung der Datenintegration in Subversions Merge tracking documentation.
Zusammenführen geht nicht immer glatt. Manchmal gibt es einen Konflikt, und wenn Sie mehrere Bereiche zusammenführen, möchten Sie normalerweise die Konflikte auflösen, bevor Sie den nächsten Bereich angehen. TortoiseSVN hilft Ihnen durch diesen Prozess, indem es den Der Rückfrage-Dialog für Konflikte anzeigt.
Es ist wahrscheinlich, dass sich einige der Änderungen reibungslos zusammenführen ließen, während andere lokale Änderungen mit Änderungen, die bereits im Repository sind, kollidieren. Konfliktfreie Änderungen werden immer zusammengeführt. Der Konfliktdialog bietet Ihnen drei verschiedene Arten, die in Konflikt stehen Zeilen zu behandeln.
Lokal bevorzugen wird die lokalen Änderungen in jedem Konflikt auswählen. Ebenso werden bei Projektarchiv bevorzugen die Änderungen des Projektarchivs in jedem Konflikt ausgewählt. Das klingt einfach, aber die Konflikte betreffen häufig mehr Zeilen als Sie vermuten und Sie werden möglicherweise unerwartete Ergebnisse erhalten.
Normalerweise werden Sie die Konflikte selbst ansehen und beseitigen wollen. In diesem Fall wählen Sie , wodurch Ihr Konflikteditor gestartet wird. Sobald Sie mit dem Ergebnis zufrieden sind, wählen Sie .
Die letzte Option ist, das Auflösen der Konflikte zu verschieben und mit dem Zusammenführen fortzufahren. Sie können das für die aktuelle Datei oder für alle weiteren Dateien beim Zusammenführen festlegen. Wenn es jedoch weitere Änderungen in dieser Datei gibt, können Sie das Zusammenführen nicht abschließen.
Wenn Sie den interaktiven Rückfrage-Dialog nicht benutzen wollen, können sie die Funktion über die Option Nicht interaktiv zusammenführen im Fortschrittsdialog abschalten. Sobald der Dialog deaktiviert ist, werden Dateien mit Konfliken beim Zusammenführen markiert und Sie müssen die Konflikte auflösen nachdem das gesamte Zusammenführen beendet ist. Wenn das interaktive Zusammenführen aktiv ist, erhalten Sie die Gelegenheit, einen Konflikt während des Zusammenführens aufzulösen, bevor die Datei als konfliktbehaftet markiert wird. Dadurch können, wenn mehrere zusammenzuführende Revisionen nacheinander auf eine Datei angewendet werden, spätere Aktionen erfolgreich sein. Aber leider können Sie in diesem Fall nicht weggehen, um sich einen Kaffee zu holen während das Zusammenführen läuft.
Wenn Sie sämtliche Änderungen des Zweiges, an dem Sie gerade arbeiten in den Stamm, zurück übertragen möchten, können Sie → aus dem erweiterten Kontextmenü aufrufen (Halten Sie die Umsch Taste gedrückt, währen Sie einen Rechtsklick auf die Datei machen).
Dieser Dialog ist sehr einfach. Sie müssen lediglich die in „Optionen beim Zusammenführen“ beschriebenen Optionen einstellen. Der Rest wird mit Hilfe der protokollierten Integrationen automatisch von TortoiseSVN erledigt.
Wenn Sie eine neue Funktion in einem separaten Zweig entwickeln, ist es eine gute Idee, sich rechtzeitig eine Richtlinie zu überlegen, wie diese Funktion in die Hauptentwicklungslinie zurückintegriert wird. Falls gleichzeitig in trunk weiter entwickelt wird, können die Unterschiede mit der Zeit bedeutend werden und die Rückintegration zu einem Alptraum machen.
Falls die Funktion relativ einfach ist und keine längere Zeit in Anspruch nehmen wird, können Sie den einfachen Ansatz wählen und auf dem Zweig so lange separat entwickeln, bis die Funktion komplett ist und dann zurück integrieren. Im Assistenten wäre dies eine einfache Einen Revisionsbereich zusammenführen Aktion, mit dem Revisionsbereich des Zweiges als Parameter.
Falls die Entwicklung länger dauern wird und Sie Änderungen in trunk berücksichtigen müssen, sollten Sie den Zweig synchron halten. Das bedeutet dass Sie periodisch Änderungen an trunk in den Zweige integrieren, so dass der Zweig alle Änderungen an trunk plus die neue Funktion enthält. Beim Synchronisationsvorgang verwenden Sie Einen Revisionsbereich zusammenführen. Sobald die Funktion komplett ist, können Sie die Änderungen entweder per Einen Zweig wieder Eingliedern oder Zwei verschiedene Bäume zurück integrieren.