Git - Welche Probleme ergeben sich aus der Arbeit direkt am Master?

25

Ich habe viele Ratschläge zu Git-Verzweigungsmodellen erhalten, und die gängigste Meinung scheint zu sein, dass es eine schlechte Idee ist, Änderungen direkt in der Master-Verzweigung vorzunehmen.

Einer unserer Mitarbeiter ist sehr froh, Änderungen direkt in der Hauptniederlassung vornehmen zu können, und trotz mehrerer Gespräche ist es unwahrscheinlich, dass dies geändert wird.

Zum gegenwärtigen Zeitpunkt kann ich einen Mitarbeiter, der eine schlechte Praxis ist, nicht davon überzeugen, direkt am Meister zu arbeiten, aber ich möchte die Dinge verstehen, die mit seiner Arbeitsweise in Konflikt stehen, um zu wissen, wann ich noch einmal darüber nachdenken muss dieses Problem.

linuxunil
quelle
2
Definieren Sie "direkt arbeiten". Der Meister existiert, weil er benutzt werden soll. Wofür denkst du, und wofür nicht?
candied_orange
3
Arbeitet die Arbeit des Meisters für Sie? Wenn ja, warum müssen Sie sich gerade jetzt ändern? Wenn es nicht funktioniert, welche Probleme haben Sie? Anstatt von Personen zu verlangen, dass sie Sie auf die Argumente anderer verweisen, können wir Ihnen bei der Lösung Ihrer Probleme helfen.
Thomas Owens
1
Klingt so, als würde er Rumpfentwicklungen durchführen, was zusammen mit der kontinuierlichen Integration in einem agilen Team ganz normal ist. Wenn er so arbeiten möchte, müssen Sie WIP erzwingen, um sicherzustellen, dass nie zu viel Arbeit für ein Produkt gleichzeitig ausgeführt wird. Außerdem können Sie mithilfe der Funktionsumschaltung sicherstellen, dass der Master mit deaktivierten unvollständigen Funktionen freigegeben wird.
Herr Cochese
... wie groß ist das Team?
ZJR
@MrCochese Ich würde Stammentwicklung hier nicht als "normal" bezeichnen. Keiner der vielen Orte, an denen ich Git benutzt habe, hat so funktioniert, und ich würde davon abraten. Feature-Zweige funktionieren einfach besser.
Marnen Laibow-Koser

Antworten:

57

Es gibt verschiedene Probleme, wenn Commits direkt an Master gesendet werden

  • Wenn Sie einen Status "In Bearbeitung" auf "Remote" verschieben, ist der Master möglicherweise defekt
  • Wenn ein anderer Entwickler vom Master die Arbeit für ein neues Feature aufnimmt, beginnt er mit einem möglicherweise fehlerhaften Zustand. Dies verlangsamt die Entwicklung
  • Unterschiedliche Features / Bugfixes werden nicht isoliert, so dass die Komplexität aller laufenden Entwicklungsaufgaben in einem Zweig zusammengefasst wird. Dies erhöht den Kommunikationsaufwand zwischen allen Entwicklern
  • Sie können keine Pull-Anforderungen ausführen, die einen sehr guten Mechanismus für die Codeüberprüfung darstellen
  • Sie können Commits nicht quetschen / den Git-Verlauf im Allgemeinen ändern, da andere Entwickler in der Zwischenzeit möglicherweise bereits den Master-Zweig gezogen haben
Gernot
quelle
11
Guck mal! Sie haben die Frage tatsächlich beantwortet, im Gegensatz zu allen anderen. ++ Willkommen bei SE.SE!
RubberDuck
Die meisten dieser Probleme ergeben sich aus der schlechten Arbeit direkt am Master , nicht aus der Arbeit direkt am Master an sich.
Ant P
1
@AntP Welche Probleme könnten aus Ihrer Sicht verhindert werden?
Gernot
10

Erklären Sie ihm, dass für neue Funktionen ein eigener Entwicklungszweig erforderlich ist, der in einer Testumgebung bereitgestellt werden kann, bevor er in die Produktion übernommen wird.

Andernfalls befinden Sie sich in einem fortwährenden Zustand der halbfertigen Funktionen. Sie können keine halbfertigen Features für die Produktion bereitstellen. Wenn Sie also direkt am Master-Zweig arbeiten, müssen alle anderen darauf warten, dass Sie Ihr Feature fertig stellen, bevor die Änderungen anderer in die Produktion gehen können, einschließlich Fehlerkorrekturen.

