Die internen Datenmodelle unterscheiden sich grundlegend.
Grundsätzlich sehen Sie in SVN, wenn Sie sich die Geschichte eines Zweigs ansehen, nur, was in diesem Zweig passiert ist. Wenn Sie also von Zweig B
zu Zweig zusammenführen A
, enthält der Zweigverlauf A
ein großes Commit, das alle Änderungen enthält , die seit der Verzweigung explizit vorgenommen wurden B
.
In den ersten SVN-Versionen mussten Sie, wenn Sie Zweig erneut B
in Zweig zusammenführen A
mussten, manuell angeben, welcher Versionsbereich des Zweigs B
zusammengeführt werden soll, um zu vermeiden, dass dieselben Versionen zweimal zusammengeführt werden. Der clevere Entwickler würde natürlich eine Commit-Nachricht wie "Merged in B: 1234" verwenden.
SVN 1.5 "reparierte" dies. Die grundsätzliche Anwendung von Zusammenführungen hat sich jedoch nicht geändert. Der Verzweigung A
wurden lediglich einige zusätzliche Metadaten hinzugefügt , sodass SVN wusste, dass die Revision 1234 zusammengeführt wurde, und SVN automatisch den richtigen Revisionsbereich auswählte.
Diese Lösung ist jedoch im Grunde eine Problemumgehung für ein Datenmodell, das das Verfolgen von Zusammenführungen im Grunde nicht unterstützt.
Das Zusammenführen zweier Zweige ist ein relativ einfaches Beispiel. Aber dieses komplexere Szenario abbilden
- Erstellen Sie eine Verzweigung
A
von trunk
und machen Sie hier einige Festschreibungen
- Erstellen Sie einen Zweig
B
von A
und machen Sie hier ein paar Commits
- Machen Sie ein paar Commits in
trunk
undA
- Zusammenführen
B
intrunk
- Zusammenführen
A
inB
- Zusammenführen
A
intrunk
- Zusammenführen
B
in trunk
(dies sollte eigentlich nichts bewirken)
Der richtige Umgang mit dem Metadatenmodell wird äußerst komplex (ich weiß nicht, ob SVN dieses Szenario tatsächlich richtig handhabt, und ich bin nicht geneigt, es auszuprobieren).
Die Handhabung dieses Szenarios in Git ist äußerst einfach.
In git enthält das interne Objekt, das dieses Commit darstellt, bei jedem Commit einen Verweis auf den vorherigen Head. Wenn Sie in einem Zweig zusammenführen, enthält das Festschreiben Verweise auf den vorherigen Kopf aller zusammengeführten Zweige (Sie können mehrere Zweige gleichzeitig in git zusammenführen).
Wenn Sie also den Verlauf eines einzelnen Commits in git untersuchen, können Sie den gesamten Verlauf, den Zeitpunkt der Verzweigung und den Zeitpunkt der Zusammenführung sowie den Verlauf beider Verzweigungen zwischen der Verzweigung und der Zusammenführung anzeigen.
Wenn Sie also in einem Zweig zusammenführen, der teilweise zusammengeführt wurde, können Sie ganz einfach feststellen, was bereits zusammengeführt wurde und was nicht.
Ich habe keine Erfahrung mit Mercurial, aber ich vermute, dass seine internen Abläufe git ähnlich sind.
Grundsätzlich war es für SVN ein Designziel, die Verzweigung billig zu machen. Aber in git war es ein gestalterisches Ziel, das Zusammenführen billig zu machen.
Das letzte Mal, als ich SVN verwendet habe, war es nicht in der Lage, Zusammenführungen zu verarbeiten, bei denen eine Datei in einem Zweig umbenannt und in einem anderen geändert wurde.