Ist die Verwendung von Git Stash als Workflow ein Gegenmuster?


25

Ich habe mir kürzlich angesehen, wie ich und mein Team Git verwenden und wie unsere Workflows funktionieren. Derzeit verwenden wir einen Feature-Branch-Workflow, der anscheinend gut funktioniert.

Ich habe auch einige Personen in unserem Team gesehen, die einen Workflow basierend auf git stash verwendet haben . Der Workflow sieht ungefähr so ​​aus:

  • Arbeit an einem Hauptzweig (wie master)
  • Machen Sie Commits, während Sie gehen
  • Wenn Sie Änderungen abrufen oder die Filiale wechseln müssen, legen Sie Ihre nicht festgeschriebenen Änderungen auf den Stash
  • Sobald Ihre Aktualisierung abgeschlossen ist, entfernen Sie die Änderungen aus dem Stash.

Ich sollte erwähnen, dass dieser Workflow anstelle eines Feature-Branch-Workflows verwendet wird. Anstatt einen Zweig zu nehmen und daran zu arbeiten, arbeiten die Entwickler hier immer nur an einem Zweig und stoßen den Stapel ab, wie sie es für richtig halten.

Ich halte das eigentlich nicht für einen großartigen Workflow, und eine Verzweigung wäre angemessener als die Verwendung von git stash auf diese Weise. Ich kann den Wert von git stash als Notfalloperation sehen, aber nicht für die Verwendung in einem täglichen, regelmäßigen Arbeitsablauf.

Würde die regelmäßige Verwendung von git stash als Anti-Pattern angesehen werden? Wenn ja, welche spezifischen Probleme könnten auftreten? Wenn nein, welche Vorteile ergeben sich daraus?


2
Sie können versuchen, Ihre Mitarbeiter zu fragen, ob sie Probleme mit dem Workflow haben. Wenn nicht, würde ich es nicht für schädlich halten.
AlexFoxGill

@AlexG Das ist ein gültiger Punkt. Ich stelle hier die Frage, ob es irgendwelche "Fallstricke" gibt, die Leute gefunden haben.
Joshin4colours

3
Wenn ich es richtig verstehe ... If you need to get changes or switch branches, push your uncommitted changes onto the stash- genau dafür ist der Stash da.

3
@MichaelT Meine lokale Niederlassung ermöglicht es alles. Bedingungslos.
Maaartinus

2
Mein Muster lautet: -> Verwenden Sie kein Git-Stash -> Verwenden Sie Feature-Zweige -> Speichern Sie die in Bearbeitung befindlichen Dateien mit der Commit-Meldung "wip". -> Interaktives Rebase auf dem Zweig, um die Wip's in ein sinnvolles Commit zu zerquetschen , aber nur für Ihre lokalen, nicht überarbeiteten Änderungen. -> Push to Remote -> Zusammenführen mit Master (und Push) entsprechend Ihrem Git-Workflow.
Michael Durrant

Antworten:


31

Aus dem Git SCM-Buch :

Wenn Sie an einem Teil Ihres Projekts gearbeitet haben, befinden sich die Dinge oft in einem chaotischen Zustand und Sie möchten die Zweige wechseln, um ein bisschen an etwas anderem zu arbeiten. Das Problem ist, dass Sie keine halbfertige Arbeit ausführen möchten, um später auf diesen Punkt zurückzukommen. Die Antwort auf dieses Problem ist der Befehl git stash.

Beim Stashing wird der Status Ihres Arbeitsverzeichnisses, dh der von Ihnen veränderten nachverfolgten Dateien und der bereitgestellten Änderungen, übernommen und auf einem Stapel nicht abgeschlossener Änderungen gespeichert, die Sie jederzeit erneut anwenden können.

Angesichts dieser Beschreibung würde ich sagen, dass dies ein Anti-Pattern ist. Eine zu vereinfachte Erklärung für Git Stash wäre, dass es sich um das "Ausschneiden und Einfügen" der Quellcodeverwaltung handelt. Sie nehmen eine Reihe geänderter Dateien, "verstecken" sie in einem Aufbewahrungsstift außerhalb des normalen Verzweigungs-Workflows von Git und wenden diese Änderungen zu einem späteren Zeitpunkt erneut auf einen anderen Zweig an.

