Was ist der beabsichtigte Anwendungsfall für Git Stash?

142

Wenn ich an Zweig A arbeite und plötzlich an Zweig B arbeiten muss, bevor ich mit einem Commit für Zweig A fertig bin, speichere ich meine Änderungen in A, Kasse B, mache meine Arbeit dort, dann Kasse A und wende den Stash an.

Wenn ich an A arbeite und für diesen Tag aufhören möchte zu arbeiten, sollte ich meine Arbeit aufbewahren und sie dann am nächsten Tag anwenden (wenn ich meine Arbeit wieder aufnehme), oder sollte ich die Dinge einfach so lassen, wie sie sind - nicht festgeschriebene geänderte Dateien in der Arbeitsverzeichnis? Ich verstehe nicht, warum ich in diesem Fall Stash verwenden müsste, es sei denn, es gibt einen Sicherheitsvorteil.

Ein weiteres Szenario: Ich arbeite sowohl bei der Arbeit als auch zu Hause. Wenn ich mit einem Commit nicht fertig bin, wenn ich nach Hause gehen möchte, kann ich meine Arbeit verstauen, an GitHub senden und dann zu Hause abrufen?

Alexander
quelle
3
ggf. weitgehend abhängig von Ihren Unternehmensrichtlinien. Wie wählen Sie die "akzeptierte" Antwort aus?
Daemon Painter vor
1
Diese Frage formuliert fragt nur für Meinungen (sollte ich git diese Weise , dass die Art und Weise?) Und sollte daher geschlossen oder bearbeitet werden.
TylerH

Antworten:

160

Stash ist nur eine bequeme Methode. Da Filialen in Git so billig und einfach zu verwalten sind, ziehe ich es persönlich fast immer vor, eine neue temporäre Filiale zu erstellen, anstatt sie zu verstecken, aber es ist meistens Geschmackssache.

Der einzige Ort, an dem ich gerne verstaue, ist, wenn ich feststelle, dass ich bei meinem letzten Commit etwas vergessen habe und bereits mit der Arbeit am nächsten in derselben Branche begonnen habe:

# Assume the latest commit was already done
# start working on the next patch, and discovered I was missing something

# stash away the current mess I made
git stash save

# some changes in the working dir

# and now add them to the last commit:
git add -u
git commit --amend

# back to work!
git stash pop
Mureinik
quelle
2
Wird das fehlende Element, das Sie hinzugefügt haben, nach dem Entstapeln in den Vorrat übernommen? (Ich bin immer noch wackelig, wie die Timeline in Git funktioniert - ich nehme an, Sie überschreiben die Geschichte?)
Kiki Jewell
@ KikiJewell-Änderungen werden auf den Index angewendet - sie werden nicht festgeschrieben. Wenn Sie also git stash popzweimal spielen, verlieren Sie die Unterscheidung zwischen diesen beiden Änderungssätzen.
Mureinik
Ab Ende Oktober 2017 gab es eine ausführliche Diskussion über die Git-Mailingliste, in der der Befehl git stash save zugunsten der bestehenden Alternative abgelehnt wird git stash push. Der Hauptgrund dafür ist, dass git stash pushdie Option zum Verstecken ausgewählter Pfadspezifikationen eingeführt wird , was git stash savenicht unterstützt wird.
Krishna Gupta
39

Ich werde die Antwort auf drei Absätze unterbrechen.

Teil 1:

git stash(Um Ihre nicht festgeschriebenen Änderungen in einem "Stash" zu speichern. Hinweis: Dadurch werden Änderungen aus dem Arbeitsbaum entfernt!)

git checkout some_branch(Wechsel zum vorgesehenen Zweig - in diesem Fall some_branch)

git stash list (Liste Verstecke)

Sie können sehen:
stash @ {0}: WIP auf {branch_name}: {SHA-1 des letzten Commits} {letzter Commit
Ihres Zweigs} stash @ {0}: WIP auf Master: 085b095c6 Änderung für Test

