Kopfschmerzen mit verteilter Versionskontrolle für traditionelle Teams?


20

Obwohl ich DVCS für meine persönlichen Projekte verwende und mag, kann ich sehen, wie es die Verwaltung von Beiträgen zu Ihrem Projekt durch andere erleichtert (z. B. Ihr typisches Github-Szenario), scheint es für ein "traditionelles" Team Probleme zu geben Zentraler Ansatz für Lösungen wie TFS, Perforce usw. (Mit "traditionell" meine ich ein Entwicklerteam in einem Büro, das an einem Projekt arbeitet, das niemand "besitzt", wobei möglicherweise jeder den gleichen Code berührt.)

Ein paar dieser Probleme habe ich selbst vorausgesehen, aber bitte stimmen Sie mit anderen Überlegungen überein.

Wenn Sie in einem herkömmlichen System versuchen, Ihre Änderungen auf dem Server einzuchecken, müssen Sie eine Zusammenführung durchführen, bevor Sie Ihre Änderungen einchecken können. Im DVCS-Modell checkt jeder Entwickler seine Änderungen ein wechselt lokal und drückt irgendwann auf ein anderes Repo. Das Repo hat dann einen Zweig dieser Datei, den 2 Personen geändert haben. Es scheint, dass jetzt jemand dafür verantwortlich gemacht werden muss, mit dieser Situation umzugehen. Eine bestimmte Person im Team verfügt möglicherweise nicht über ausreichende Kenntnisse der gesamten Codebasis, um alle Konflikte zusammenführen zu können. Es wurde nun ein zusätzlicher Schritt hinzugefügt, bei dem sich jemand an einen dieser Entwickler wenden und ihn anweisen muss, die Zusammenführung vorzunehmen und sie dann erneut auszuführen (oder Sie müssen eine Infrastruktur aufbauen, die diese Aufgabe automatisiert).

Da DVCS dazu neigt, die Arbeit vor Ort so komfortabel zu gestalten, ist es wahrscheinlich, dass Entwickler vor dem Push einige Änderungen an ihren lokalen Repos vornehmen, wodurch solche Konflikte häufiger und komplizierter werden.

Wenn jeder im Team nur an verschiedenen Bereichen des Codes arbeitet, ist dies offensichtlich kein Problem. Aber ich bin neugierig auf den Fall, dass alle an demselben Code arbeiten. Es scheint, als ob das zentralisierte Modell die schnelle und häufige Bearbeitung von Konflikten erzwingt, wodurch der Bedarf an umfangreichen, schmerzhaften Zusammenführungen auf ein Minimum reduziert wird und jeder das Hauptrepertoire "polizeilich" abdeckt.

Wie gehen Sie mit solchen Fällen um, wenn Sie mit Ihrem Team in Ihrem Büro ein DVCS verwenden? Finden Sie Ihren täglichen (oder eher wöchentlichen) Workflow negativ beeinflusst? Gibt es noch andere Überlegungen, die ich berücksichtigen sollte, bevor ich ein DVCS an meinem Arbeitsplatz empfehle?


Das ist eine hervorragende Frage. Die Art und Weise, wie Sie das Problem beschrieben haben, ist (unter anderem) der Hauptgrund, warum ich nicht in Betracht ziehe, DVCS mit meinem Team zu verwenden (zum Glück - oder auch nicht - bin ich in der Lage, einen solchen Anruf zu tätigen).
Alex

Meine Erfahrungen und Gefühle sind Ihren sehr ähnlich.
William Payne

Antworten:


26

Wir verwenden Mercurial seit ungefähr einem Jahr. Obwohl die von Ihnen erwähnten Kopfschmerzen bestehen, bestand die größte Herausforderung für die vollständige Übernahme für uns darin, in die DVCS-Denkweise lokaler Repositorys einzusteigen (= häufig festschreiben). Die alte Denkweise von "Festschreiben, sobald Sie Code poliert haben" kann schwer zu lassen sein gehen.

Du sagtest:

Im DVCS-Modell checkt jeder Entwickler seine Änderungen lokal ein und wechselt irgendwann zu einem anderen Repository. Das Repo hat dann einen Zweig dieser Datei, den 2 Personen geändert haben. Es scheint, dass jetzt jemand dafür verantwortlich gemacht werden muss, mit dieser Situation umzugehen.

