Frage

Der Umgang mit mehreren Zusammenführungen in Zweigen in Subversion oder CVS ist nur eines der Dinge, die man erleben muss.Es ist ungemein einfacher, den Überblick über Verzweigungen und Zusammenführungen in Mercurial (und wahrscheinlich jedem anderen verteilten System) zu behalten, aber ich weiß nicht warum.Weiß es sonst noch jemand?

Meine Frage ergibt sich aus der Tatsache, dass Sie mit Mercurial eine Arbeitsweise übernehmen können, die der des zentralen Repositorys von Subversions/CVS ähnelt und alles einwandfrei funktionieren wird.Sie können mehrere Zusammenführungen auf demselben Zweig durchführen und benötigen keine endlosen Zettel mit Commit-Nummern und Tag-Namen.

Ich weiß, dass die neueste Version von Subversion die Möglichkeit hat, Zusammenführungen in Zweige zu verfolgen, sodass man nicht ganz den gleichen Aufwand erleidet, aber es war eine riesige und wichtige Entwicklung auf ihrer Seite und sie macht immer noch nicht alles, was das Entwicklungsteam tun würde wie es zu tun ist.

Es muss einen grundlegenden Unterschied in der Art und Weise geben, wie alles funktioniert.

War es hilfreich?

Lösung

In Subversion (und CVS) steht das Repository an erster Stelle.In Git und Mercurial gibt es nicht wirklich das Konzept eines Repositorys auf die gleiche Weise.Hier sind Veränderungen das zentrale Thema.

+1

Der Aufwand bei CVS/SVN ergibt sich aus der Tatsache, dass diese Systeme dies tun nichtErinnern Sie sich an die Elternschaft der Veränderungen.In Git und Mercurial kann ein Commit nicht nur mehrere Kinder haben, es kann auch mehrere Eltern haben!

Das lässt sich leicht mit einem der grafischen Tools beobachten: gitk oder hg view.Im folgenden Beispiel wurde Branch Nr. 2 von #1 bei Commit A gegabelt und seitdem einmal zusammengeführt (bei M, fusioniert mit Commit B B):

