Ich denke, dass Sie in der Praxis feststellen werden, dass Entwickler lieber ein zentrales Repository verwenden, als zwischen den lokalen Repositories zu pushen und zu ziehen. Sobald Sie ein zentrales Repository geklont haben, während Sie an Tracking-Zweigen arbeiten, sind das Abrufen und das Drücken trivialer Befehle.Das Hinzufügen von einem halben Dutzend Fernbedienungen zu allen lokalen Repositories Ihrer Kollegen ist mühsam und diese Repositories sind möglicherweise nicht immer zugänglich (ausgeschaltet, auf einem nach Hause genommenen Laptop usw.).
Irgendwann, wenn Sie alle am gleichen Projekt arbeiten, müssen alle Arbeiten integriert werden. Dies bedeutet, dass Sie einen Integrationszweig benötigen, in dem alle Änderungen zusammenkommen. Dies muss natürlich für alle Entwickler zugänglich sein, es gehört nicht zum Beispiel auf den Laptop des leitenden Entwicklers.
Sobald Sie ein zentrales Repository eingerichtet haben, können Sie einen cvs/svn style-Workflow zum Einchecken und Aktualisieren verwenden. cvs update wird zu git fetch und rebase, wenn du lokale Änderungen hast oder einfach git pull, wenn du keine lokalen Änderungen hast. cvs commit wird zu git commit und git push.
Mit diesem Setup befinden Sie sich in einer ähnlichen Position mit Ihrem vollständig zentralisierten VCS-System. Sobald Entwickler ihre Änderungen (git push) übermitteln, die sie tun müssen, um für den Rest des Teams sichtbar zu sein, befinden sie sich auf dem zentralen Server und werden gesichert.
Was Disziplin in beiden Fällen erfordert, verhindert, dass Entwickler lange laufende Änderungen aus dem zentralen Repository heraushalten. Die meisten von uns haben wahrscheinlich in einer Situation gearbeitet, in der ein Entwickler an dem Feature 'x' arbeitet, das eine grundlegende Änderung in einem Kerncode erfordert. Die Änderung wird dazu führen, dass alle anderen komplett neu erstellt werden müssen, aber die Funktion ist noch nicht für den Hauptstream bereit, also hält er sie einfach bis zu einem geeigneten Zeitpunkt ausgecheckt.
Die Situation ist in beiden Situationen sehr ähnlich, obwohl es einige praktische Unterschiede gibt. Wenn Sie git verwenden, weil Sie lokale Commits durchführen und lokale Historien verwalten können, ist die Notwendigkeit, zum zentralen Repository zu wechseln, für den einzelnen Entwickler möglicherweise weniger spürbar als für so etwas wie cvs.
Auf der anderen Seite kann die Verwendung von lokalen Commits als ein Vorteil verwendet werden. Es sollte nicht sehr schwierig sein, alle lokalen Commits an einen sicheren Ort im zentralen Repository zu verschieben. Lokale Zweige können in einem entwicklerspezifischen Tag-Namespace gespeichert werden.
Zum Beispiel könnte für Joe Bloggs ein Alias in seinem lokalen Repository erstellt werden, um etwas wie das folgende in Reaktion auf (z.B.) git mybackup
durchzuführen.
git push origin +refs/heads/*:refs/jbloggs/*
Dies ist ein Single-Befehl, der an einer beliebigen Stelle (wie am Ende des Tages) verwendet werden können, um sicherzustellen, dass alle seine lokalen Änderungen sicher gesichert werden.
Dies hilft bei allen Arten von Katastrophen. Joe's Maschine explodiert, und er kann eine andere Maschine benutzen und holen wird gespeichert und weitermachen von wo er aufgehört hat. Joe ist krank? Fred kann Joes Äste holen, um die "must have" -Fix zu holen, die er gestern gemacht hat, aber keine Chance hatte, gegen den Meister zu testen.
Zurück zur ursprünglichen Frage. Muss zwischen dVCS und zentralisiertem VCS unterschieden werden? Sie sagen, dass halb-implementierte Features und Bugfixes nicht im dVCS-Fall in das zentrale Repository gelangen, aber ich würde behaupten, dass es keinen Unterschied geben muss.
Ich habe viele Fälle gesehen, in denen eine halb-implementierte Funktion auf einer Entwicklungsbox eines Entwicklers bleibt, wenn zentralisiertes VCS verwendet wird. Es erfordert entweder eine Richtlinie, die ermöglicht, dass halb geschriebene Merkmale in den Hauptstrom eingecheckt werden, oder es muss eine Entscheidung getroffen werden, um eine zentrale Verzweigung zu erstellen.
In der DVCS kann das gleiche passieren, aber die gleiche Entscheidung sollte getroffen werden. Wenn es wichtige, aber unvollständige Arbeiten gibt, müssen diese zentral gespeichert werden. Der Vorteil von git ist, dass die Erstellung dieses zentralen Zweigs fast trivial ist.