Wann sollte ich aufhören, mich für neue Projekte zu engagieren?

26

Wann immer ein neues Projekt beginnt, ist es normalerweise sinnvoll, sich direkt an den Master zu wenden, bis Sie etwas "Stabiles" haben, und dann in Zweigen zu arbeiten.

Zumindest mache ich das normalerweise so. Gibt es eine Möglichkeit, Zweige sofort nach dem zweiten Festschreiben zu starten? Ist es sinnvoll, dies so zu tun? "Initial Commit" wird natürlich immer auf Master bleiben, aber wann wird es dann der richtige Zeitpunkt sein, um Verzweigungen für neue Funktionen zu erstellen?

Droogans
quelle

Antworten:

23

Sofort.

Der Schlüssel ist die Frage, wie die Richtlinie für den Meister lautet. Bei git ist die Verzweigungsrichtlinie für Master in der Regel die Version mit der Buildable Stable. Manchmal ist Master die Hauptlinie, auf der Zweige erstellt und zusammengeführt werden, bevor sie zu einem Release-Zweig zusammengeführt werden. Hierbei handelt es sich um zwei unterschiedliche rollen- / politische Ansätze.

Es ist häufig eine Fehlerquelle für die Mitarbeiter, die Rolle oder die Richtlinie eines Zweigs während des gesamten Projekts zu ändern. Es ist für einen Einzelentwickler einfacher, diese Änderungen den Mitwirkenden mitzuteilen, aber der Versuch, ein Dutzend Programmierer dazu zu bringen, zu erkennen, dass "Master jetzt 1.0 ist, bitte Funktionen verzweigen, anstatt dass alle darauf drängen".

Ich habe den oben genannten politischen Ansatz angesprochen. Die Richtlinie für Master lautet, dass es sich um die baubare stabile Version handelt. Überprüfung in kleinen inkrementellen Änderungen in diesem Fall müssen Sie nicht etwas haben , bebaubare stabil zu allen Zeiten. Das Nichteinchecken kleiner Änderungen steht im Widerspruch zu den "vielen kleinen (aber vollständigen) Eincheckvorgängen", bei denen es sich in der Regel um die beste Vorgehensweise handelt (und die durch eine einfache Verzweigung gefördert wird).

Aus rollenbasierter Sicht haben Sie damit begonnen, dass der Master Haupt-, Freigabe-, Wartungs- und Entwicklungsrollen ist, und dann wird die Entwicklungs- und Wartungsrolle irgendwann auf Zweigstellen verlagert. Dies bedeutet wiederum eine Änderung der Zulässigkeit für den Master und kann die Mitwirkenden verwirren, wo die Dinge hingehören. Dies kann auch die Filialhistorie (leicht) verwirren und zu großen Commits anregen, die größere und schwer zu verstehende Zusammenschlüsse bedeuten.

Geben Sie die Rollen und Richtlinien für die Zweige von Anfang an einfach und konsistent ein.

Dieser "Zweig zur Richtlinienänderung" ist in den Verzweigungsmustern zu sehen . Die Idee, dass jeder Zweig Rollen hat, können Sie in Advanced SCM Branching Strategies nachlesen . Beide sind sehr gut zu lesen.


quelle
3
Ich stimme dem größtenteils zu, aber ich würde nicht einfach sagen, baubar , ich würde sagen, lösbar (stabil). Der Master sollte keinen Code enthalten, der nur erstellt wird. Er sollte Code enthalten, der gründlich getestet wurde. Sie sollten jederzeit in der Lage sein, vom Meister zurückzutreten, in der Gewissheit, dass es keine schwerwiegenden Mängel gibt.
Aaronaught
Ich stimme Aaronaught voll und ganz zu, da es meiner Meinung nach durchaus möglich (und nach bewährten Methoden) ist, so zu arbeiten, dass der Schritt von einem baubaren Zustand zum nächsten immer nur eine kleine inkrementelle Änderung ist, niemals eine große.
Doc Brown
1
@MichaelT Ich habe schon oft 'dev'-Zweige gesehen, habe sie aber noch nie im Zusammenhang mit einem "frühen Master" erklärt bekommen. Ich denke, ich werde das nutzen, danke.
Droogans
13

