Ich versuche die Vorteile des verteilten Versionskontrollsystems (DVCS) zu verstehen.
Ich fand Subversion Umerziehung und diesen Artikel von Martin Fowler sehr nützlich.
Mercurial und andere DVCS fördern eine neue Art der Code-Bearbeitung mit Changesets und lokalen Commits. Es verhindert, dass die Hölle und andere Probleme der Zusammenarbeit verschmelzen
Wir sind davon nicht betroffen, da ich die kontinuierliche Integration praktiziere und es keine Option ist, allein in einer privaten Branche zu arbeiten, es sei denn, wir experimentieren. Wir verwenden für jede Hauptversion einen Zweig, in dem wir Fehler beheben, die aus dem Stamm zusammengeführt wurden.
Mercurial ermöglicht es Ihnen, Leutnants zu haben
Ich verstehe, dass dies für sehr große Projekte wie Linux nützlich sein kann, aber ich sehe den Wert in kleinen und sehr kollaborativen Teams (5 bis 7 Personen) nicht.
Mercurial ist schneller, benötigt weniger Speicherplatz und die vollständige lokale Kopie ermöglicht schnellere Protokoll- und Diff-Vorgänge.
Ich bin auch nicht darüber besorgt, da ich selbst bei sehr großen Projekten, an denen ich arbeite, keine Geschwindigkeits- oder Platzprobleme mit SVN bemerkt habe.
Ich suche nach Ihren persönlichen Erfahrungen und / oder Meinungen von ehemaligen SVN-Freaks. Vor allem in Bezug auf die Differenzmengen Konzept und die allgemeine Performance - Boost Sie gemessen.
UPDATE (12. Jan.) : Ich bin jetzt überzeugt, dass es einen Versuch wert ist.
UPDATE (12. Juni) : Ich habe Mercurial geküsst und es hat mir gefallen. Der Geschmack seiner Kirsche vor Ort verpflichtet. Ich habe Mercurial geküsst, nur um es zu versuchen. Ich hoffe mein SVN Server hat nichts dagegen. Es fühlte sich so falsch an. Es fühlte sich so richtig an. Bedeutet nicht, dass ich heute Nacht verliebt bin .
FINAL UPDATE (29. Juli) : Ich hatte das Privileg, Eric Sinks nächstes Buch mit dem Titel " Version Control by Example" zu lesen . Er beendete mich zu überzeugen. Ich werde Mercurial gehen.
svn
,git
undhg
seit Jahren, ich bin ziemlich gut kennen ihre Vor- und Nachteile. Obwohlgit
es mit Sicherheit das mächtigste davon ist, ist es wichtig anzuerkennen, dass stärker nicht automatisch besser bedeutet . Emacs ist sicherlich leistungsfähiger als jeder Javascript-Texteditor, der im Webbrowser ausgeführt wird, aber seltsamerweise schreibe ich diesen Kommentar gerade in einen Javascript-Browser-Texteditor! Einfachheit , auch Dummheit, hat in vielen Zusammenhängen einen Wert. Zentral nutzensvn
und so etwas wiegit-svn
lokal bietet das Beste aus beiden Welten.Antworten:
Hinweis: Die Antwort auf die aktuelle Frage finden Sie unter "BEARBEITEN"
Lesen Sie zunächst Subversion Re-education von Joel Spolsky. Ich denke, die meisten Ihrer Fragen werden dort beantwortet.
Eine weitere Empfehlung, Linus Torvalds 'Vortrag auf Git: http://www.youtube.com/watch?v=4XpnKHJAok8 . Dieser andere könnte auch die meisten Ihrer Fragen beantworten, und es ist ziemlich unterhaltsam.
Übrigens finde ich das ziemlich lustig: Sogar Brian Fitzpatrick & Ben Collins-Sussman, zwei der ursprünglichen Erfinder von Subversion, sagten in einem Google-Vortrag "Entschuldigung", dass Subversion gegenüber Mercurial (und DVCSs im Allgemeinen) unterlegen sei.
Nun, IMO und im Allgemeinen, entwickelt sich die Teamdynamik mit jedem DVCS auf natürlichere Weise. Ein herausragender Vorteil ist, dass Sie ein Commit offline durchführen können, da dies die folgenden Dinge impliziert:
Über Ihre Punkte:
Ich habe einige Dokumentationen zum Joomla-Projekt beigesteuert, um eine Migration auf DVCS zu predigen, und hier habe ich einige Diagramme erstellt, um zentralisierte vs. verteilte zu veranschaulichen.
Zentralisiert
In der allgemeinen Praxis verteilt
In vollen Zügen verteilt
Sie sehen in dem Diagramm, dass es immer noch ein "zentralisiertes Repository" gibt, und dies ist eines der Lieblingsargumente der Fans der zentralen Versionierung: "Sie werden immer noch zentralisiert", und nein, Sie sind es nicht, da das "zentralisierte" Repository nur Ihr Repository ist Alle sind sich einig (z. B. ein offizielles Github-Repo), dies kann sich jedoch jederzeit ändern.
Dies ist der typische Workflow für Open-Source-Projekte (z. B. ein Projekt mit massiver Zusammenarbeit) unter Verwendung von DVCSs:
Bitbucket.org ist so etwas wie ein Github-Äquivalent für Quecksilber. Wenn Ihr Team kleiner als fünf ist, können Sie es kostenlos verwenden.
Der beste Weg, sich von der Verwendung eines DVCS zu überzeugen, ist das Ausprobieren eines DVCS. Jeder erfahrene DVCS-Entwickler, der svn / cvs verwendet hat, wird Ihnen sagen, dass es sich lohnt und dass er nicht weiß, wie er die ganze Zeit ohne DVCS überlebt hat.
BEARBEITEN : Zur Beantwortung Ihrer zweiten Bearbeitung kann ich nur wiederholen, dass Sie bei einem DVCS einen anderen Workflow haben. Ich rate Ihnen, nicht nach Gründen zu suchen, um es nicht aufgrund von Best Practices zu versuchen. Es fühlt sich an, als würden die Leute argumentieren, dass OOP nicht ist notwendig, weil sie komplexe Entwurfsmuster mit dem umgehen können, was sie immer mit dem Paradigma XYZ tun; Sie können sowieso profitieren.
Probieren Sie es aus, Sie werden sehen, wie besser es ist, in "einer privaten Filiale" zu arbeiten. Ein Grund, warum ich sagen kann, warum das Letzte wahr ist, ist, dass Sie die Angst verlieren, sich zu verpflichten , so dass Sie sich jederzeit verpflichten können, wenn Sie es für richtig halten und auf natürlichere Weise arbeiten.
In Bezug auf "Hölle verschmelzen" sagen Sie "es sei denn, wir experimentieren", ich sage "auch wenn Sie gleichzeitig experimentieren, warten und in der überarbeiteten Version 2.0 arbeiten ". Wie ich bereits sagte, gibt es keine Verschmelzung der Hölle, weil:
Auch die Projektgröße spielt keine Rolle, als ich von Subversion wechselte, sah ich die Vorteile bereits, als ich alleine arbeitete. Alles fühlte sich einfach richtig an. Mit den Changesets (nicht genau eine Revision, sondern ein bestimmter Satz von Änderungen für bestimmte Dateien, die Sie mit einem Commit versehen und vom Status der Codebasis isoliert haben) können Sie genau veranschaulichen, was Sie damit gemeint haben, was Sie mit einer bestimmten Gruppe von Dateien gemacht haben. nicht die ganze Codebasis.
In Bezug auf die Funktionsweise von Changesets und die Leistungssteigerung. Ich werde versuchen, es mit einem Beispiel zu veranschaulichen, das ich gerne gebe: Das Mootools-Projekt wechselt von svn, das in der Grafik ihres Github-Netzwerks dargestellt ist .
Vor
Nach
Was Sie sehen, ist, dass Entwickler sich auf ihre eigene Arbeit konzentrieren können, ohne Angst davor zu haben, den Code anderer zu brechen. Sie sorgen sich darum, den Code anderer nach dem Drücken / Ziehen zu brechen ), aber da das Zusammenführen hier intelligenter ist, geschieht dies oft nie ... selbst wenn es einen Zusammenführungskonflikt gibt (was selten vorkommt), verbringen Sie nur 5 Minuten oder weniger damit, ihn zu beheben.
Meine Empfehlung an Sie ist, jemanden zu suchen, der weiß, wie man Quecksilber verwendet, und ihn / sie zu bitten, es Ihnen praktisch zu erklären. Indem ich ungefähr eine halbe Stunde mit ein paar Freunden in der Kommandozeile verbrachte, während ich mercurial mit unseren Desktops und Bitbucket-Konten verwendete, um ihnen zu zeigen, wie man Konflikte fabriziert, um sie in einer lächerlichen Menge Zeit zu beheben, konnte ich zeigen ihnen die wahre Kraft eines DVCS.
Schließlich würde ich Ihnen empfehlen, mercurial + bitbucket anstelle von git + github zu verwenden, wenn Sie mit Windows-Leuten arbeiten. Mercurial ist auch ein bisschen einfacher, aber Git ist leistungsfähiger für eine komplexere Repository-Verwaltung (z . B. Git-Rebase ).
Einige zusätzliche empfohlene Lesungen:
quelle
Sie sagen unter anderem, dass Sie keine verteilte Versionskontrolle benötigen, wenn Sie im Wesentlichen auf einem Zweig bleiben.
Das ist wahr, aber ist es nicht eine unnötig starke Einschränkung Ihrer Arbeitsweise und eine, die sich nicht gut auf mehrere Standorte in mehreren Zeitzonen skalieren lässt? Wo sollte sich der zentrale Subversion-Server befinden und sollten alle nach Hause gehen, wenn dieser Server aus irgendeinem Grund ausfällt?
DVCSes sind zu Subversion, was Bittorrent zu ftp ist
(technisch nicht legal). Wenn Sie darüber nachdenken, werden Sie vielleicht verstehen, warum es ein so großer Sprung nach vorne ist?
Für mich führte unser Wechsel zu git sofort zu
Überlege also, warum Bittorrent besser ist als FTP, und überdenke deine Position :)
Hinweis: Es wurde erwähnt, dass es Anwendungsfälle gibt, in denen FTP schneller und als BitTorrent ist. Dies gilt genauso wie die Sicherungsdatei, die Ihr bevorzugter Editor verwaltet, schneller zu verwenden ist als ein Versionskontrollsystem.
quelle
Das Killer-Feature von verteilten Versionskontrollsystemen ist der verteilte Teil. Sie checken keine "Arbeitskopie" aus dem Repository aus, sondern klonen eine vollständige Kopie des Repositorys. Dies ist enorm, da es leistungsstarke Vorteile bietet:
Sie können die Vorteile der Versionskontrolle genießen, auch wenn Sie keinen Internetzugang haben wie ...Dieser ist leider überlastet und überzeichnet, da DVCS fantastisch ist - es ist einfach kein starkes Verkaufsargument für so viele Wir stellen fest, dass wir ohne Internetzugang ungefähr so oft codieren, wie es anfängt, Frösche zu regnen.Der wahre Grund für ein lokales Repository ist, dass Sie die vollständige Kontrolle über Ihr Commit-Protokoll haben, bevor es in das Master-Repository übertragen wird .
Habe schon einmal einen Fehler behoben und hatte am Ende so etwas wie:
Und so weiter. So ein Verlauf ist chaotisch - es gab wirklich nur einen Fix, aber jetzt verteilt sich die Implementierung auf viele Commits, die unerwünschte Artefakte enthalten, z. B. das Hinzufügen und Entfernen von Debugging-Anweisungen. Bei einem System wie SVN besteht die Alternative darin, erst dann ein Commit (!!!) durchzuführen, wenn alles funktioniert, um den Verlauf sauber zu halten. Trotzdem bleiben Fehler aus und Murphy's Law wartet darauf, Sie zu brutalisieren, wenn erhebliche Arbeitsmengen nicht durch die Versionskontrolle geschützt sind.
Ein lokaler Klon des Repositorys, dessen Eigentümer Sie sind , behebt dies, da Sie den Verlauf neu schreiben können, indem Sie kontinuierlich die Commits "fix it" und "oops" in den Commit "bug fix" rollen. Am Ende des Tages wird ein sauberes Commit an das Master-Repository gesendet, das wie folgt aussieht:
Wie soll es sein?
In Kombination mit dem Verzweigungsmodell ist die Möglichkeit, die Historie neu zu schreiben, noch leistungsfähiger. Ein Entwickler kann Arbeiten ausführen, die völlig isoliert in einer Zweigstelle ausgeführt werden. Wenn diese Zweigstelle dann in den Stamm verschoben werden soll, stehen Ihnen alle möglichen interessanten Optionen zur Verfügung:
Führe eine einfache Vanille- Fusion durch . Bringt alles in Warzen und alles.
Mach einen Rebase . Ermöglicht es Ihnen, die Filialhistorie zu sortieren, die Reihenfolge der Commits neu zu ordnen, Commits auszuschließen, Commits zusammenzufassen, Commit-Nachrichten neu zu schreiben - sogar Commits zu bearbeiten oder neue hinzuzufügen! Ein verteiltes Versionskontrollsystem bietet umfassende Unterstützung für die Codeüberprüfung.
Als ich erfuhr, wie lokale Repositories es mir ermöglichten, meine Geschichte im Interesse der Vernunft meiner Programmierkollegen und meines zukünftigen Ichs zu bearbeiten, legte ich SVN endgültig auf. Mein Subversion-Client ist jetzt
git svn
.Wenn Entwickler und Manager die redaktionelle Kontrolle über den Festschreibungsverlauf ausüben können, führt dies zu einem besseren Projektverlauf und einem sauberen Verlauf, mit dem sie arbeiten können. Dies hilft meiner Produktivität als Programmierer. Wenn Sie all das Gerede über das "Umschreiben von Geschichte" erschreckt, machen Sie sich keine Sorgen, denn dafür sind zentrale, öffentliche oder Master-Repositories gedacht. Die Geschichte kann (und sollte!) Bis zu dem Punkt neu geschrieben werden, an dem jemand sie in einen Zweig in einem Repository bringt, aus dem andere Personen ziehen. An diesem Punkt sollte die Geschichte so behandelt werden, als ob sie auf einer Steintafel geschnitzt wäre.
quelle
dukofgamings Antwort ist wahrscheinlich so gut wie es nur geht, aber ich möchte dies aus einer anderen Richtung angehen.
Nehmen wir an, dass das, was Sie sagen, absolut wahr ist und dass Sie durch die Anwendung bewährter Verfahren die Probleme vermeiden können, für deren Behebung DVCS entwickelt wurde. Bedeutet dies, dass ein DVCS Ihnen keinen Vorteil bieten würde? Die Leute stinken danach, Best Practices zu befolgen . Die Leute gehen in Unordnung zu bringen. Warum sollten Sie also die Software vermeiden, die zur Behebung einer Reihe von Problemen entwickelt wurde, und sich stattdessen darauf verlassen, dass die Leute etwas tun, das Sie im Voraus vorhersagen können, dass sie nicht tun werden?
quelle
Ja, es tut weh, wenn Sie große Commits in Subversion zusammenführen müssen. Dies ist aber auch eine großartige Lernerfahrung, die es Ihnen ermöglicht, Konflikte zu vermeiden. Mit anderen Worten, Sie lernen, häufig einzuchecken . Eine frühzeitige Integration ist eine sehr gute Sache für ein Projekt am selben Ort. Solange alle das tun, sollte die Verwendung von Subversion kein großes Problem sein.
Git, zum Beispiel wurde entworfen für verteilte Arbeit und ermutigt die Menschen auf ihre eigenen Projekte zu arbeiten und schaffen eigene Gabeln für eine (eventuelle) fusionieren später. Es war nicht speziell für die kontinuierliche Integration in "kleine und sehr kollaborative Teams" konzipiert, was vom OP gefordert wird. Es ist eher das Gegenteil, wenn man darüber nachdenkt. Sie können die ausgefallenen verteilten Funktionen nicht nutzen, wenn Sie nur im selben Raum sitzen und gemeinsam am selben Code arbeiten.
Für ein CI-benutzendes Team am selben Standort ist es meiner Meinung nach nicht wichtig, ob Sie ein verteiltes System verwenden oder nicht. Es kommt auf Geschmack und Erfahrung an.
quelle
Weil Sie Ihr eigenes Wissen ständig herausfordern sollten. Sie lieben Subversion, und ich kann verstehen, dass ich sie viele Jahre lang verwendet habe und mich sehr darüber gefreut habe, aber das heißt nicht, dass es immer noch das Werkzeug ist, das Ihnen am besten zusagt.
Ich glaube, als ich damit anfing, war es die beste Wahl zu dieser Zeit. Aber mit der Zeit tauchen andere Tools auf, und jetzt bevorzuge ich Git, auch für meine eigenen Freizeitprojekte.
Und Subversion hat einige Mängel. Wenn Sie beispielsweise ein Verzeichnis auf der Disc umbenennen, wird es im Repository nicht umbenannt. Das Verschieben von Dateien wird nicht unterstützt. Dadurch wird das Verschieben von Dateien zu einem Kopier- / Löschvorgang und das Zusammenführen von Änderungen, wenn Dateien verschoben / umbenannt wurden, wird erschwert. Und Merge-Tracking ist nicht wirklich in das System integriert, sondern wird in Form einer Problemumgehung implementiert.
Git behebt diese Probleme (einschließlich der automatischen Erkennung, ob eine Datei verschoben wurde, Sie müssen nicht einmal sagen, dass es sich um eine Tatsache handelt).
Andererseits erlaubt es git nicht, auf einzelne Verzeichnisebenen zu verzweigen, wie es Subversion tut.
Meine Antwort lautet also: Sie sollten nach Alternativen suchen, prüfen, ob sie Ihren Bedürfnissen besser entsprechen, als Sie es kennen, und dann entscheiden.
quelle
In Bezug auf die Leistung hat Git oder ein anderes DVCS einen großen Vorteil gegenüber SVN, wenn Sie von einem Zweig zu einem anderen wechseln oder von einer Revision zu einer anderen springen müssen. Da alles lokal gespeichert ist, geht es viel schneller als bei SVN.
Das allein könnte mich zum Wechseln bringen!
quelle
Anstatt an der Idee festzuhalten, dass "durch Anwenden von Best Practices kein DVCS erforderlich ist", sollten Sie bedenken, dass der SVN-Workflow ein Workflow mit einer Reihe von Best Practices ist und der GIT / Hg-Workflow ein anderer Workflow ist. mit einer anderen Reihe von Best Practices.
git bisect
(und alle Auswirkungen auf Ihr Haupt-Repository)Ein sehr wichtiges Prinzip in Git ist, dass Sie Fehler mit finden können
git bisect
. Dazu verwenden Sie die letzte Version, von der Sie ausgeführt haben, dass sie funktioniert, und die erste Version, von der Sie ausgeführt haben, dass sie fehlgeschlagen ist, und führen (mit Gits Hilfe) eine binäre Suche durch, um herauszufinden, welches Commit den Fehler verursacht hat. Zu diesem Zweck muss Ihr gesamter Revisionsverlauf relativ frei von anderen Fehlern sein, die Ihre Fehlersuche beeinträchtigen können (ob Sie es glauben oder nicht, dies funktioniert in der Praxis ziemlich gut, und Linux-Kernel-Entwickler tun dies die ganze Zeit).Um
git bisect
Funktionen zu erhalten, entwickeln Sie ein neues Feature in einem eigenen Feature-Zweig , führen einen Rebase durch und bereinigen den Verlauf (sodass Sie keine bekannten, nicht funktionierenden Revisionen in Ihrem Verlauf haben - nur eine Reihe von Änderungen, die Sie jeweils auf einen Schlag erledigen Wenn das Feature fertig ist, fügen Sie es in den Hauptzweig mit dem Arbeitsverlauf ein.Damit dies funktioniert, müssen Sie darüber informiert sein, von welcher Version des Hauptzweigs aus Sie den Feature-Zweig starten. Sie können nicht einfach vom aktuellen Stand des
master
Zweigs aus starten, da dies möglicherweise nicht verwandte Fehler enthält. Daher empfiehlt es sich in der Kernel-Community, die Arbeit mit der neuesten stabilen Version des Kernels (für große Funktionen) oder mit der Arbeit zu beginnen vom neuesten getaggten Release Candidate.Sie können Ihren Zwischenstand auch sichern, indem Sie den Feature-Zweig in der Zwischenzeit auf einen Server übertragen. Sie können den Feature-Zweig auch auf einen Server übertragen, um ihn für andere Personen freizugeben und Feedback zu erhalten, bevor die Funktion abgeschlossen ist, bevor Sie dies tun müssen Verwandeln Sie Code in eine dauerhafte Funktion der Codebasis, mit der sich alle * in Ihrem Projekt befassen müssen.
Die gitworkflows- Manpage ist eine gute Einführung in die Workflows, für die Git entwickelt wurde. Auch, warum Git besser als X ist, wird auf Git-Workflows eingegangen.
Große, verteilte Projekte
Weil in Projekten wie Linux so viele Leute involviert sind, die so geografisch verteilt sind, dass es schwierig ist, so gut zusammenzuarbeiten wie ein kleines Team, das sich einen Konferenzraum teilt. (Ich vermute, dass für die Entwicklung eines großen Produkts wie Microsoft Windows das Team einfach zu groß ist, um die Zusammenarbeit aufrechtzuerhalten, mit der ein zentrales VCS ohne Stellvertreter funktioniert, auch wenn sich alle Mitarbeiter im selben Gebäude befinden.)
quelle
Warum man sie nicht im Tandem benutzt? Bei meinem aktuellen Projekt sind wir gezwungen, CVS zu verwenden. Wir behalten jedoch auch lokale Git-Repositories bei, um die Entwicklung von Features zu ermöglichen. Dies ist das Beste aus beiden Welten, da Sie verschiedene Lösungen ausprobieren und Versionen Ihrer Arbeit auf Ihrem eigenen Computer behalten können. Auf diese Weise können Sie ein Rollback auf frühere Versionen Ihrer Funktion durchführen oder verschiedene Ansätze ausprobieren, ohne Probleme zu bekommen, wenn Sie Ihren Code durcheinander bringen. Ein zentrales Repository bietet Ihnen dann die Vorteile eines zentralen Repositorys.
quelle
Ich habe keine persönlichen Erfahrungen mit DVCS, aber nach den hier gegebenen Antworten und einigen verknüpften Dokumenten ist der grundlegendste Unterschied zwischen DVCS und CVCS das verwendete Arbeitsmodell
DVCS
Das Arbeitsmodell von DVCS ist, dass Sie eine isolierte Entwicklung durchführen . Sie entwickeln Ihre neue Funktion / Ihren neuen Bugfix isoliert von allen anderen Änderungen, bis Sie beschließen, ihn für den Rest des Teams freizugeben. Bis dahin können Sie nach Belieben einchecken, da sich sonst niemand darum kümmert.
CVCS
Das Arbeitsmodell von CVCS (insbesondere Subversion) besteht darin, dass Sie eine kollaborative Entwicklung durchführen . Sie entwickeln Ihr neues Feature / Bugfix in direkter Zusammenarbeit mit allen anderen Teammitgliedern und alle Änderungen sind sofort für alle verfügbar.
Andere Unterschiede
Andere Unterschiede zwischen
svn
undgit
/hg
, wie z. B. Revisionen gegenüber Änderungssätzen, sind zufällig. Es ist sehr gut möglich, ein DVCS basierend auf Revisionen (wie Subversion sie hat) oder ein CVCS basierend auf Changesets (wie Git / Mercurial sie haben) zu erstellen.Ich werde kein bestimmtes Tool empfehlen, da es hauptsächlich vom Arbeitsmodell abhängt, mit dem Sie (und Ihr Team) am besten vertraut sind.
Persönlich habe ich keine Probleme mit der Arbeit mit einem CVCS.
svn
undgit
/ oder vorgekommen wärehg
. Zum Beispiel wurde V2 einiger Software von einem anderen Team unter Verwendung eines anderen VCS gewartet, während wir V3 entwickelten. Gelegentlich mussten Bugfixes aus dem V2-VCS in das V3-VCS importiert werden, was im Grunde ein sehr umfangreiches Einchecken in das V3-VCS bedeutete (mit allen Bugfixes in einem einzigen Änderungssatz). Ich weiß, es war nicht ideal, aber es war eine Entscheidung des Managements, verschiedene VCS-Systeme zu verwenden.quelle