Ein wenig weiter zurück zu gehen, sich dem Meister zu verpflichten, ist hier das Anti-Muster . Verwenden Sie Zweige. Dafür wurden sie entwickelt.

Es läuft wirklich darauf hinaus:

Sie können eine Schraube in die Wand hämmern und sie hält ein Bild hoch. Verwenden Sie jedoch einen Schraubendreher. Verwenden Sie keinen Hammer, wenn der Schraubendreher direkt neben Ihnen sitzt.

Über das Festschreiben von "defektem" Code

Während das Folgende eine Meinung ist, bin ich aus Erfahrung zu dieser Meinung gekommen.

Legen Sie früh fest und legen Sie häufig fest. Übernehmen Sie so viel fehlerhaften Code, wie Sie möchten. Zeigen Sie Ihren lokalen Festschreibungsverlauf als "Punkte speichern" an, während Sie sich auf etwas einlassen. Sobald Sie ein logisches Stück Arbeit erledigt haben, legen Sie ein Commit fest. Sicher, es könnte alles kaputt machen, aber das spielt keine Rolle, solange Sie diese Commits nicht forcieren . Bevor Sie pushen, müssen Sie Ihre Commits neu definieren und quetschen.

  1. Neuen Zweig erstellen
  2. Hack hack hack
  3. Defekten Code festschreiben
  4. Polieren Sie den Code und lassen Sie ihn funktionieren
  5. Arbeitscode festschreiben
  6. Rebase und Squash
  7. Prüfung
  8. Drücken Sie, wenn die Tests erfolgreich sind

Für das OP könnte dieser Linux-Kernnachrichtenthread von Interesse sein, da es sich so anhört, als würden einige Mitglieder des OP-Teams Git auf ähnliche Weise verwenden.

@RibaldEddie sagte in einem Kommentar unten:

Erstens ist ein Versteck nicht außerhalb eines "Verzweigungsworkflows", da ein Versteck unter der Haube nur ein weiterer Zweig ist.

(auf die Gefahr des Zorns vieler Menschen)

Linus sagte:

Mit "git stash" können Sie auch mehrere verschiedene versteckte Dinge haben, die sich jedoch nicht aneinander reihen - es handelt sich lediglich um zufällige unabhängige Patches, die Sie verstaut haben, weil sie irgendwann unpraktisch waren.

Was ich denke, dass @RibaldEddie versucht zu sagen, ist, dass Sie git stashin einem Feature-Zweig-Workflow verwenden können - und das ist wahr. Es ist nicht die Verwendung git stash, die das Problem ist. Es ist die Kombination aus Verpflichtung zum Beherrschen und Verwenden git stash. Dies ist ein Anti-Muster.

Klärung git rebase

Aus @ RibaldEddies Kommentar:

Das erneute Reduzieren ähnelt viel eher dem Einfügen von Kopien und ändert, noch schlimmer, den festgeschriebenen Verlauf.

(Betonung meiner)

Das Ändern des Commit-Verlaufs ist keine schlechte Sache, solange es sich um den lokalen Commit-Verlauf handelt . Wenn Sie Commits ablehnen, die Sie bereits gepusht haben, werden Sie im Wesentlichen jeden anderen verwaisen, der Ihre Filiale nutzt. Das ist schlecht.

Angenommen, Sie haben im Laufe eines Tages mehrere Commits durchgeführt. Einige Commits waren gut. Einige ... nicht so gut. Der git rebaseBefehl in Verbindung mit der Unterdrückung Ihrer Commits ist eine gute Möglichkeit, den lokalen Commit-Verlauf zu bereinigen. Es ist schön, ein Commit für öffentliche Zweige zu erstellen, da dadurch der Commit-Verlauf der gemeinsam genutzten Zweige Ihres Teams übersichtlich bleibt. Nach dem erneuten Basieren möchten Sie den Test erneut durchführen. Wenn die Tests jedoch erfolgreich abgeschlossen wurden, können Sie einen Clean Commit anstelle mehrerer Dirty Commits durchführen.

Es gibt einen weiteren interessanten Linux-Kernel-Thread zum Clean-Commit-Verlauf .

Wiederum von Linus:

Ich möchte eine saubere Geschichte, aber das bedeutet wirklich (a) sauber und (b) Geschichte.

Man kann (und wahrscheinlich sollte) ihre rebase privaten Bäume (eigene Arbeit). Das ist eine Bereinigung . Aber niemals Code anderer Völker. Das ist eine "Zerstörungsgeschichte"