Eine Standardinstallation von Mercurial blockiert dieses Verhalten. Es ist kein Push möglich, wenn im Remote-Repo mehr als ein Kopf erstellt wird, ohne dass eine zusätzliche Bestätigung erforderlich ist. Bei täglichen Aktivitäten vermeiden wir das. (Git hat Heads benannt und jedes kann nur aktualisiert werden, wenn es die vorherige Version ohne zusätzliche Bestätigung vollständig zusammenführt, so dass die Situation nicht wieder auftauchen kann. Die anderen DVCS haben ebenfalls einen ähnlichen Schutz.)

Am Ende eines jeden Arbeitstages muss also etwas Zeit für das Festschreiben eingeplant werden. Dies sind in Wirklichkeit die folgenden Aktivitäten:

  1. Übernehmen Sie lokale Änderungen.
  2. Aus dem Zentralrepo ziehen.
  3. Zusammenführen (& Zusammenführen festschreiben.)
  4. Push to Central Repo.

Auf diese Weise bleibt die Zusammenführungsaktivität für eine Person erhalten, die kürzlich an diesem Code gearbeitet hat, und sie sollte in der Lage sein, ihre Änderungen so schnell wie alle anderen zu integrieren.

Wie in der Frage ausgeführt, erhöht dies nur dann den Aufwand, wenn zwei Personen im selben Codebereich arbeiten. Wenn dies der Fall ist, hat die Verwendung von DVCS ohnehin mehr Vorteile, sodass die Auszahlung für diese Entwickler bereits offensichtlich ist. (Zusätzliche Vorteile sind, dass jeder Entwickler Code separat festschreiben und mit seinem eigenen Repo spielen kann, ohne dass ein anderer Entwickler im Weg steht.)

Ein weiteres Problem, das Sie erwähnen:

Da DVCS dazu neigt, die Arbeit vor Ort so komfortabel zu gestalten, ist es wahrscheinlich, dass Entwickler vor dem Push einige Änderungen an ihren lokalen Repos vornehmen, wodurch solche Konflikte häufiger und komplizierter werden.

Dies führt für uns nicht zu einem Zusammenführungsproblem, kann jedoch zu einem anderen Problem führen:

Die Flexibilität von DVCS bedeutet, dass viele verschiedene Arbeitsabläufe möglich sind, von denen einige unverantwortlich sind. Mit DVCS steigt der Bedarf an klaren Prozessen oder Prozeduren. Die Aktivität, lokale Änderungen beizubehalten, kann in Abhängigkeit von vielen Dingen angemessen sein oder auch nicht.

Zum Beispiel: Kann ein Entwickler in ein paar Wochen in seiner Freizeit an einem Haustier-Feature arbeiten? In einigen Umgebungen wird dies empfohlen, in einigen wäre dies unangemessen und alle Änderungen sollten bald zentralisiert werden. Aber wenn ein Entwickler Änderungen vor Ort behält, wird er sicherlich alle damit verbundenen Änderungen übernehmen wollen, um sicherzustellen, dass seine Arbeit mit der neuesten gemeinsamen Version weiterhin gut funktioniert.

Wenn der Gummi auf die Straße kommt, stammen die Software-Releases oder -Bereitstellungen normalerweise aus einem zentralen Repository, sodass Entwickler ihre Änderungen zum Testen und Bereitstellen dort abrufen müssen.

Das ist meine Geschichte und ich halte mich daran, zumindest für ein paar Minuten ...


Das ist ziemlich gut. Das Verzweigen kann die Situation ebenfalls etwas komplexer machen.
Paul Nathan

4
Mit DVCS steigt der Bedarf an klaren Prozessen oder Prozeduren. mit großer macht geht große verantwortung einher.
Newtopian

5

Die Prämisse Ihrer Frage scheint zu lauten "Verschmelzungen sind schwierig und müssen vermieden werden". DVCS-Systeme heben diese Barriere auf. Tatsächlich tun sie mehr, als nur die Idee des Zusammenführens zu akzeptieren. Sie sollten sich nicht vor Zusammenführungen und Zusammenführungskonflikten fürchten, da die DVCS-Tools im Gegensatz zu zentralisierten Tools dies konstruktionsbedingt unterstützen.

Wie die ausgezeichnete Antwort von Jamie F besagt, bedeutet ein regelmäßig (täglich) durchgeführter Commit-Pull-Merge-Push-Arbeitsablauf, dass Sie bei einigen anderen Arbeiten frühzeitig darauf achten, dass sie verwaltet werden können, solange sie sichtbar sind .