Durch die Verwendung unabhängiger Zweige für Features kann jedes neue Feature unabhängig von den anderen getestet und bereitgestellt werden.

Robert Harvey
quelle
"Sie können keine halbfertigen Features für die Produktion bereitstellen" - das ist überhaupt nicht der Fall - es ist durchaus möglich, direkt in der Hauptniederlassung zu arbeiten, jeden Commit zu codieren, häufig "halbfertige Features" bereitzustellen und niemals etwas zu beschädigen . Bei Continuous Delivery geht es genau darum, die Bereitstellung von der Freigabe zu entkoppeln. Was auch dazu führt, dass viele andere organisatorische Probleme gelöst werden, die normalerweise mit halbwegs fehlerhaften technischen Lösungen angegangen werden. Manchmal ist dies mit Feature-Umschaltungen verbunden, aber normalerweise ist es möglich, 90% eines Features ohne sichtbare Verhaltensänderung zu erstellen und bereitzustellen.
Ant P
@AntP: Der Prozess, den Sie beschreiben, ist nicht das, was ich als "halbfertige Funktionen" bezeichnen würde. Solche Merkmale sind entweder getestet, produktionsfertige und verwendbar, oder sie werden von einem Feature - Schalter oder ähnliches bis zu dem Zeitpunkt versteckt , wie sie sind getestet, produktionsfertige und nutzbar. Sie liefern keine Funktionen aus, die nicht funktionieren.
Robert Harvey
Sie haben behauptet, dass neue Funktionen für Nicht-Master-Zweige entwickelt werden müssen, da Sie keine halbfertigen Funktionen bereitstellen können. Dies ist nicht der Fall. Sie können auf jeden Fall neue Features direkt auf dem Master entwickeln und den gesamten Code, der sich auf diese Features bezieht, an die Produktion senden, bevor das Feature vollständig ist, ohne andere Entwicklungen aufzuhalten.
Ant P
1
@AntP: Die eine Sache, die Feature-Zweige haben, die Ihre Technik nicht bieten kann, ist eine vollständige Abrechnung der Arbeit, die an einem bestimmten Feature durchgeführt wurde. In einigen Geschäften (insbesondere in meinen) ist diese Art der Rechenschaftspflicht kein Luxus, sondern eine Anforderung.
Robert Harvey
1
@AntP Wenn ich dich richtig verstehe, würde ich das als Rückschritt betrachten. Ich liebe gute Issue-Tracker und benutze sie ausgiebig, aber ich möchte, dass das VCS mir die Entwicklungshistorie von Features oder Codezeilen erzählt . Der Issue-Tracker kann die Geschichte der Geschäftsseite einer Änderung erzählen. Wenn mir das VCS jedoch nicht hilft, den Code selbst zu verfolgen und zu prüfen , funktioniert es nicht. Dies ist einer der Gründe, warum ich gegen eine stammbasierte Entwicklung bin: Es macht das VCS dumm, ohne dass ich einen kompensierenden Vorteil sehe. (Auch: Spröde Kupplung? Ein Merkmal ist eine Codeänderung.)
Marnen Laibow-Koser
2

Der Master sollte möglicherweise lösbar sein. Zeitraum. Es sollte keine halbfertige Arbeit im Master geben (es sei denn, sie ist mit einem Feature-Flag deaktiviert)

Nachdem dies gesagt wurde, habe ich gesehen, dass einige Teams ihren Fluss erschweren.

Die Nichtverwendung von PR bei der Integration in Master ist ein Fehler, da Entwickler nicht die Möglichkeit haben, zu entscheiden, wann die Integration stattfindet.

Ein einzelner Entwicklungszweig bringt sehr wenig Wert. Normalerweise kompliziert es die Dinge nur. Viele Feature-Zweige bringen viel Wert.

Das Erstellen von Zweigen für jede Umgebung (Entwickler, Test, Produkt) ist ein Fehler. Dies ist für git nicht möglich und sollte von der Release-Pipeline behandelt werden. Der exakt gleiche Build sollte für alle Umgebungen bereitgestellt werden, was unmöglich ist, wenn für jede Umgebung Zweige vorhanden sind.

Wenn ein Feature so groß ist, dass es in ein oder zwei Tagen nicht erledigt werden kann, sollten alle Arbeiten an einem Feature-Zweig in separaten Zweigen ausgeführt und in PR integriert werden.

