Mögliches Duplikat:
Ich bin ein Subversion-Freak. Warum sollte ich Mercurial oder Git oder ein anderes DVCS in Betracht ziehen oder nicht?
Hin und wieder hört man jemanden sagen, dass die verteilte Versionskontrolle (Git, HG) von Natur aus besser ist als die zentralisierte Versionskontrolle (wie SVN), da das Zusammenführen in SVN schwierig und schmerzhaft ist. Die Sache ist, ich hatte nie Probleme mit dem Zusammenführen in SVN, und da Sie immer nur die Behauptung von DVCS-Befürwortern und nicht von tatsächlichen SVN-Nutzern hören, erinnert es mich eher an diese abscheulichen Werbespots im Fernsehen, in denen sie auftreten Versuchen Sie, etwas zu verkaufen, das Sie nicht brauchen, indem Sie sich von verrückten Schauspielern vortäuschen lassen, dass das, was Sie bereits haben und gut funktionieren, unglaublich schwer zu benutzen ist.
Und der Anwendungsfall, der immer wieder auftaucht, ist das Zusammenführen einer Filiale, was mich wieder an diese Strawman-Produktwerbung erinnert. Wenn Sie wissen, was Sie tun, sollten Sie eine Zweigstelle überhaupt nicht wieder zusammenführen (und sollten es auch nie müssen). (Natürlich ist es schwierig zu tun, wenn du etwas grundsätzlich Falsches und Dummes tust!)
Abzüglich des lächerlichen Strawman-Anwendungsfalls: Was ist beim Zusammenführen von SVN von Natur aus schwieriger als beim Zusammenführen in einem DVCS-System?
Antworten:
Dies liegt daran, dass svn nicht über die richtigen Datenstrukturen verfügt, um den letzten gemeinsamen Vorfahren der beiden Zweige genau zu bestimmen. Dies ist keine große Sache für eine Niederlassung, die nur einmal zusammengeführt wird, kann jedoch in Situationen, in denen mehrere Niederlassungen mehrmals zusammengeführt werden, zu vielen fehlerhaften Zusammenführungskonflikten führen.
Ich verfolge svn nicht sehr genau, aber ich verstehe, dass diese speziellen technischen Probleme in den letzten Versionen behoben wurden. Es war jedoch nicht früh genug, um den Mythos zu zerstreuen, und Leute, die DVCS für die Zusammenführung ausprobiert haben, sind aus anderen Gründen dabei geblieben.
quelle
Und darin liegt die Quelle Ihrer Verwirrung und des gesamten Problems im Allgemeinen.
Sie sagen, dass das Zusammenführen von Zweigen "grundsätzlich falsch und albern" ist. Nun, genau das ist das Problem: Sie stellen sich Filialen als Dinge vor, die nicht zusammengeführt werden sollten. Warum? Weil Sie ein SVN-Benutzer sind, der weiß, dass das Zusammenführen von Zweigen schwierig ist . Deshalb tust du es niemals und ermutigst andere, es nicht zu tun. Sie wurden geschult , um eine Verschmelzung zu vermeiden. Sie haben Techniken entwickelt, mit denen Sie das Zusammenführen vermeiden .
Ich bin ein Mercurial-Benutzer. Selbst in meinen eigenen Projekten, in denen ich der einzige Entwickler bin, füge ich ständig Filialen zusammen . Ich habe einen Release-Zweig, in den ich einen Fix eingefügt habe. Nun, ich füge das wieder in die Hauptzeile ein, damit der Fix dort ankommt.
Wenn ich SVN verwenden würde, würde ich eine völlig andere Struktur der Codebasis annehmen. Warum? Weil SVN Zusammenführungen schwierig macht und Sie daher Redewendungen und Techniken entwickeln, um komplexe Zusammenführungen zu vermeiden .
DVCS machen komplexe Zusammenführungen einfach, da sie der Standardzustand sind . Alles ist mehr oder weniger ein Zweig in einem DVCS. Ihre gesamte Struktur ist also von Grund auf neu aufgebaut, um das Zusammenführen zu erleichtern. Auf diese Weise können Sie einen Workflow entwickeln, der täglich zusammengeführt wird, und nicht den SVN-Workflow, bei dem Sie niemals zusammengeführt werden.
Die einfache Tatsache ist: Sie sollten sich einem DVCS auf eine andere Weise nähern als SVN. Sie sollten die richtigen Redewendungen für diese sehr unterschiedlichen Arten von Versionskontrollsystemen verwenden. In SVN verwenden Sie Redewendungen, bei denen keine Zusammenführung erforderlich ist, da Zusammenführungen schwierig sind. In DVCS übernehmen Sie Redewendungen, die häufig Zusammenführungen verwenden, weil sie keine große Sache sind.
Richtiges Werkzeug für den richtigen Job.
Die Sache ist, dass der zusammenführungsorientierte Workflow viel besser und einfacher zu verwenden ist als der Workflow im SVN-Stil, bei dem Sie keine Dinge zusammenführen. Es ist einfacher zu sehen, wann etwas aus dem Release-Zweig in den Dev-Zweig gebracht wurde. Es ist einfacher, die verschiedenen Wechselwirkungen zwischen Zweigen zu erkennen. Es ist einfach, Testzweige für Dinge zu erstellen und diese dann abzuschneiden, wenn der Test nicht funktioniert. Und so weiter.
Wirklich, Joel erklärt das viel besser als ich . Du solltest das gut lesen.
quelle
Das Zusammenführen von SVN ist nicht allzu schwierig, wenn Sie der richtigen Philosophie folgen
Was ich in den meisten anderen Antworten sehe, scheint von Leuten zu kommen, die SVN eine Weile nicht mehr benutzt haben. Wie jemand genau erwähnt: "Es war nicht früh genug behoben, um den Mythos zu zerstreuen".
Aufgrund meiner derzeitigen Erfahrung mit der Verwendung von SVN 1.6 bis 1.8 in einem Vorgängerprojekt, das ich kürzlich geerbt habe, hat SVN das Zusammenführen erheblich vereinfacht. Es ist jedoch nicht narrensicher, und ich denke, es leidet nicht leicht unter Benutzern, die von der beabsichtigten Verwendung abweichen.
Obwohl ich SVN ziemlich gut kannte und Mercurial in der Zwischenzeit auch für persönliche Projekte ausprobiert hatte, hatte ich vor diesem Projekt noch nie viel in SVN verzweigt. Es gab einiges an Versuch und Irrtum und ich bekam eine Menge unerwarteter Zusammenführungskonflikte, als ich anfing.
Letztendlich wurde mir jedoch klar, dass ich jedes Mal, wenn ich eines (oder ein anderes Problem) bekam, Dinge nicht richtig gemacht hatte (auch bekannt als "der SVN-Weg" - wohl der richtige Weg zur Versionskontrolle). Ich glaube, hier liegt die Schwierigkeit: Sie können nicht auf unorganisierte Weise tun, was Sie wollen, und erwarten, dass SVN perfekt funktioniert, insbesondere bei Zusammenführungen. Zusammenführungen erfordern von den Benutzern strenge Disziplin, bevor sie ihre wahre Kraft entfalten können.
Folgendes ist mir aufgefallen: Es gibt starke Empfehlungen, wenn nicht sogar Anforderungen, für eine saubere Verwendung von Zusammenführungen:
Wenn Sie die obigen Anweisungen nicht befolgen, können Konflikte auftreten. Sie sind immer lösbar, aber es macht keinen großen Spaß, Zeit damit zu verbringen.
Oh, noch eine Sache beim Zusammenführen, wo SVN von allem, was ich gelesen und ausprobiert habe, wirklich scheiße ist: gelöschte / verschobene / umbenannte Dateien / Ordner. Anscheinend kann SVN immer noch nicht damit umgehen, dass eine Datei in einem Zweig umbenannt, gelöscht oder verschoben und ihre ursprüngliche Version in einem anderen Zweig geändert wird ... und diese dann zusammengeführt werden. Es wird einfach nicht wissen, wohin die Datei in der einen Richtung verschoben wurde, und es wird die Änderungen in der anderen Richtung "vergessen". Eine Änderung ist offensichtlich nicht lösbar (Sie können die Datei entweder löschen oder ändern, nicht beides), aber das Anwenden von Änderungen auf verschobene / umbenannte Dateien sollte funktionieren und funktioniert nicht. Hoffentlich wird das bald behoben.
Alles in allem ist es also einfach, SVN zusammenzuführen? Ich denke nicht. Auf keinen Fall sorglos. Ist es schlecht ? Ich glaube nicht. Es spuckt dir nur ins Gesicht, wenn du es falsch benutzt und nicht genug darüber nachdenkst, was du tust.
Auf dieser Grundlage kann ich sehen, warum die Leute Mercurial (zum Beispiel) bevorzugen, da es meiner Erfahrung nach etwas nachgiebiger ist und alles von Anfang an automatisiert wurde (zumindest seit den frühen Versionen, mit denen ich angefangen habe). SVN hat jedoch einiges aufgeholt, so dass es nicht mehr so viel Bashing wert ist.
quelle
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ührenA
, enthält der ZweigverlaufA
ein großes Commit, das alle Änderungen enthält , die seit der Verzweigung explizit vorgenommen wurdenB
.In den ersten SVN-Versionen mussten Sie, wenn Sie Zweig erneut
B
in Zweig zusammenführenA
mussten, manuell angeben, welcher Versionsbereich des ZweigsB
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
A
vontrunk
und machen Sie hier einige FestschreibungenB
vonA
und machen Sie hier ein paar Commitstrunk
undA
B
intrunk
A
inB
A
intrunk
B
intrunk
(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.
quelle
Ich habe einiges an SVN-Zusammenführung gemacht - einschließlich langjähriger Entwicklungs- und Veröffentlichungszweige. Im Großen und Ganzen habe ich überlebt. Das Zusammenführen ist immer schwierig, aber mit DCVS ist der Nachteil nicht so schlimm - alles ist lokal, aktualisieren Sie einfach auf eine bekannte gute Revision und fahren Sie fort. Während bei SVN auf der Serverseite viel passiert ist, war die Wiederherstellung hässlich - normalerweise musste die lokale Kopie gelöscht und dann ein neuer sauberer Zweig ausgecheckt werden, um es erneut zu versuchen. War in meinem Fall nicht schlecht - eine Gigabit-Verbindung zur SVN-Box hilft. Wir hatten jedoch einige Vertragspartner, die große Probleme damit hatten, da sie langsame Verbindungen hatten, sodass alles ewig dauerte, einschließlich Zusammenlegungen.
quelle
Hier liegt eines der sehr schönen Dinge an git. Es ist kein Erbe von DVCS, es ist nur etwas, was GIT auszeichnet. Sie können bestimmte Revisionen aus einem Zweig in einem anderen Zweig zusammenführen. Im Grunde genommen nimmt es nur das Diff und wendet es auf den anderen Zweig an, führt aber das Tracking durch und ist viel automatischer.
Wenn Sie also Zweig 2.0 und Zweig 3.0 haben und einen Fehler in 2.0 entdecken, können Sie ihn in 2.0 beheben und die Revisionen, die ihn auflösen, übernehmen und nur diese Revisionen in den 3.0-Zweig zusammenführen. Ich glaube nicht, dass SVN dazu eine andere Möglichkeit hat, als die Unterschiede für jede Revision manuell zu nehmen und anzuwenden
Natürlich scheint der automatische Zusammenführungsalgorithmus auch viel reibungsloser zu funktionieren und Git wurde von Grund auf auf dem Modell "Make a Branch for all the Things" erstellt, sodass das Verzweigen einfach und reibungslos vonstatten geht. Es scheint nur natürlich, sich oft mit dem Gewicht der Äste zu verzweigen
quelle