Es gibt hauptsächlich zwei Situationen, in denen Sie normalerweise mit Zweigen arbeiten möchten:

  • Wenn Sie oder Ihr Team ein neues Feature starten müssen, bei dem die geringste Wahrscheinlichkeit besteht, dass es nicht zum nächsten Release (möglicherweise dem ersten Release überhaupt) hinzugefügt wird, starten Sie die Entwicklung in einem separaten Feature-Zweig

  • Wenn Sie Korrekturen für schwerwiegende Fehler in der neuesten Version bereitstellen müssen und eine neue Fehlerbehebungsversion erstellen möchten, die nur diese Korrekturen, jedoch keine neu entwickelten (und möglicherweise instabilen) Funktionen enthält

Für solche Entscheidungen halte ich es für hilfreich, immer an "neue Funktionen" oder "Bugfixes" zu denken, ab dem Punkt, an dem Sie eine erste kompilierbare / ausführbare Version Ihres Programms haben.

Michael Feathers listet vier Gründe für eine Änderung in seinem berühmten Buch auf, aber ich würde "Ressourcen optimieren" unter "Zweig neuer Features" (für ein nicht funktionierendes Feature) und "Design verbessern", die meisten Male auch unter "Zweig neuer Features" , da IMHO sollte man nie das Design verbessern, wenn dies nicht zum Zwecke der Erleichterung der Implementierung eines bestimmten Features gedacht ist .

Doc Brown
quelle
12

Wenn Sie git-flow folgen - und ehrlich gesagt, ich denke, Sie sind verrückt, wenn Sie Git verwenden und dieses Verzweigungsmodell nicht verwenden -, sollten Sie sich niemals festlegen, masterbis Sie tatsächlich für eine öffentliche Veröffentlichung bereit sind.

Ihr erstes Commit für mastersollte ein leeres Repository sein. Ihr nächster Commit für mastersollte ein Merge-Commit aus dem developZweig oder einem Zweig für temporäre Releases sein und sollte stabil, getestet und bereit für die Bereitstellung (wenn es sich um eine Anwendung handelt) oder die öffentliche Verteilung (wenn es sich um eine Bibliothek handelt) sein.

Es gibt andere Verzweigungsmodelle für Git, aber die meisten sind von älteren zentralisierten SCM-Modellen abgeleitet und können in einer DVCS-Umgebung zu schwerwiegenden Problemen führen. Sie müssen die git-flow-Erweiterung nicht wirklich verwenden, und Sie brauchen nicht unbedingt alle diese Release- / Hotfix- / Feature-Zweige, aber das Nötigste ist developund master, und instabiler Code geht hinein develop.

Aaronaught
quelle
Sie müssen nicht einmal das erste Mal festlegen master. Denken Sie daran, dass masterdas nichts Besonderes ist, es muss nicht da sein. Sie können nur einen Entwicklungszweig haben, bis Sie ein Release erstellen möchten.
Miles Rout
2
@MilesRout: Obwohl dies im Prinzip zutrifft, können Sie keine Zusammenführung durchführen, es sei denn, der Zweig existiert bereits, und der Prozess schreibt vor, dass jede Übergabe an den Master eine Zusammenführung ohne schnellen Vorlauf sein soll. Wenn ich nichts verpasse, besteht die einzige Alternative zu einem anfänglichen leeren Commit darin, den Master eines beliebigen Entwicklungs- oder Release-Zweigs abzuspalten. Dies würde bedeuten, dass sie dasselbe Commit teilen, was von Ihnen angenommen wird vermeiden.
Aaronaught
1
Ah, das ist in der Tat ein guter Punkt. +1 zum Posten und Kommentieren.
Miles Rout
1

Neal Ford von Thoughtworks befürwortet die Verwendung von Feature-Toggles über Verzweigungen, um das Problem der "Höllenverschmelzung" zu vermeiden. Betrachten Sie den Fall, in dem zwei Programmierer täglich pflichtbewusst aus dem Hauptzweig hervorgehen und einer der Programmierer in einigen Wochen erhebliche Änderungen vornimmt und sich dann verpflichtet. Der andere Programmierer könnte in der Hölle der Verschmelzung enden. Um dieses Problem zu vermeiden, empfiehlt Ford, "den Schmerz nach vorne zu bringen" (ein bekanntes, agiles Attribut), indem nur ein Zweig vorhanden ist und sich täglich darauf einlässt. Zusätzliche Funktionen werden über Funktionsschalter hinzugefügt, mit denen die Funktion deaktiviert wird, bis sie vollständig getestet wurde.