git stash apply (um Stash auf den Arbeitsbaum im aktuellen Zweig anzuwenden)

git stash apply stash@{12}(Wenn Sie viele Verstecke haben, können Sie auswählen, welche Verstecke angewendet werden sollen. In diesem Fall wenden wir Verstecke an. 12)

git stash drop stash@{0}(aus der Versteckliste entfernen - in diesem Fall Versteck 0)

git stash pop stash@{1} (um den ausgewählten Stash anzuwenden und ihn aus der Stash-Liste zu löschen)

Teil 2:
Sie können Ihre Änderungen mit diesem Befehl ausblenden, dies ist jedoch nicht erforderlich.
Sie können am nächsten Tag ohne Versteck weitermachen.
Diese Befehle dienen zum Ausblenden Ihrer Änderungen und zum Arbeiten an verschiedenen Zweigen oder zum Implementieren einer gewissen Realisierung Ihres Codes und zum Speichern in Verstecken ohne Zweige und zum Festschreiben Ihres benutzerdefinierten Falls!
Und später können Sie einige Verstecke verwenden und prüfen, welche besser sind.

Teil 3:
Stash-Befehl zum lokalen Ausblenden Ihrer Änderungen.
Wenn Sie remote arbeiten möchten, müssen Sie sich verpflichten und pushen.

Alexander Yushko
quelle
10

Die Hauptidee ist

Bewahren Sie die Änderungen in einem schmutzigen Arbeitsverzeichnis auf

Der Befehl "Basicallly Stash" behält also einige Änderungen bei, die Sie im Moment nicht benötigen oder wollen. aber Sie können sie brauchen.

Verwenden Sie git stash, wenn Sie den aktuellen Status des Arbeitsverzeichnisses und des Index aufzeichnen möchten, aber zu einem sauberen Arbeitsverzeichnis zurückkehren möchten. Der Befehl speichert Ihre lokalen Änderungen und setzt das Arbeitsverzeichnis auf das HEAD- Commit zurück.

nzrytmn
quelle
7

Sie können die folgenden Befehle verwenden:

  • Um Ihre nicht festgeschriebenen Änderungen zu speichern

    git stash

  • Zum Auflisten Ihrer gespeicherten Vorräte

    git stash list

  • Um die nicht festgeschriebenen Änderungen anzuwenden / zurückzugewinnen, wobei x 0,1,2 ist ...

    git stash apply stash@{x}

Hinweis:

  • So wenden Sie einen Stash an und entfernen ihn aus der Stash-Liste

    git stash pop stash@{x}

  • So wenden Sie einen Stash an und behalten ihn in der Stash-Liste

    git stash apply stash@{x}

Anushil Kumar
quelle
4

Wenn Sie auf klicken, git stashwenn Sie Änderungen an der Arbeitskopie haben (nicht im Staging-Bereich), erstellt git ein verstecktes Objekt und schiebt es auf den Stapel von Stashes (genau wie Sie, git checkout -- .aber Sie werden keine Änderungen verlieren). Später können Sie von der Oberseite des Stapels springen.

Gyorgyabraham
quelle
2

Mit dem Befehl stash werden alle Änderungen gespeichert, die Sie seit Ihrem letzten Commit vorgenommen haben. In Ihrem Fall gibt es keinen Grund, sich zu verstecken, wenn Sie am nächsten Tag weiter daran arbeiten. Ich würde stash nur verwenden, um Änderungen rückgängig zu machen, die Sie nicht festschreiben möchten.