o---A---o---B---o---C         (branch #1)
     \       \
      o---o---M---X---?       (branch #2)

Beachten Sie, dass A und B zwei Kinder haben, während M zwei hat Eltern.Diese Beziehungen sind verzeichnet im Repository.Nehmen wir an, der Betreuer von Branch Nr. 2 möchte nun die neuesten Änderungen aus Zweig 1 zusammenführen. Sie können einen Befehl ausgeben, z. B.:

$ git merge branch-1

und das Tool erkennt automatisch, dass die Base ist b-weil es in Commit M, einem Vorfahr der Spitze von #2-und dass es verschmelzen muss, was zwischen B und C passiert ist, verschmelzenCVS erfasst diese Informationen weder noch vor Version 1.5 SVN.In diesen Systemen würde die Grafik so aussehen:

o---A---o---B---o---C         (branch #1)
     \    
      o---o---M---X---?       (branch #2)

Wo M nur ein gigantischer "zerkleinerter" Commit für alles ist, was zwischen A und B geschah, wird auf M. angewendet.Beachten Sie, dass es nach der Tat eine solche gibt Keine Spur übrig (außer potenziell in menschlich-lesbaren Kommentaren) darüber, wo m stammte oder von nicht von wie viele Die Commits wurden zusammengebrochen-die Geschichte viel undurchdringlicher.

Schlimmer noch, die Durchführung einer zweiten Zusammenführung wird zum Albtraum:Man muss herausfinden, was die Merge -Basis zum Zeitpunkt der ersten Zusammenführung war (und einer hat Zu wissenDass es überhaupt eine Verschmelzung gegeben hat!) Und dann diese Informationen dem Tool vorlegen, damit es nicht versucht, a..b über M. wiederzugebenAll dies ist schwierig genug, wenn sie in enger Zusammenarbeit arbeiten, aber in einer verteilten Umgebung einfach unmöglich.

Ein (verwandtes) Problem besteht darin, dass es keine Möglichkeit gibt, die Frage zu beantworten:"Enthält X B?" wobei B eine potenziell wichtige Fehlerbehebung ist.Warum also nicht einfach diese Informationen im Commit aufzeichnen, da dies der Fall ist? bekannt zum Merge-Zeitpunkt!

P.-S.- Ich habe keine Erfahrung mit SVN 1.5+ Merge-Aufzeichnungsfähigkeiten, aber der Workflow scheint viel mehr erfunden zu sein als in den verteilten Systemen.Wenn dies tatsächlich der Fall ist, liegt dies wahrscheinlich daran, dass der Fokus-wie im obigen Kommentar-eher auf die Repository-Organisation als auf die Änderungen selbst gelegt wird.

Andere Tipps

Weil Subversion (mindestens Version 1.4 und niedriger) nicht den Überblick darüber behält, was zusammengeführt wurde.Bei Subversion ist das Zusammenführen im Grunde das Gleiche wie bei jedem Commit, während bei anderen Versionskontrollen wie Git alles, was zusammengeführt wurde, gespeichert wird.

Hg blieb von den bereits bereitgestellten Antworten unberührt und bot überlegene Zusammenführungsfunktionen, da beim Zusammenführen von Änderungen mehr Informationen verwendet werden (hginit.com):

Wenn ich beispielsweise eine Funktion ein wenig ändere und sie dann woanders hinweg bewege, erinnert sich die Subversion nicht wirklich an diese Schritte. Wenn es also Zeit ist, sich zu verschmelzen, könnte es denken, dass eine neue Funktion nur aus heiterem Himmel auftauchte .Während sich Mercurial an diese Dinge separat erinnert:Funktion geändert, die Funktion bewegt, was bedeutet, dass es viel wahrscheinlicher ist, dass Merkurial unsere Änderungen erfolgreich verschmelzen, wenn Sie diese Funktion auch ein wenig verändert haben.

Natürlich ist es auch ein großer Gewinn, sich daran zu erinnern, was zuletzt zusammengeführt wurde (der Punkt, auf den die meisten Antworten hier eingehen).

Beide Verbesserungen sind jedoch fraglich, da Subversion 1.5+ zusätzliche Zusammenführungsinformationen in Form von Subversion-Eigenschaften speichert:Aufgrund der verfügbaren Informationen gibt es keinen offensichtlichen Grund, warum Subversion Merge Merge nicht so erfolgreich implementieren konnte wie Hg oder Git.Ich weiß zwar nicht, ob das der Fall ist, aber es hört sich auf jeden Fall so an, als wären Subversion-Entwickler auf dem Weg, dieses Problem zu umgehen.

Ich vermute, dass dies zum Teil daran liegt, dass Subversion die Idee eines zentralen Servers mit einer absoluten Zeitleiste für Revisionen hat.Mercurial ist wirklich verteilt und hat keinen solchen Bezug zu einer absoluten Zeitlinie.Dies ermöglicht es Mercurial-Projekten zwar, kompliziertere Zweighierarchien zum Hinzufügen von Funktionen und Testzyklen nach Unterprojekt zu bilden, allerdings müssen Teams jetzt viel aktiver den Überblick über Zusammenführungen behalten, um auf dem Laufenden zu bleiben, da sie nicht einfach auf „Aktualisieren“ klicken und damit fertig sein können .

In Subversion (und CVS) steht das Repository an erster Stelle.In Git und Mercurial gibt es nicht wirklich das Konzept eines Repositorys in gleicher Weise;Hier Änderungen sind das zentrale Thema.

Ich habe auch nicht viel darüber nachgedacht, wie Sie es implementieren würden, aber mein Eindruck (basierend auf bitterer Erfahrung und viel Lektüre) ist, dass dieser Unterschied das Zusammenführen und Verzweigen in nicht auf Repositorys basierenden Systemen so viel einfacher macht.

Ich habe nur Erfahrung mit Subversion, aber ich kann Ihnen sagen, dass der Zusammenführungsbildschirm in TortoiseSVN furchtbar kompliziert ist.Glücklicherweise verfügen sie über eine Probelauftaste, sodass 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, funktioniert die Zusammenführung im Allgemeinen einwandfrei.Dann müssen Sie alle Konflikte lösen und dann Ihre zusammengeführte Arbeitskopie in das Repository übertragen.

Wenn Mercurial die Konfiguration der Zusammenführung einfacher machen kann, dann kann ich sagen, dass dies die Zusammenführung um 100 % einfacher machen würde als Subversion.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top