Diese Methode scheint am besten in einer Umgebung zu funktionieren, in der die kontinuierliche Zustellung implementiert wird, da Probleme mit einem Commit sofort erkannt werden.

Steve Emmerson
quelle
1

Seit der letzten Antwort auf diese Frage sind zwei Jahre vergangen, und ich denke, jetzt ändert sich die Geschichte. Für mich lautet die Antwort "Wann immer Sie die Quellcodeverwaltung verwenden, um Versionen zu verfolgen."

Heutzutage funktioniert das Verfolgen von Projektversionen mit Quellcodeverwaltung nicht immer. (Verwenden Sie beispielsweise npm, um Abhängigkeiten zu verwalten und semantische Versionen mit '^' anzugeben.) In diesem Fall ändern sich die Projektartefakte jedes Mal, wenn ein Build ausgeführt wird, und müssen nicht jedes Mal den Quellcodeänderungen entsprechen. Um diese neuen Herausforderungen zu meistern, haben einige Teams bereits Artefakte erstellt, die im Artefakt-Kontrollsystem (z. B. JFrog Artifactory) für Track-Projektversionen gespeichert sind.

Wenn Sie bereits über eine Versionskontrolle für Artefakte verfügen, würden Sie natürlich keinen 'Produktionscode' aus einer GIT-Verzweigung ziehen und diese erstellen / in der Produktion bereitstellen. Stattdessen konsultieren Sie das Artefaktkontrollsystem, um direkt ausführbare Versionen für die Bereitstellung zu erhalten. In solchen Fällen verliert der Begriff „Release Branch“ plötzlich seine Bedeutung. Und wenn Ihr Team beschließt, git branch nicht mit der Release-Version zu verknüpfen, wird das Festschreiben / Pushen direkt an den Master wieder zu einer guten Wahl: Es wird als Standardzweig verwendet, sobald das Repo geklont wird. Dies erfolgt automatisch, da die Semantik weithin akzeptiert und gut kommuniziert ist Änderungen. Dennoch sollten Sie, wie die akzeptierte Antwort nahelegt, Zweigstellen einschließlich Master eine Zuweisungsrolle zuweisen und diese Zweigstellen nur für diese bestimmten Rollen verwenden.

Zuletzt gehe ich noch einen Schritt weiter und schlage vor, master als Entwicklungszweig in Projekten mit nur wenigen Core-Committern zu verwenden. Dies gilt für mein Team und wahrscheinlich auch für die meisten Mikrodienstleistungsgeschäfte. Das Festschreiben des Masters beseitigt die Kommunikation des Änderungsprozesses und vermeidet möglicherweise das "Zusammenführen der Hölle", wenn an Features über mehrere Sprints hinweg gearbeitet wird. Außerdem muss der Code in der Hauptniederlassung nicht einmal "funktionieren", der automatisierte Build / Test-Prozess zeigt Ihnen, was schief gelaufen ist, und es ist sowieso einfach genug, den Git-Verlauf zu überprüfen und den Autor zu kontaktieren, der den Build / Test abgebrochen hat :-)

Shawn
quelle
0

Ich werde eine radikale Position einnehmen: Verzweigen Sie sich auf jede Idee. Zunächst in Git Filialen sind billig, die Hauptkosten einer Filiale ist daran zu erinnern, was ist für. Ich stimme auch zu, dass das erste Commit to Master ein Release Candidate ist. Ich empfehle mit einer Proof-of-Concept-Branche zu beginnen. Wenn Sie Ihr Konzept bewiesen haben, können Sie es mit Ihrem leeren Entwicklungszweig zusammenführen oder neu schreiben, je nachdem, wie gut Ihr erster Versuch ist. Ab diesem Punkt verzweigen Sie für jeden Fehler, jedes Feature, jede Abstraktion usw. von Devel.

hildred
quelle