Git-Stash vs. Git-Branch

92

In einer früheren Git-Frage sprach Daniel Benamy über einen Workflow in Git:

Ich arbeitete am Master und engagierte einige Sachen und entschied dann, dass ich diese Arbeit auf Eis legen wollte. Ich habe ein paar Commits gesichert und mich dann verzweigt, bevor ich mit meiner Mistarbeit angefangen habe.

Er wollte seinen Arbeitszustand zu einem früheren Zeitpunkt wiederherstellen, ohne seine aktuellen Änderungen zu verlieren. Alle Antworten drehten sich auf verschiedene Weise um so etwas wie

git branch -m master crap_work
git branch -m previous_master master

Wie ist das zu vergleichen git stash? Ich bin ein bisschen verwirrt, wenn ich versuche zu sehen, was der unterschiedliche Anwendungsfall hier ist, wenn es so aussieht, als würde alles git stashbereits durch Verzweigung behandelt ...


@ Jordi Bunster : Danke, das klärt die Dinge auf. Ich denke, ich würde "Verstauen" als einen leichten, namenlosen Zweig betrachten. Alles, was Stash kann, kann auch verzweigen, aber mit mehr Worten. Nett!

Will Robertson
quelle

Antworten:

109

'Stash' nimmt das unverbindliche " Dirty " " Material auf Ihre Arbeitskopie und verstaut es, sodass Sie eine saubere Arbeitskopie erhalten.

Es verzweigt sich überhaupt nicht wirklich. Sie können den Stash dann auf jeden anderen Zweig anwenden. Ab Git 1.6 können Sie Folgendes tun:

git stash branch <branchname> [<stash>]

um den Stash auf einen neuen Zweig anzuwenden, alles in einem Befehl.

Stash funktioniert also hervorragend, wenn Sie sich noch nicht für den " falschen " Zweig entschieden haben.

Wenn Sie sich bereits verpflichtet haben, ist der in Ihrer Frage beschriebene Workflow eine bessere Alternative. Übrigens, Sie haben Recht: Git ist sehr flexibel, und mit dieser Flexibilität überschneiden sich die Funktionen.

Jordi Bunster
quelle
1
Eine Sache, die mich beißt ... kannst du schreiben, wie ein [<Stash>] tatsächlich aussieht? Sie haben es in diese Notation in den Dokumenten eingefügt, aber es ist nicht offensichtlich, ob das 1 oder @ {1} sein soll oder was.
Gregg Lind
1
Wenn Sie sich auf ein bestimmtes Versteck "N" beziehen möchten, verwenden Sie stash @ {N}
Jordi Bunster
9
git stash listSuchen Sie nach den Namen Ihrer Verstecke.
idbrii
6
Gregg, ja, du kannst: git stash save (Name deines Stashs). Macht es viel nützlicher, wenn Sie es häufig verwenden, damit Sie wissen, was jeder Vorrat tut. Sie können git stash show -p (Name) verwenden, um den Patch eines Stash anzuzeigen.
Thomas Vander Stichele
7
auch, git stash show -uum einen Unterschied des Versteckes gegen die Arbeitskopie zu zeigen.
Ken
49

Wenn Sie Ihren Stash wiederherstellen, werden Ihre Änderungen erneut übernommen und Sie arbeiten weiter an Ihrem Code.

Um Ihre aktuellen Änderungen zu speichern

$ git stash save 
Saved "WIP on master: e71813e..."

Sie können auch mehr als einen Vorrat haben. Der Stash funktioniert wie ein Stapel. Jedes Mal, wenn Sie einen neuen Vorrat speichern, wird dieser auf den Stapel gelegt.

$ git stash list
stash@{0}: WIP on master: e71813e..."

Beachten Sie das stash@{0}Teil ? Das ist dein Versteckausweis. Sie benötigen es, um es später wiederherzustellen. Lass uns das jetzt machen. Die Stash-ID ändert sich mit jedem von Ihnen erstellten Stash. stash @ {0} bezieht sich auf den zuletzt von Ihnen erstellten Stash.

Ein Versteck anwenden

$ git stash apply stash@{0}

Möglicherweise stellen Sie fest, dass der Stash noch vorhanden ist, nachdem Sie ihn angewendet haben. Sie können es fallen lassen, wenn Sie es nicht mehr benötigen.

$ git stash drop stash@{0}

Da sich der Stash wie ein Stapel verhält, können Sie den zuletzt gespeicherten Stash entfernen:

$ git stash pop

Wenn Sie alle Ihre Vorräte wegwischen möchten, führen Sie den Befehl 'clear' aus:

$ git stash clear

Es kann sehr gut sein, dass Sie nicht so oft Stashes verwenden. Wenn Sie Ihre Änderungen nur schnell speichern möchten, um sie später wiederherzustellen, können Sie die Stash-ID weglassen.