Die Probleme, die Sie beschreiben, beziehen sich eher darauf, wie Sie die Tools verwenden.

Wir sind vor 6 Monaten von SVN zu GIT gewechselt, nachdem wir SVN und GIT einige Jahre lokal verwendet haben. Niemand wird zurückkehren und schmerzhafte Zusammenführungskonflikte gehören der Vergangenheit an. Das Mantra "Klein und oft begehen" ist der Schlüssel.


3

Als ich in einem Team mit Git gearbeitet habe, lautete die Faustregel wie folgt: Arbeiten Sie in einer privaten Filiale. Wenn Sie dann bereit sind, Ihre Arbeit für den Rest des Teams verfügbar zu machen, richten Sie Ihre Filiale vor dem Push auf Master um. (Dann validieren Sie Ihre Filiale.)

Diese Strategie bedeutete, dass der Master eine lineare Reihe von Commits war und dass alle Integrationsprobleme in Zweigstellen repariert wurden, bevor sie öffentlich waren.


Das erneute Reduzieren von "ändert die Geschichte" und kann ein bisschen gefährlicher sein. Wenn die Rebase schlecht verläuft, haben Sie keine Aufzeichnungen mehr darüber, wie die Änderungen vor der Rebase ausgesehen haben. Aus diesem Grund würden viele Entwickler argumentieren, dass Sie stattdessen zusammenführen sollten. Sie verlieren die hübschen, geraden Linien, haben aber die Möglichkeit, eine fehlerhafte Zusammenführung erneut zu versuchen. Wenn Sie keine Änderungen vornehmen, bis alles erledigt ist, schützen Sie sich auch nicht vor Festplattenabstürzen oder anderen lokalen Katastrophen. Aber ich bin mir sicher, dass dieser Ansatz für viele Menschen immer noch funktioniert: wahrscheinlich viel besser als ein zentrales VCS.
StriplingWarrior

3

Ein Tool wie SVN fördert nachdrücklich eine eng integrierte Arbeitsweise.

Das heißt, häufiges Festschreiben an einem gemeinsam genutzten Zweig (entweder Trunk oder Dev-Zweig).

Dies ist A-OK für die meisten Unternehmensentwicklungsumgebungen, die ich erlebt habe, und wird durch die Verwendung von Continuous Integration, die durch umfangreiche Integrationstests, Regressionstests und Komponententests unterstützt wird, noch weiter erleichtert und gefördert irgendetwas durch ihre Änderungen).

DVCS gibt Ihnen die Freiheit, unabhängiger zu arbeiten, was Sie in einigen Situationen benötigen, und die (viel gepriesene) verbesserte Unterstützung für Zusammenführungen kann überhaupt nichts anrichten.

Die Sorge, die immer im Hinterkopf bleibt, ist folgende: Mit der großen Freiheit geht die Versuchung einher, diese Freiheit zu nutzen.

Sicherlich verbringe ich in meiner (begrenzten) Erfahrung viel mehr Zeit damit, selbständig in meinem aktuellen Team zu arbeiten (mit Mercurial) als in früheren Rollen (wo wir SVN, CVS und P4 verwendet haben).

Dies ist nur teilweise auf das Tool zurückzuführen, aber ich halte es für vernünftig, zu bemerken, dass Menschen ohne einen zwingenden Grund für die Aufwendung von Kommunikation und Koordination dazu neigen, getrennt und isoliert zu arbeiten.

Dies ist nicht unbedingt eine schlechte Sache, aber ich glaube, dass dies etwas ist, das berücksichtigt werden muss.


1

Die Sache mit der Versionskontrolle von Git / Mercurial ist, sich häufig zu verpflichten und auf einen zentralen Server zu pushen, wenn der Code gut ist. Ein großes Plus dabei ist, dass kleine Patches erstellt werden, die bei Konflikten einfach anzuwenden sind. Außerdem sollte Ihr Workflow Folgendes beinhalten:

  1. Viele Einheimische verpflichten sich
  2. Vom Server ziehen
  3. Push zum Server

Dieser Pull vom Server kann zu Konflikten führen. Um dies zu beheben, ist jedoch häufig nur ein einfacher Rebase anstelle einer Zusammenführung erforderlich. Dies wird meiner Meinung nach die Hauptgeschichte sauber halten und eine Menge Konflikte beseitigen.

