Zusammenführen

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 TortoiseSVNZusammenführen... 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.

Einen Revisionsbereich zusammenführen

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.

Einen Zweig erneut zusammenführen

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.

Zusammenführen zweier Bäume

Dies ist ein allgemeinerer Fall der erneuten Integration 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.

Einen Revisionsbereich zusammenführen

Abbildung 5.35. Der Assistent - Revisionsbereich wählen

Der Assistent - Revisionsbereich wählen


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.

Der einfachste Weg um den Revisionsbereich zu wählen, ist ein Klick auf Zeige Log. 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 OK 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 Zeige Log 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 39 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 Weiter und gehen Sie zu „Optionen beim Zusammenführen“

Einen Zweig erneut zusammenführen

Abbildung 5.36. Der Assistent - Zweig erneut zusammenführen

Der Assistent - Zweig erneut 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 erneut zusammenführen, 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 besiedelte 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.

Zusammenführen zweier Bäume

Abbildung 5.37. Der Assistent - Zusammenführen von Bäumen

Der Assistent - Zusammenführen von Bäumen


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 Zeige Log klicken, um die Revision zu wählen.

Optionen beim Zusammenführen

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.

Falls Sie Ihre Datenintegrationsschritte verfolgen und eine Revision als zusammengeführt markieren wollen, ohne die Daten wirklich zusammmenzuführen, markieren Sie 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 Zusammenführen klicken. Falls Sie eine Vorschau der Ergebnisse wünschen, können Sie einen Trockenlauf 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.

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.

Ergebnisse des Zusammenführens betrachten

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 Verfolgen von Verzweigungen 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.

Tipp

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.

Wichtig

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.

Verfolgung der Datenintegration

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 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.

Behandeln von Konflikten beim Zusammenführen

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.

Abbildung 5.38. Der Rückfrage-Dialog für Konflikte

Der Rückfrage-Dialog für Konflikte


Wenn beim Zusammenführen ein Konflikt auftritt, haben Sie drei Möglichkeiten diesen aufzulösen:

  1. Sie können entscheiden, dass Ihre lokalen Änderungen wichtiger sind und die Version aus dem Projektarchiv verwerfen, um die lokale Version zu behalten. Oder sie verwerfen Ihre lokalen Änderungen zugunsten der Serverversion. Welche Option Sie auch immer wählen, es werden nie Daten zusammengeführt - Sie erhalten eine der beiden Dateien.

  2. Normalerweise werden Sie die Konflikte ansehen und beseitigen wollen. In diesem Fall wählen Sie Konflikt bearbeiten, wodurch Ihr Konflikteditor gestartet wird. Sobald Sie mit dem Ergebnis zufrieden sind, wählen Sie Aufgelöst.

  3. 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.

Alle Änderungen zusammenführen

Wenn Sie sämtliche Änderungen des Stammes in den Zweig, an dem Sie gerade arbeiten, übertragen möchten, können Sie TortoiseSVNAlle Zusammenführen aus dem erweiterten Kontextmenü aufrufen (Halten Sie die Umsch Taste gedrückt, währen Sie einen Rechtsklick auf die Datei machen).

Abbildung 5.39. Der Dialog Alle zusammenführen

Der Dialog Alle zusammenführen


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 diese Funktion verwenden wollen, müssen Sie sicherstellen, dass alle Clients die Protokollierung der Datenintegration unterstützen. Andernfalls kann die Aufzeichnung unvollständig sein. Falls der Server diese Funktion nicht unterstützt, wird das Zusamenstellen der Informationen sehr langsam sein.