$ git stash
...
$ git stash pop

Probieren Sie den Vorrat aus, bevor Sie ihn für wirklich wichtige Arbeiten verwenden.

Ich habe auch eine ausführlichere Version davon in meinem Blog veröffentlicht .

Ariejan
quelle
viel hilfreichere Ressource als die vermeintlich 'beste' Antwort ... (obwohl die beste Antwort es sehr deutlich machte, gab es einige Verwirrungen in Bezug auf die vollständige Nutzung)
kumarharsh
9

Ich bin immer vorsichtig mit Git Stash. Wenn Sie ein paar Mal verstauen, neigen die Dinge dazu, chaotisch zu werden. Die Git-Stash-Liste zeigt eine nummerierte Liste der von Ihnen erstellten Stashes mit Nachrichten an, sofern Sie diese bereitgestellt haben. Das Problem liegt jedoch in der Tatsache, dass Sie Stashes nur bereinigen können, wenn ein brutaler Git-Stash gelöscht wird (wodurch alle entfernt werden). . Wenn Sie also nicht immer anal sind, wenn Sie überaus beschreibende Nachrichten für Ihre Verstecke geben (was irgendwie gegen die Philosophie von Stash verstößt), erhalten Sie eine unverständliche Reihe von Verstecken.

Der einzige Weg, den ich kenne, um herauszufinden, welcher der ist, ist gitk - all und finde die Verstecke. Zumindest können Sie so sehen, auf welchem ​​Commit der Stash erstellt wurde und wie unterschiedlich alles ist, was in diesem Stash enthalten ist.

Beachten Sie, dass ich git 1.5.4.3 verwende und ich denke, dass 1.6 git stash pop hinzufügt, was den ausgewählten Stash vermutlich anwenden und aus der Liste entfernen würde. Welches scheint viel sauberer.

Im Moment versuche ich immer, mich zu verzweigen, es sei denn, ich bin mir absolut sicher, dass ich am selben Tag, sogar innerhalb einer Stunde, zu diesem Vorrat zurückkehren werde.

Webmat
quelle
3
Machst du Zweige, ohne ihnen nützliche Namen zu geben? Wenn nicht, dann verstehe ich nicht, warum Sie mit stash nicht dasselbe tun. Wenn Sie wirklich wissen möchten, was sie enthalten, verwenden Sie einfach git-stash show, um zu zeigen, welche Dateien geändert wurden, oder git-stash apply und git-diff, um die tatsächlichen Unterschiede anzuzeigen. Das Reduzieren von Lagerbeständen ist genau das Gleiche wie das Kontrollieren Ihrer Zweige.
Xiong Chiamiov
18
git stash drop [<stash>]
Tatsächlich
1
Es stimmt, Git hat seit langer Zeit Git Stash Drop. Es ist jetzt viel weniger eine PITA. Ich benutze es jetzt jeden Tag und sogar über lange Zeiträume.
Webmat
3

Wenn Sie nach einem Workflow suchen, der möglicherweise besser passt als Git Stash, sollten Sie sich Git-Bottle ansehen . Es ist ein Dienstprogramm zum Speichern und Wiederherstellen der verschiedenen Git-Arbeitszustände als normale Git-Commits, mit dem der aktuelle und relevante Status Ihres Arbeitsbaums und alle verschiedenen Dateistatus, die unter Git-Status angezeigt werden , effektiv erfasst werden .

Hauptunterschiede zu git stash:

  • git stashspeichert den Dirty-Git-Status eng (geänderte Dateien und hinzugefügte Dateien im Index), wohingegen alles gespeichert git-bottlewird, wasHEAD sich von modifizierten, modifizierten und nicht hinzugefügten, nicht hinzugefügten, nicht zusammengeführten Pfaden unterscheidet , und auf bewahrte Weise unterscheidet. und die vollständigen Rebase / Merge-Zustände (nur Pfade unter .gitignorewerden nicht gespeichert).
  • git stashspeichert, um Objekte zu verstauen, die Sie separat verfolgen müssen. Wenn ich vor 2 Wochen etwas verstaut habe, kann ich mich möglicherweise nicht daran erinnern, während es git-bottleals vorläufige Zusage für die aktuelle Niederlassung gespeichert wird . Die umgekehrte Aktion git-unbottleentspricht dem git stashPop. Es ist möglich, diese Commits zu übertragen und auf Repositorys zu verteilen. Dies kann für Remote-Builds nützlich sein, bei denen Sie ein anderes Repository auf einem Remote-Server nur zum Erstellen oder zur Zusammenarbeit mit anderen Personen bei der Konfliktlösung haben.
Dan Aloni
quelle