Dies ist auch der Fall, wenn Sie aus dem lokalen Repo eines Mitarbeiters ziehen, da zwei Dinge passieren können. Entweder schiebt er zuerst auf den Server, was in Ordnung ist, da Sie bereits über seine Patches verfügen und keine Konflikte auftreten sollten, oder Sie schieben zuerst, was bedeutet, dass er Ihre Patches nur dann erhält, wenn er sie abruft.

Natürlich ist eine Zusammenführung manchmal die bessere Lösung, wenn Sie beispielsweise an einem Feature-Zweig arbeiten, der in master zusammengeführt werden soll.

In Ihrem Workflow geht es darum, dass Benutzer explizit zu einem anderen Entwickler gehen und ihn auffordern müssen, den Konflikt zu beheben. Dies sollte jedoch nicht erforderlich sein. Der zentrale Server ist der "Chef", gegen den Sie hauptsächlich arbeiten sollten. Wenn Ihre Änderungen auf das zentrale Repo zutreffen, ist dies in Ordnung. Wenn nicht, ist es IHRE Aufgabe, den Konflikt zu beheben. Dies kann dazu führen, dass der Entwickler, mit dem Sie in Konflikt geraten, seine / ihre Änderungen besser versteht. Dies ist etwas, was Sie sehen, wenn Sie versuchen, vom Server abzurufen / neu zu starten. Seien Sie also fröhlich und gehen Sie mit Konflikten um, wenn Sie vom Server ziehen sollten.


0

Das Prinzip der Arbeit mit dem zentralen Repository ist dasselbe, wenn Sie mit einem nicht sperrenden zentralen oder verteilten System arbeiten:

  • In einem zentralen System können Sie:
    1. Holen Sie sich die neueste Version von Mainline ("Trunk" in Subversion, "Master" in Git, ...)
    2. Ändern Sie die Dateien
    3. Führen Sie die Änderungen mit der neuesten Version aus der Hauptzeile mit dem Befehl "update" zusammen
    4. Festschreiben zur Hauptlinie
  • In einem verteilten System können Sie:
    1. Holen Sie sich die neueste Version von mainline
    2. Ändern Sie die Dateien
    3. Lokal festschreiben
    4. Führen Sie die Änderungen mit der neuesten Version von mainline zusammen und übertragen Sie das Ergebnis lokal
    5. Push to mainline.

In keiner verteilten Version können Sie eine Revision übertragen, die die vorherige Head-Revision nicht vollständig zusammenführt (ohne spezielle Überschreibung; manchmal ist dies nützlich), sodass der Zusammenführungsschritt nicht fehlschlägt (sodass es nicht zwei Versionen gibt) konsolidieren müssten).

Beachten Sie nun, dass bis auf die Terminologie vier der Schritte identisch sind, verteilte Systeme jedoch einen zusätzlichen Schritt "3. Lokal festschreiben" hinzufügen. Der große Vorteil dieses Schritts besteht darin, dass Sie zurückgehen und überprüfen können, was Sie getan haben, und die Zusammenführung wiederholen können, wenn beim Aktualisieren / Abrufen Konflikte auftreten und Sie nicht sicher sind, wie Sie diese beheben oder einen Fehler machen können. Subversion kann sich an keine dieser Änderungen erinnern. Wenn Sie also ein Update durchführen, das einen Fehler behebt, sind Sie fertig.

Wenn es darum geht, Änderungen zu akkumulieren, wird dies in der Regel auch mit einem zentralisierten System durchgeführt. Vor allem, wenn Sie häufig zwischen Funktionen wechseln müssen (z. B. längere Unterbrechungsarbeiten, um einen Fehler zu beheben, oder Anpassungen, die der Kunde dringend benötigt), müssen die Benutzer Änderungen häufig lokal speichern, nur weil sie noch nicht fertig sind. Es ist also besser, wenn das System es zumindest unterstützt, einen Sinn daraus zu machen.

In beiden Fällen müssen diese Probleme durch geeignete Richtlinien und Kommunikation im Team und nicht durch die Tools behoben werden. Bei flexibleren Tools sind die Richtlinien wichtiger, aber die flexibleren Tools ermöglichen eine bessere Adressierung verschiedener Eckfälle.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.