Ist git stash branchenspezifisch oder für das gesamte Repository?

88

Ich ging in eine Filiale und arbeitete. Ich wollte in eine andere Niederlassung gehen, wollte mich aber nicht festlegen, also tat ich es git stash. Dann habe ich getan git checkout <otherbranch>. Ich habe dort einige Arbeiten durchgeführt und wollte, genau wie in der ersten Niederlassung, vor der Ausführung der Arbeiten aussteigen. Also habe ich es auch git stashdort gemacht. Ich wechselte zurück zum ersten Zweig und versuchte, ihn zu entstauen ( git stash pop) , weil ich dachte, er würde den Stash von diesem bestimmten Zweig erhalten. Ich war überrascht, dass es den Vorrat von <otherbranch>(zuletzt verstaut) gelöst hat . Ich hatte den Eindruck, dass Stash branchenspezifisch ist, aber dieses Verhalten zeigt an, dass es nur einen Stash für das gesamte lokale Repository gibt.

Ist git stashbranchenspezifisch oder für das gesamte Repository? Kann ich Optionen für das gesamte Repository übergeben, um es branchenspezifisch zu machen?

amphibient
quelle

Antworten:

41

So zeigen Sie den aktuellen Stash-Stack an:

git stash list

Um einen bestimmten Vorrat aus dem Stapel auszuwählen, beziehen Sie sich auf den oben gezeigten.stash@{number}

Wenn Sie möchten, dass das Verhalten pro Zweig ausgeführt wird, können Sie einfach einen Commit (oder mehrere Commits) für den Zweig durchführen. Sie können die Festschreibung (en) später jederzeit "aufheben" (z. B. mit git reset, entweder --softoder --mixed; siehe Dokumentation zum Zurücksetzen des Git) oder mit git rebase -i, um nur die eventuellen "echten " Festschreibungen beizubehalten, während die temporären Elemente verworfen werden ).

(Um wirklich zu emulieren git stash, benötigen Sie mindestens zwei Commits, eines für den Indexstatus und eines für den Arbeitsbaumstatus. Wenn Sie jedoch nicht vorhaben, den Indexstatus zu speichern und wiederherzustellen, können Sie nur git add -Aden gesamten Arbeitsbaumstatus verwenden und fügen Sie dies in das temporäre Commit ein. Alternativ git stashhandelt es sich um ein Shell-Skript, mit dem Sie es ziemlich einfach kopieren und ändern können, damit es standardmäßig pro Zweig funktioniert , z. B. als Arbeitsnamenraum und nicht als einzelnes globales für das gesamte Repo. Sie könnten immer noch einen Stash von einem Zweig zu einem anderen bringen, indem Sie ihn explizit benennen.)refs/pb-stash/branchrefs/stash

torek
quelle
Wissen Sie, wie Sie die Dateiliste jedes stash listElements zusätzlich zu nur einer Beschreibung anzeigen können ?
Amphibient
2
git stash show(oder git stash show stash@{<number>}für etwas anderes als die @{0}Version) gibt Ihnen eine diff --stat; hinzufügen -p, um ein größeres Diff zu erhalten. Hinweis: Dadurch wird der "Arbeitsbaum" im "Stash Bag" mit dem Commit verglichen, an dem er hängt. Es gibt keine Front-End-Schnittstelle, um zu sehen, was im "Index" des angegebenen Stash-Bag enthalten ist.
Torek
51

Nein und Nein. Git Stash ist pro Repository.

Hier ist eine schöne Seite, wie man es benutzt.

Abasterfield
quelle
Überschreibt der zweite Vorrat den ersten? IOW, wenn ich zwei Stashes mache, aber kein Unstash dazwischen, verliere ich dann das erste Stash?
Amphibient
1
Nein, Sie erhalten einen Stapel (Last-In-First-Out) von Verstecken. Sie schieben einen Stash auf Ihren Stash-Stack, dann einen anderen, dann knallen Sie den zweiten heraus, dann
platzen
16

git stash ist nicht pro Zweig.

  • Anstelle von git stash(was leicht verloren gehen kann, wenn Sie viele Verstecke und Zweige haben)
  • Ich schlage vor, a git commitzu tun , um den unfertigen Code in Ihrer Zweigstelle zu speichern, und wenn Sie bereit sind, den Code zu beenden, tun Sie a git reset ${COMMIT_HASH_VALUE}, um den unfertigen Code zurückzubekommen
  • git commitund git resetbei der Verwendung zusammen richtig kann eine Simulation git stashfür einen bestimmten Zweig

Hier ist ein allgemeines reales Szenario, das den Wert und die Verwendung der Befehle commitund demonstriert reset:

  • Sie arbeiten an Feature-Zweig X und Ihr Code kompiliert oder besteht die Tests nicht einmal
  • Es gibt einen Fehler, der eine höhere Priorität als die aktuelle neue Funktion hat. Sie müssen daher sofort mit der Fehlerbehebung beginnen
  • anstatt einen Git-Stash zu machen (und der Stash geht in der Mischung verloren, weil Sie viele Stashes und viele Zweige haben)
  • Sie können einen git commitOn-Feature-Zweig X ausführen
    • schreibe das COMMIT_HASH_VALUEfür später auf
  • Checken Sie einen neuen Zweig Y für den Hotfix aus
  • Beenden Sie den Hotfix für Zweig Y (führen Sie eine Zusammenführungsanforderung durch, um den Hotfix in die Grundlinie zu integrieren und den Hotfix-Zweig zu löschen.)
  • Überprüfen Sie dann den Feature-Zweig X erneut
  • um Ihre unvollendete Arbeit zu platzieren, die nicht kompiliert oder getestet wurde -> machen Sie einfach eine git reset ${COMMIT_HASH_VALUE}

(FYI der Standard für git resetIS --mixed)

Trevor Boyd Smith
quelle
2
Eine praktische Verknüpfung zum Zurücksetzen in diesem Szenario ist git reset HEAD~1.
Sam A. Horvath-Hunt
1
@samHH Ich hatte eine zu viele Instanzen mit Git Reset HEAD ^ 1 versehentlich zweimal getroffen ... also entscheide ich mich, nicht zu verwenden HEAD^1oder HEAD~1.
Trevor Boyd Smith
7

Ich bin mir nicht sicher, warum jede Antwort hier vorschlägt, Stash mit commit+ zu emulieren reset. Stash ist vollkommen in Ordnung, besonders wenn Sie an mehreren Zweigen arbeiten. Ich möchte mich auch nicht verpflichten, wenn ich an mehreren Zweigen arbeite, da ich möchte, dass alle geänderten Änderungen bei meiner Rückkehr immer noch in meinem Editor hervorgehoben werden.

Hier ist also der Stash-Workflow:

Wenn Sie den Zweig wechseln müssen und nicht bereit sind, einen Commit durchzuführen, speichern Sie Ihre Änderungen im Stapel

git stash save "Your custom stash message"

Wenn Sie zu einer Filiale zurückkehren, überprüfen Sie den Vorrat

git stash list

Geben Sie hier die Bildbeschreibung ein

Wenn Sie auf einem Zweig sind, können FixIssue0203Sie verwenden, git stash popda dies die Oberseite anwendet stash@{0}und sie aus dem Vorrat entfernt.

Wenn Sie sich jedoch in einem Zweig befinden ImproveReadme, sollten Sie zuerst den Stash 1 anwenden git stash apply stash@{1}und dann den Stash 1 vom Stapel entfernen git stash drop stash@{1}.

Das ist es!

Adam
quelle