Esben Skov Pedersen
quelle
Ich bin mit den meisten Ihrer Aussagen einverstanden, mit der Ausnahme, dass "der exakt gleiche Build für alle Umgebungen bereitgestellt werden sollte". Tatsächlich sollte eine Release-Pipeline im Allgemeinen in der Lage sein, verschiedene Builds in verschiedenen Umgebungen bereitzustellen und diese dann im Verlauf der Tests zu fördern. Wie gehen Sie damit um, wenn nicht mit unterschiedlichen Zweigen (oder zumindest unterschiedlichen Tags)?
Marnen Laibow-Koser
Vielleicht war ich nicht ganz klar. Sobald ein Build in einer Umgebung bereitgestellt wurde. Dieselben Artefakte sollten ohne Neuerstellung in der nächsten Umgebung bereitgestellt werden.
Esben Skov Pedersen
Wenn Sie wiederholbare Builds haben, sollte es keine Rolle spielen, ob Sie neu erstellen. Wenn Sie keine wiederholbaren Builds haben, treten größere Probleme auf. :)
Marnen Laibow-Koser
... aber ja, ich denke, Sie sollten Ihre bereitgestellten Commits kennzeichnen, damit Sie denselben Code bewerben können (unabhängig davon, ob Sie ihn neu erstellen).
Marnen Laibow-Koser
Ja, aber die meisten CI-Server können Builds mit sofort einsatzbereiten Releases verknüpfen, um die Nachverfolgung von Bereitstellungen zu vereinfachen. Bei korrekter Einrichtung ist es nicht wirklich erforderlich, Bereitstellungen in Git zu verfolgen. Git ist ein scm. Kein Bereitstellungstool.
Esben Skov Pedersen
2
  • Der Master sollte einen Produktionszweig widerspiegeln, eine funktionierende endgültige Version.
  • Direkt im Master zu arbeiten bedeutet, dass Sie beim Erstellen von Fehlern keine andere Option zum "Zurückgehen" haben, als Commits rückgängig zu machen, zu löschen oder zurückzusetzen. Dies ist keine saubere Arbeitsweise und kann dazu führen, dass Sie die Teile des neuen Codes verlieren waren ok
  • Natürlich können Sie in den ersten Phasen der Entwicklung möglicherweise direkt mit der Arbeit am Master beginnen, aber nachdem Sie etwas zu liefern haben, sollten Sie Entwicklungs-, Test- oder Experimentzweige verwenden, um die veröffentlichte, vollständige Arbeitsversion nicht zu berühren.
Tulains Córdova
quelle
2

Zunächst möchte ich darauf hinweisen, dass in git jede pullOperation im wahrsten Sinne des Wortes eine Verzweigungsoperation und jede pusheine Zusammenführung ist. Der masterOn-Developer-Rechner ist ein völlig separater Zweig des masterOn-Central-Repo, den Sie gemeinsam nutzen, und aus technischer Sicht gleichberechtigt. Ich werde gelegentlich meine lokale Version umbenennen upstreamoder so, wenn es meinen Zwecken besser entspricht.

Ich weise darauf hin, weil viele Unternehmen der Meinung sind, dass sie Niederlassungen effektiver nutzen als Ihr Kollege. In Wirklichkeit tun sie jedoch nicht viel mehr, als einen zusätzlichen Namen für eine Niederlassung zu erstellen, der ohnehin nicht im Verlauf gespeichert wird. Wenn Ihr Kollege Features in einem atomaren Commit festschreibt, ist das Zurücksetzen genauso einfach wie das Zusammenführen eines Feature-Zweigs. Die überwiegende Mehrheit der Feature-Zweige sollte ohnehin sehr kurzlebig sein und häufig zusammengeführt werden.

Davon abgesehen sind die Hauptnachteile seines Arbeitsstils zweierlei. Erstens ist es sehr schwierig, an einem noch nicht abgeschlossenen Feature zusammenzuarbeiten. Es ist jedoch nicht schwierig, eine Zweigstelle genau zu den Zeitpunkten zu erstellen, zu denen eine Zusammenarbeit erforderlich ist.

Zweitens ist eine Überprüfung vor dem Zusammenführen sehr schwierig. In diesem Punkt müssen Sie ihn eigentlich nicht überzeugen. Sie können ein Tool wie github, gerrit oder gitlab übernehmen und Pull-Request-Code-Überprüfungen und bestandene automatisierte Tests für alle Zusammenführungen anfordern. Wenn Sie so etwas nicht tun, nutzen Sie git ehrlich gesagt nicht mit vollem Potenzial, und es ist kein Wunder, dass Ihr Kollege dieses Potenzial nicht sieht.