Der geschichtliche Teil ist also ziemlich einfach. Es gibt nur eine Hauptregel und eine kleine Klarstellung:

  • Sie dürfen NIEMALS die Geschichte anderer Völker zerstören. Sie dürfen keine Commits ablehnen, die andere Personen ausgeführt haben. Grundsätzlich gilt: Wenn Sie sich nicht abmelden, ist dies nicht zulässig. Sie können keine Neuerstellung vornehmen, da dies nicht Ihre ist.

    Beachten Sie, dass es sich hier wirklich um die Geschichte anderer Völker handelt , nicht um den Kodex anderer Völker . Wenn sie dir etwas als Patch per E-Mail geschickt haben und du es mit "git am -s" angewendet hast, dann ist es ihr Code, aber es ist deine Geschichte.

    Sie können also wild auf die Sache mit der "Git-Rebase" gehen, obwohl Sie den Code nicht geschrieben haben, solange das Commit selbst Ihr privates ist.

  • Kleinere Erläuterungen zur Regel: Sobald Sie Ihren Verlauf auf einer öffentlichen Website veröffentlicht haben, wird er möglicherweise von anderen Personen verwendet. Jetzt ist er eindeutig nicht mehr Ihr privater Verlauf.

    Die kleine Klarstellung ist also, dass es nicht nur um "Ihr Commit" geht, sondern auch darum, dass es für Ihren Baum privat ist, und Sie haben es noch nicht veröffentlicht und angekündigt.

...

Jetzt ist der "saubere" Teil etwas subtiler, obwohl die ersten Regeln ziemlich offensichtlich und einfach sind:

  • Halten Sie Ihre eigene Geschichte lesbar

    Einige Leute tun dies, indem sie die Dinge nur im Kopf herausarbeiten und keine Fehler machen. Aber das ist sehr selten und für den Rest von uns verwenden wir "Git Rebase" usw., während wir an unseren Problemen arbeiten.

    "Git Rebase" ist also nicht falsch. Aber es ist nur richtig, wenn es IHR SEHR EIGENER PRIVATER Git-Baum ist.

  • Mach deinen Mist nicht sichtbar.

    Das bedeutet: Wenn Sie sich noch in der "Git Rebase" -Phase befinden, drücken Sie sie nicht heraus. Wenn es noch nicht fertig ist, senden Sie Patches herum oder verwenden private Git-Bäume (nur als "Ersatz für Patch-Serien"), von denen Sie der breiten Öffentlichkeit nichts erzählen.

(Hervorhebung von mir)

Fazit

Am Ende hat das OP einige Entwickler, die dies tun:

git checkout master
(edit files)
git commit -am "..."
(edit files)
git stash
git pull
git stash (pop|apply)

Hier gibt es zwei Probleme:

  1. Entwickler verpflichten sich zu meistern. Sperr das sofort ab. Das ist wirklich das größte Problem.
  2. Entwickler verwenden git stashand git pullon master ständig, wenn sie Feature-Zweige verwenden sollen.

Es ist nichts Falsches an der Verwendung git stash- besonders vor einem Pull -, aber git stashdiese Art der Verwendung ist ein Anti-Pattern, wenn Git bessere Workflows bietet.

Ihre Verwendung git stasheines roten Herings. Das ist nicht das Problem. Sich dem Meister zu verpflichten, ist das Problem.


4
Wow, das ist nicht richtig. Erstens ist ein Versteck nicht außerhalb eines "Verzweigungsworkflows", da ein Versteck unter der Haube nur ein weiterer Zweig ist. Die Idee, dass es sich um einen Workflow zum Kopieren und Einfügen handelt, macht keinen Sinn. Das erneute Reduzieren ähnelt viel eher dem Einfügen von Kopien und ändert, noch schlimmer, die festgeschriebene Historie. Schließlich ist Ihr Workflow völlig unbrauchbar, sobald Sie laufende Arbeiten an Kollegen weitergeben müssen, da er auseinanderfällt, sobald Sie Änderungen vornehmen. Wie diese sechs Stimmen hat, ist umwerfend.
RibaldEddie

