Warum ist der Git-Stash nicht pro Zweig einzigartig?


80

Ich nehme an, es ermöglicht das Verschieben von Änderungen von einem Zweig zum nächsten, aber dafür ist Kirschernte gedacht, und wenn Sie Ihre Änderungen nicht festschreiben, sollten Sie sie vielleicht nicht verschieben?

Ich habe gelegentlich den falschen Vorrat auf den falschen Zweig angewendet, was mich über diese Frage nachdenken ließ.


13
In Git fehlt etwas, mit dem Sie nicht festgeschriebene Änderungen einem Zweig (oder Kopf) zuordnen können. Dies wird deutlich, wenn Sie mehr als einen Zweig gleichzeitig in Arbeit haben. Wie die Antworten hier zeigen, hat Stash dennoch nützliche Anwendungen, die auf seinen Eigenschaften beruhen. git stash-herejemand?
Blake Taylor

Antworten:


69

Wie bereits erwähnt, möchten Sie, wenn Sie einen "Zweig pro Zweig" möchten, wirklich einen neuen Zweig, der sich vom vorhandenen Zweig löst.

Neben der bereits erwähnten Tatsache, dass Sie mit dem Stash in einen Zweig ziehen können, an dem Sie gerade arbeiten, können Sie auch den Zweig wechseln, bevor Sie alles festgeschrieben haben. Dies ist nicht zum Kirschpflücken im üblichen Sinne nützlich, sondern zum Kirschenpflücken Ihrer Arbeitskopie .

Wenn ich beispielsweise an einem Feature-Zweig arbeite, stelle ich häufig kleinere Fehler oder kosmetische Verunreinigungen im Code fest, die für diesen Zweig nicht relevant sind. Nun, ich repariere diese einfach sofort. Wenn die Zeit zum Festschreiben gekommen ist, lege ich selektiv die relevanten Änderungen fest, nicht jedoch die Korrekturen und Kosmetika. Stattdessen verwahre ich diese, wodurch ich zu meinem Zweig "Minor-Fixes-on-Stable" wechseln kann, wo ich den Stash anwenden und jeden Minor-Fix separat festschreiben kann. ( In Abhängigkeit von den Änderungen in Frage, ich werde auch noch einmal einige von ihnen beiseite schaffen, zu einem anderen Feature Zweig zu wechseln, wo ich mich bewerben diejenigen .)

Auf diese Weise kann ich während der Arbeit tief in den Programmiermodus wechseln und mich nicht um das ordnungsgemäße Bibliothekswesen meines Codes kümmern. Wenn ich dann eine mentale Pause mache, kann ich zurückgehen und meine Änderungen sorgfältig in die richtigen Regale sortieren.

Wenn der Stash nicht global wäre, wäre diese Art von Workflow weitaus schwieriger durchzuführen.


4
Dem stimme ich nicht zu : As mentioned, if you want a “per-branch stash,” you really want a new branch forking off from the existing branch.. Insbesondere wechsle ich oft zwischen zwei Versionen desselben Programms, und das Ausführen eines vollständigen Programms makedauert 10 Minuten. Es wäre sehr schön, die erstellten Binärdateien pro Zweig verstauen zu können. Und ich möchte auf keinen Fall die Binärdateien im Protokoll oder in einem Zweig.
Clément

Warum? (Ich denke du tust es, du weißt es einfach nicht.)
Aristoteles Pagaltzis

20

Ab Git 1.6 können Sie jetzt mithilfe von Verstecken Stashes auf Zweige anwenden

git stash branch name_of_new_branch

Git erstellt den neuen Zweig für Sie und probiert ihn aus! Weitere Informationen finden Sie unter

  • das Git-Buch

  • info git-stashund suche nach Option = branch.

Ich vermute, Sie können Stashes mit verschieben

git stash branch <branch | new_branch> [<stash>]

und um eine Liste Ihrer Verstecke zu sehen, verwenden Sie

git stash list

Referenz


Vielen Dank! Mir war nicht bewusst, dass Sie Verstecke auf Zweige anwenden können, aber dies scheint schließlich das Verhalten zu sein. Ich hatte einen Vorrat an einem Zweig und habe einen anderen Zweig ausgecheckt und dort gearbeitet. Wie sich herausstellte, musste ich einige der ausstehenden Änderungen aufbewahren, bevor ich mich wieder an den Master wenden konnte. Mein aktualisiertes " gitk --all" zeigte nicht mehr meinen ersten Vorrat; Ich dachte, es könnte verstopft sein. Nachdem meine Arbeit in der zweiten Filiale erledigt war, habe ich diesen Vorrat geknallt. Danach zeigte mein aktualisiertes " gitk --all" wieder den ursprünglichen Vorrat.
Daniel Miladinov

17

Wenn Sie einen "Stash" möchten, der von einem Zweig ausgeht, gehen Sie wie folgt vor, um Ihre Änderungen in einem neuen Zweig Ihres aktuellen Zweigs zu speichern.

git checkout -b new_stash
git commit -a -m "stashed changes"

das Versteck rückgängig machen

git reset HEAD^
git branch -d new_stash

git stash ist besonders nützlich, weil Sie Änderungen in einen schmutzigen Baum ziehen können, dh wenn Sie ausstehende Änderungen haben und eine ausführen möchten

git pull

und Sie können nicht, Sie können Ihre Änderungen verstauen, ziehen und dann das Versteck anwenden

git stash
git pull
git stash apply
git stash clear

hoffe das hat geholfen!


Was ist, wenn das Material, das Sie verstauen möchten, beispielsweise eine Reihe von Binärdateien ist, die sich aus der Ausführung makein diesem Zweig ergeben haben? (Ein Stash pro Zweig würde Zeit sparen, wenn Sie das nächste Mal einen inkrementellen Build in diesem Zweig durchführen, aber Sie möchten die Binärdateien sicherlich nicht zum Index hinzufügen.)
Clément

5

git-stash ist für mich am nützlichsten, um noch nicht eingecheckte Änderungen in einen anderen Zweig als den aktuell ausgecheckten zu verschieben.

Zum Beispiel: Ich stelle häufig fest, dass ich einfache Änderungen an einem Bugfixes-Zweig vornehme. nur um festzustellen, dass eine Änderung, an der ich arbeite, komplexer ist, als ich zuerst vermutet habe. Git-Stash ist der einfachste Weg, um diese Änderungen in einen anderen Zweig zu verschieben.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.