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.
svn:mergeinfo
Eigenschaft ist.svn:mergeinfo
macht es.Weil Subversion (mindestens Version 1.4 und niedriger) nicht verfolgt, was zusammengeführt wurde. Bei Subversion ist das Zusammenführen im Grunde dasselbe wie jedes Festschreiben, während bei anderen Versionskontrollen wie Git die zusammengeführten Elemente gespeichert werden.
quelle
Unberührt von den bereits bereitgestellten Antworten bot Hg überlegene Zusammenführungsfunktionen, da beim Zusammenführen von Änderungen mehr Informationen verwendet werden ( hginit.com ):
Natürlich ist es auch ein großer Gewinn, sich daran zu erinnern, was zuletzt zusammengeführt wurde (der Punkt, auf den sich die meisten Antworten hier beziehen).
Beide Verbesserungen sind jedoch fraglich, da Subversion 1.5+ zusätzliche Zusammenführungsinformationen in Form von Subversionseigenschaften speichert: Da diese Informationen verfügbar sind, gibt es keinen offensichtlichen Grund, warum Subversion Merge die Zusammenführung nicht so erfolgreich implementieren konnte wie Hg oder Git. Ich weiß zwar nicht, ob dies der Fall ist, aber es klingt sicherlich so, als ob Subversion-Entwickler auf dem Weg sind, dieses Problem zu umgehen.
quelle
Ich nehme an, dies könnte teilweise daran liegen, dass Subversion die Idee eines zentralen Servers zusammen mit einer absoluten Zeitlinie von Revisionen hat. Mercurial ist wirklich verteilt und hat keinen solchen Bezug zu einer absoluten Zeitlinie. Auf diese Weise können Mercurial-Projekte kompliziertere Hierarchien von Zweigen bilden, um Funktionen und Testzyklen nach Unterprojekten hinzuzufügen. Die Teams müssen jedoch jetzt viel aktiver über Zusammenführungen auf dem Laufenden bleiben, um auf dem neuesten Stand zu bleiben, da sie nicht einfach auf "Aktualisieren" klicken und damit fertig werden können .
quelle
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.
Ich habe auch nicht viel darüber nachgedacht, wie Sie es implementieren würden, aber mein Eindruck (basierend auf bitterer Erfahrung und viel Lesen) ist, dass dieser Unterschied das Zusammenführen und Verzweigen in nicht auf Repositorys basierenden Systemen so viel einfacher macht.
quelle
Ich habe nur Erfahrung mit Subversion, aber ich kann Ihnen sagen, dass der Zusammenführungsbildschirm in TortoiseSVN schrecklich kompliziert ist. Zum Glück enthalten sie einen Trockenlaufknopf, damit Sie sehen können, ob Sie es richtig machen. Die Komplikation liegt in der Konfiguration dessen, was Sie wo zusammenführen möchten. Sobald Sie das für die Zusammenführung eingerichtet haben, geht die Zusammenführung im Allgemeinen gut. Anschließend müssen Sie alle Konflikte lösen und Ihre zusammengeführte Arbeitskopie in das Repository übertragen.
Wenn Mercurial die Konfiguration der Zusammenführung vereinfachen kann, kann ich sagen, dass dies die Zusammenführung zu 100% einfacher macht als Subversion.
quelle