Severin
quelle
2
Nein, git stashwird Ihren Zweig nicht ändern. Insbesondere werden festgeschriebene Änderungen nicht "zurückgesetzt". Nicht festgeschriebene Änderungen an Ihren Dateien werden nur (vorübergehend) verworfen. - Es mag wählerisch erscheinen, aber diese Art von Wörtern hat im Zusammenhang mit Git eine ganz besondere Bedeutung. Sie sollten diese wirklich nicht verwechseln.
Michas
Vielen Dank für den Hinweis. Ich habe meine Antwort entsprechend geändert.
Severin
In git wird ein "Zweig" als eine Reihe von Commits definiert. git stashberührt keine Commits und ändert daher überhaupt keinen Zweig. Es wird nichts aus einem Zweig "entfernen" und es wird in keiner Weise "zurückgesetzt". Der Zweig bleibt gleich, nur die Dateien im Arbeitsbaum ändern sich. - Das sind zwei völlig verschiedene Dinge.
Michas
Es wird Ihre Änderungen nicht verwerfen, sondern "verstauen"! Git unterhält eine LIFO-Struktur für Stashes, sodass ein Stash eigentlich ein Push ist und Sie von oben herausspringen können. Das Wort "verwerfen" bedeutet, dass Sie alles verlieren, aber nicht.
Gyorgyabraham
1

Ich weiß, dass StackOverflow nicht der Ort für meinungsbasierte Antworten ist, aber ich habe tatsächlich eine gute Meinung darüber, wann Änderungen mit einem Stash zurückgestellt werden müssen.

Sie möchten keine experimentellen Änderungen vornehmen

Wenn Sie Änderungen an Ihrem Arbeitsbereich / Arbeitsbaum vornehmen und verzweigungsbasierte Vorgänge wie Zusammenführen, Drücken, Abrufen oder Ziehen ausführen müssen, müssen Sie sich an einem sauberen Festschreibungspunkt befinden. Wenn Sie also Änderungen am Arbeitsbereich haben, müssen Sie diese festschreiben. Aber was ist, wenn Sie sie nicht festlegen möchten? Was ist, wenn sie experimentell sind? Etwas, das Sie nicht in Ihre Commit-Historie aufnehmen möchten? Etwas, das andere nicht sehen sollen, wenn Sie auf GitHub pushen?

Sie möchten lokale Änderungen nicht durch einen Hard-Reset verlieren

In diesem Fall können Sie einen Hard-Reset durchführen. Wenn Sie jedoch einen Hard-Reset durchführen, verlieren Sie alle Änderungen Ihres lokalen Arbeitsbaums, da alles dort überschrieben wird, wo es zum Zeitpunkt des letzten Commits war, und Sie alle Ihre Änderungen verlieren.

Die Antwort auf "Wann sollten Sie sich verstecken?" Lautet, wenn Sie mit einem synchronisierten Arbeitsbaum / Index / Commit zu einem sauberen Festschreibungspunkt zurückkehren müssen, aber Ihre lokalen Änderungen in nicht verlieren möchten der Prozess. Bewahren Sie Ihre Änderungen einfach in einem Vorrat auf, und Sie sind gut.

Und sobald Sie Ihren Stash erledigt und dann zusammengeführt oder gezogen oder geschoben haben, können Sie einfach Pop verstauen oder anwenden und sind wieder da, wo Sie angefangen haben.

Git Stash und GitHub

GitHub fügt ständig neue Funktionen hinzu, aber ab sofort gibt es die Möglichkeit, dort einen Vorrat zu speichern. Wieder ist die Idee eines Versteckes, dass es lokal und privat ist. Niemand sonst kann ohne physischen Zugriff auf Ihre Workstation in Ihren Vorrat schauen. Auf die gleiche Weise ist Git Reflog privat und das Git Log ist öffentlich. Es wäre wahrscheinlich nicht privat, wenn es auf GitHub hochgeschoben würde.

Ein Trick könnte darin bestehen, einen Unterschied in Ihrem Arbeitsbereich zu machen, den Unterschied in Ihrem Git-Repository einzuchecken, festzuschreiben und dann zu pushen. Dann können Sie von zu Hause aus ziehen, das Diff holen und es dann abwickeln. Aber das ist ein ziemlich chaotischer Weg, um diese Ergebnisse zu erzielen.

git diff > git-dif-file.diff

Pop das Versteck

Cameron McKenzie
quelle