Karl Bielefeldt
quelle
1
Außerdem ist es ein gutes Backup, wenn der Entwickler jeden Tag seinen Zweigcomputer pusht.
Ian
Ich verstehe dein erstes Alter nicht. Ich verstehe nicht, wie ein pullneuer Zweig erstellt oder wie pushein Zusammenführungsvorgang sein würde. Vielmehr ist eine pullist ganz wörtlich ein , fetchgefolgt von einem merge!
mkrieger1
@mkrieger1 Ich kann leicht erkennen, wie man das Lokal masterals eine andere Branche ansehen könnte origin master. Technisch gesehen handelt es sich um verschiedene Zweige auf zwei verschiedenen Fernbedienungen, von denen jede ihre eigene Geschichte hat.
RubberDuck
@RubberDuck Ja genau. Mit pull: Vorher: zwei Zweige, die möglicherweise auf unterschiedliche Festschreibungen verweisen - Nachher: ​​zwei Zweige, die auf gleichwertige Festschreibungen verweisen - Keine Zweige erstellt, daher würde ich es keine "Verzweigungsoperation" nennen. Wenn einer der beiden Befehle, würde ich das aufrufen push, weil es möglicherweise einen neuen Zweig in der Fernbedienung erstellt. Was es nicht tut, ist eine Verschmelzung.
mkrieger1
@ mkrieger1 du musst auch die Richtung der Zusammenführung berücksichtigen .
RubberDuck
2

In anderen Antworten wurden bereits verschiedene Vorteile genannt (isolierte Funktionen, immer versandbarer Code auf dem Master usw.), wenn NICHT direkt auf dem Master gearbeitet wird.

Für mich scheinen Sie ein anderes Problem zu haben. Offensichtlich haben Sie keinen Entwicklungsprozess, der von all Ihren Entwicklern genehmigt oder verwendet wird (oder der von Ihrem Entwickler ignoriert wird).

Haben Sie Feature-Zweige, die zum Master zusammengeführt werden, oder haben Sie auch andere Release-Zweige oder verwenden Sie einen völlig anderen Prozess?

"Verwenden Sie nicht den Master-Zweig" ist nicht ausreichend.

Simon
quelle
2

Einer unserer Mitarbeiter ist sehr froh, Änderungen direkt in der Hauptniederlassung vornehmen zu können, und trotz mehrerer Gespräche ist es unwahrscheinlich, dass dies geändert wird.

Dies lässt mich glauben, dass es weitere Probleme gibt. Das Arbeiten am Master oder nicht ist größtenteils Teil einer größeren Philosophie darüber, wie, was und wann Sie Produkte veröffentlichen.

Also in Verbindung mit "Sie sollten nie am Master arbeiten", haben Sie Tests der Funktionen, testen Sie die Arbeit des jeweils anderen, überprüfen Sie den Code des jeweils anderen. Abnahme- und Integrationstests.

Wenn Sie keines der oben genannten haben und es nur tun, um "do git" zu tun, können Sie genauso gut am Meister arbeiten.

Pieter B
quelle
1

Es gibt keine "schlechte Praxis", direkt an der Niederlassung zu arbeiten. Sie müssen sich jedoch entscheiden, was Ihren Prozess am besten unterstützt:

Frage 1: Sollte Ihr Master den aktuellen Release-Stand Ihrer Software darstellen? Dann sollten Sie einen globalen Entwicklungszweig einführen und die Entwicklung am Ende einer Release-Entwicklung zusammenführen.

Frage 2: Möchten Sie einen Codeüberprüfungsprozess durchführen lassen? Dann sollten Sie "Feature-Zweige" haben, die über Pull-Anforderungen in Master-Zweige (oder, falls vorhanden, in Entwicklungszweige) eingebunden werden.

Frage 3: Müssen andere Entwickler den Zwischencode-Status freigeben, der noch nicht in der Produktion (oder im Test) veröffentlicht werden soll? In diesem Fall entwickelt mehr als ein Entwickler ein Feature. Dann sollten Sie "Feature Branches" einführen.

oopexpert
quelle
Tags sind eine sehr nützliche Möglichkeit, den Status einer Codebasis bei der Veröffentlichung darzustellen. Git macht es sehr einfach, ein bestimmtes Tag auszuchecken. Macht einen Dev-Branch zum Moot.
RubberDuck