8
@RibaldEddie: Es ist nichts Falsches daran, den Commit-Verlauf neu zu definieren und neu zu schreiben, solange es sich um den lokalen Commit-Verlauf handelt. Sobald Sie diese Zusagen gemacht haben, wäre Ihr Kommentar korrekt, aber lesen Sie meine Antwort noch einmal. Darin steht: "Bevor Sie loslegen, müssen Sie Ihre Commits rebasieren und quetschen." Das ist die lokale Commit-Historie, die vollständig unter Ihrer Kontrolle steht.
Greg Burghardt

1
@RibaldEddie: Ich habe meine Antwort geklärt. Es musste aufgeräumt werden.
Greg Burghardt

Ich werde in einer eigenen Antwort etwas mehr Kontext angeben.
RibaldEddie

Siehe meine Antwort unten - während es ein Anti-Muster ist, sich zum Meister zu verpflichten, ist es nicht das eigentliche Problem.
RibaldEddie

7

Ich persönlich benutze es nur stashfür kurze, unerwartete Unterbrechungen, wie wenn jemand eine Frage stellt, die den Wechsel in einen anderen Zweig erfordert. Ich mache das, weil ich vorher Stashes vergessen habe, dann würden sie nicht sauber angewendet. Regelmäßige Festschreibungen für Feature-Zweige sind viel schwerer zu vergessen und einfacher zusammenzuführen. git reset HEAD~1Daher tendiere ich jetzt dazu, nur eine unterbrochene Festschreibung zu erstellen und dann eine oder eine Neueinstufung vorzunehmen, wenn ich sie später nicht beibehalten möchte.

Das Tolle an der verteilten Versionskontrolle ist jedoch, dass Benutzer ihren bevorzugten Workflow in ihren eigenen Repositorys verwenden können, solange die freigegebenen Repositorys den Standards entsprechen. Ich würde sicherstellen, dass die Leute nicht nur einen stashWorkflow verwenden, weil sie nicht genug über Schulungen oder das Bewusstsein für Alternativen verfügen, aber wenn sie dennoch einen Workflow auswählen, den Sie für suboptimal halten, lasse ich ihn.


1

Ich denke, der Teil Ihrer Frage, bei dem es sich um ein Anti-Pattern handelt, ist die Verwendung eines einzelnen gemeinsamen Master- Zweigs. Wenn Sie jedoch zusätzlich zum Hauptzweig einen Entwicklungszweig einfügen und dann Stashes verwenden, um mit Ihren eigenen Kontextwechseln im Entwicklungszweig umzugehen, ist dies kein Antimuster und spiegelt einen Teil des Workflows sehr genau wider beschreiben von Organisationen wie Etsy und Facebook.

Allerdings ist die Antwort von @Greg Burghardt etwas zu günstig für den sogenannten Git-Flow- oder Feature-Branch-Workflow. Früher habe ich mich für eine ähnliche Strategie ausgesprochen, aber nachdem ich festgestellt habe, dass sie unnötig kompliziert ist und ein falsches Sicherheitsgefühl erzeugt, mache ich das nicht mehr. Es ist auch ein Überbleibsel aus der Zeit nicht-dezentraler Versionskontrollsysteme wie Subversion.

Erstens, da Git im Gegensatz zu Subversion ein dezentrales Versionskontrollsystem ist, ist das lokale Repository eines Entwicklers im Wesentlichen ein riesiger Zweig des Codes an und für sich. Was eine einzelne Entwicklung vor Ort tut, hat keine und sollte keine Auswirkungen auf die anderen Teammitglieder haben, es sei denn, fehlerhafter oder fehlerhafter Code wird an alle gemeinsam genutzten Zweige in einem gemeinsam genutzten Repository übertragen.

Der Befehl "rebase" kann jedoch den Verlauf der Verzweigung beschädigen, wenn in einem der wiedergegebenen Commits ein Zusammenführungskonflikt auftritt. Von http://ryantablada.com/post/the-dangers-of-rebasing-a-branch

Der Rest der Rebase verläuft reibungslos, alle Tests scheinen bestanden zu sein. Eine PR wird gemacht.

Und dann wird etwas mehr Code geschrieben, der sich auf die commentsForAllPosts-Eigenschaft stützt, und alles ist kaputt. Aber wen bitten wir um Hilfe? Die Schuld an Git zeigt, dass die Codezeile nur vom serverseitigen Ingenieur geschrieben wurde und er seine Hände in die Luft wirft.

Jetzt ist Ihr Front-End-Ingenieur im Urlaub, krankgeschrieben oder wer weiß. Niemand kann herausfinden, wie dieser Code aussehen sollte!

