In Subversion (und CVS) ist das Repository in erster Linie. In Git und Mercurial gibt es nicht wirklich das Konzept eines Repository auf die gleiche Weise; Hier stehen Veränderungen im Mittelpunkt.
+1
Der Aufwand bei CVS / SVN beruht auf der Tatsache, dass sich diese Systeme nicht
an die Elternschaft von Änderungen erinnern. In Git und Mercurial kann ein Commit nicht nur mehrere Kinder haben, sondern auch mehrere Eltern!
Dies kann leicht mit einem der grafischen Werkzeuge gitk
oder beobachtet werden hg
view
. Im folgenden Beispiel wurde Zweig Nr. 2 bei Festschreibung A von Nr. 1 gegabelt und wurde seitdem einmal zusammengeführt (bei M, zusammengeführt mit Festschreibung B):
o---A---o---B---o---C (branch #1)
\ \
o---o---M---X---? (branch #2)
Beachten Sie, wie A und B zwei Kinder haben, während M zwei Eltern hat . Diese Beziehungen werden im Repository aufgezeichnet . Angenommen, der Betreuer von Zweig Nr. 2 möchte jetzt die neuesten Änderungen von Zweig Nr. 1 zusammenführen. Er kann einen Befehl wie den folgenden ausgeben:
$ git merge branch-1
und das Tool erkennt automatisch, dass die Basis B ist - da sie in Commit M, einem Vorfahren der Spitze von # 2, aufgezeichnet wurde - und dass alles, was zwischen B und C passiert ist, zusammengeführt werden muss. CVS zeichnet diese Informationen nicht auf , noch SVN vor Version 1.5. In diesen Systemen würde der Graph folgendermaßen aussehen:
o---A---o---B---o---C (branch #1)
\
o---o---M---X---? (branch #2)
wobei M nur ein gigantisches "gequetschtes" Commit von allem ist, was zwischen A und B passiert ist, das auf M angewendet wird. Beachten Sie, dass nach Abschluss der Tat keine Spur mehr übrig ist (außer möglicherweise in von Menschen lesbaren Kommentaren), wo M. stammte nicht davon, wie viele Commits zusammengebrochen waren, was die Geschichte viel undurchdringlicher machte.
Noch schlimmer ist, wird ein zweite merge Durchführung ein Albtraum: ein , was die Zusammenführung Basis zum Zeitpunkt der ersten Zusammenführung war , um herauszufinden , hat (und man hat zu wissen ,
dass es eine Zusammenführung in erster Linie gewesen!), Dann vorhanden , dass Informationen an das Tool, damit es nicht versucht, A..B über M wiederzugeben. All dies ist schwierig genug, wenn Sie in enger Zusammenarbeit arbeiten, aber in einer verteilten Umgebung einfach unmöglich.
Ein (verwandtes) Problem ist, dass es keine Möglichkeit gibt, die Frage zu beantworten: "Enthält X B?" Dabei ist B eine potenziell wichtige Fehlerbehebung. Warum also nicht einfach diese Informationen im Commit aufzeichnen, da sie zum Zeitpunkt der Zusammenführung bekannt sind ?
P.-S. - Ich habe keine Erfahrung mit SVN 1.5+ Merge-Aufnahmefähigkeiten, aber der Workflow scheint viel ausgefeilter zu sein als in den verteilten Systemen. Wenn dies tatsächlich der Fall ist, liegt dies wahrscheinlich daran, dass - wie im obigen Kommentar erwähnt - der Fokus eher auf der Organisation des Repositorys als auf den Änderungen selbst liegt.