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?
If you need to get changes or switch branches, push your uncommitted changes onto the stash
- genau dafür ist der Stash da.Antworten:
Aus dem Git SCM-Buch :
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.
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:
(auf die Gefahr des Zorns vieler Menschen)
Linus sagte:
Was ich denke, dass @RibaldEddie versucht zu sagen, ist, dass Sie
git stash
in einem Feature-Zweig-Workflow verwenden können - und das ist wahr. Es ist nicht die Verwendunggit stash
, die das Problem ist. Es ist die Kombination aus Verpflichtung zum Beherrschen und Verwendengit stash
. Dies ist ein Anti-Muster.Klärung
git rebase
Aus @ RibaldEddies Kommentar:
(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 rebase
Befehl 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:
(Hervorhebung von mir)
Fazit
Am Ende hat das OP einige Entwickler, die dies tun:
Hier gibt es zwei Probleme:
git stash
andgit pull
on master ständig, wenn sie Feature-Zweige verwenden sollen.Es ist nichts Falsches an der Verwendung
git stash
- besonders vor einem Pull -, abergit stash
diese Art der Verwendung ist ein Anti-Pattern, wenn Git bessere Workflows bietet.Ihre Verwendung
git stash
eines roten Herings. Das ist nicht das Problem. Sich dem Meister zu verpflichten, ist das Problem.quelle
Ich persönlich benutze es nur
stash
fü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~1
Daher 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
stash
Workflow 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.quelle
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
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.
quelle
git stash
ist 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 denengit stash
das 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 ,rebase
wenn Sie das sind),push
die 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 stash
das 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 stash
Dies 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 stash
ist kein Anti-Muster. Unter Verwendunggit stash
als Alternative zu einer Verzweigung , während alle Commits zum Master ein Anti - Muster ist - aber nicht wegengit 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.
quelle