Durch Rebase ist es dem Team nicht mehr möglich, anhand des Verlaufs zu ermitteln, was schief gelaufen ist, da alle Zusammenführungskonflikte im untergeordneten Zweig beseitigt werden und der ursprüngliche Code für immer verloren geht.

Wenn derselbe Zusammenführungskonflikt aufgetreten ist und die Zusammenführung verwendet wurde, würde die Schuld darauf hindeuten, dass diese Codezeile beim Zusammenführungsprozess, beim Festschreiben für den übergeordneten Zweig und beim Festschreiben für den untergeordneten Zweig berührt wurde. Wenn Sie mit den drei Permutationen herumspielen, können Sie die ursprüngliche Absicht wieder in die Codebasis einbringen und arbeiten, ohne dass eine Tonne Kopf einen Finger kratzt und darauf zeigt. Und alles, was Sie wirklich hatten, war ein weiteres Commit

Darüber hinaus setzt ein Mehrfachverzweigungsmodell voraus, dass keine zwei Zweige jemals voneinander abhängige Codeänderungen enthalten könnten. Wenn dies unvermeidlich ist, muss der Entwickler jetzt noch mehr Zweige miteinander verbinden, um effizient arbeiten zu können.

Das fundamentale Anti-Pattern, das ich sehe, bezieht sich nicht auf Branches vs. Stashes, sondern eher auf die Art von Problemen, über die einige sehr kluge Leute schon seit einiger Zeit sprechen: Haben Sie Vertrauen in Ihren Code durch die Verwendung von Unit-Tests und eine gute Architektur? Sind Sie in der Lage, inkrementelle Änderungen an Ihrem Code vorzunehmen, sodass Ihre Entwickler Änderungen leicht begründen und verstehen können, was eine Änderung bewirken wird? Führen Sie Ihre Entwickler sogar einmal einen neuen Code aus, um zu überprüfen, ob er tatsächlich funktioniert? (Ja, das habe ich schon gesehen).

Wenn die Antwort auf diese Fragen Nein lautet, spielt es keine Rolle, wie viele Zweige Sie haben - Entwickler werden sagen, dass Code bereit, funktionsfähig und produktionsfähig ist, wenn dies nicht der Fall ist, und es wird auch keine Anzahl von Zweigen geben helfen Ihnen, wenn dieser Code ohnehin in Produktion geht.


2
Ihr Kommentar zum erneuten Basieren, bei dem Probleme mit der Zusammenführungsauflösung auftreten, ist falsch. Ein Rebase ist die gleiche Art von Zusammenführung wie eine tatsächliche Zusammenführung. Git verschmilzt nur Commits unter der Haube. Durch das erneute Laden und Lösen eines Zusammenführungskonflikts wird der Festschreibungsverlauf nicht beschädigt. Das erneute Reduzieren und das nicht ordnungsgemäße Lösen eines Zusammenführungskonflikts beschädigen die Dinge, was bei einer normalen Zusammenführung genauso wahrscheinlich ist. Ich muss zustimmen, dass Feature-Zweige die Komplexität erhöhen, aber dies könnte die notwendige Komplexität sein, wenn Entwickler mit mehreren nicht zusammenhängenden Änderungen zurechtkommen müssen.
Greg Burghardt

Sie sagen also, dass Verschmelzungen die Geschichte zerstören können ?! Klingt nach mehr Rechtfertigung, um nicht zu viele Filialen zu haben!
RibaldEddie

1
Zusammenschlüsse können die Geschichte nicht zerstören. Ich glaube, Sie haben möglicherweise ein Missverständnis darüber, wie das Umbasieren und Zusammenführen funktioniert. Wenn ein Zusammenführungskonflikt ausgelöst wird, liegt es am Menschen, ihn zu lösen. Wenn der Mensch es falsch löst, können Sie Git (oder SVN oder CVS oder {Versionskontrolle hier einfügen}) nicht die Schuld geben.
Greg Burghardt

Was du jetzt sagst, steht in Konflikt mit dem, was du vorher gesagt hast. Hast du den Artikel gelesen, aus dem ich zitiert habe? Verstehst du den Kontext, in dem eine Rebase Geschichte verlieren wird?
RibaldEddie

