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.
- Neuen Zweig erstellen
- Hack hack hack
- Defekten Code festschreiben
- Polieren Sie den Code und lassen Sie ihn funktionieren
- Arbeitscode festschreiben
- Rebase und Squash
- Prüfung
- 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 stash
in 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 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:
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:
- Entwickler verpflichten sich zu meistern. Sperr das sofort ab. Das ist wirklich das größte Problem.
- Entwickler verwenden
git stash
and git pull
on master ständig, wenn sie Feature-Zweige verwenden sollen.
Es ist nichts Falsches an der Verwendung git stash
- besonders vor einem Pull -, aber git 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.