1
Ich habe den Artikel gelesen. "Bei Keen versuchen wir, unseren Code nach fast jedem Commit zu pushen." Das klingt für mich verrückt. Entweder machen sie zu große Commits oder sie geben Code heraus, der noch nicht fertig ist. Wenn Sie alle Commits sofort veröffentlichen, kann ein erneutes Basieren zu Problemen führen. Es ist das Prinzip "Doktor, Doktor, es tut weh, wenn ich das tue".
Kyralessa

1

git stashist ein Werkzeug. Es ist an sich kein Muster, noch ein Anti-Muster. Es ist ein Werkzeug, ähnlich wie ein Hammer ein Werkzeug ist. Die Verwendung eines Hammers zum Einschlagen von Nägeln ist ein Muster, und die Verwendung eines Hammers zum Einschlagen von Schrauben ist ein Antimuster. Ebenso gibt es Workflows und Umgebungen, in denen git stashdas richtige Tool verwendet wird, und Workflows und Umgebungen, in denen es falsch ist.

Der Workflow "Alle verpflichten sich und setzen sich für den Mainline-Prozess ein" funktioniert recht vernünftig, wenn keine Änderungen mit hohem Risiko vorgenommen werden. Es wird häufig in svn-Umgebungen verwendet, in denen es einen maßgeblichen zentralen Server gibt, der den Code enthält.

Git schafft es jedoch, den einen zentralen Server abzuschaffen. Nachdem alle Entwickler tun commit, pull(oder , rebasewenn Sie das sind), pushdie ganze Zeit kann ein großes Durcheinander machen.

Die größten Probleme treten auf, wenn etwas in Bearbeitung ist, das nicht funktioniert, und wenn Sie an einem Prioritätsfehler arbeiten müssen. Dies bedeutet, dass Sie diese Arbeit für eine Weile beiseite legen, die neueste Version herunterladen und daran arbeiten müssen, ohne dass die vorherigen Arbeiten Probleme mit dem Build verursachen, den Sie ausführen möchten.

Wäre dafür git stashdas richtige Werkzeug.

Im Mittelpunkt dieses Workflows steht jedoch ein größeres Problem. Ist, dass sich alle Rollen von Versionskontrollzweigen in einem einzelnen Zweig befinden. Mainline, Entwicklung, Wartung, Akkumulation und Verpackung sind alles auf Master. Das ist ein Problem. (Weitere Informationen zu diesem Ansatz für Branchen finden Sie unter Erweiterte SCM-Verzweigungsstrategien. )

Und ja, Sie haben darauf hingewiesen, dass es sich nicht um einen großartigen Workflow handelt und dass es Probleme damit gibt. Das Problem liegt jedoch nicht beim Tool git stash. Das Problem ist das Fehlen einer eindeutigen Verzweigung für Rollen oder für inkompatible Richtlinien .

git stashDies ist jedoch etwas, das ich verwendet habe, als ich eine Situation hatte, in der ich für eine Weile gebaut habe und in einen klebrigen Zustand geriet, in dem ich nicht sicher war, ob es der richtige war ... also habe ich meine Änderungen verwahrt und erkundete dann einen anderen Ansatz zur Lösung des Problems. Wenn das geklappt hat - großartig, verwerfen Sie das Zeug auf dem Versteck und fahren Sie fort. Wenn die andere Erkundung schwieriger geworden ist, setzen Sie sie auf die vorherige Änderung zurück und wenden Sie den Stash erneut an, um daran zu arbeiten. Die Alternative wäre, einen Commit durchzuführen, auszuchecken, zu verzweigen und dann entweder mit diesem neuen Zweig fortzufahren oder zurückzukehren und ihn zurückzusetzen. Die Frage ist, ob es sich wirklich lohnt, das in die Geschichte aufzunehmen, wenn es nur etwas ist, das ich ein bisschen erforschen möchte.

git stashist kein Anti-Muster. Unter Verwendung git stashals Alternative zu einer Verzweigung , während alle Commits zum Master ein Anti - Muster ist - aber nicht wegen git stash.

Wenn Sie es noch nicht getroffen haben, warten Sie einfach, bis Sie Probleme mit Builds haben , wenn jemand erhebliche architektonische Änderungen an vielen Dateien (und den Zusammenführungskonflikten) vornehmen muss oder ungetesteten Code in Arbeit, der dafür in die Produktion gelangt Anti-Pattern, um Sie einzuholen.

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.