Ich hatte immer den Eindruck, dass man einem Versteck einen Namen geben könnte git stash save stashname
, den man später anwenden könnte git stash apply stashname
. Aber es scheint, dass in diesem Fall alles, was passiert, stashname
als Stash-Beschreibung verwendet wird.
Gibt es keine Möglichkeit, einen Vorrat zu benennen? Wenn nicht, was würden Sie empfehlen, um eine gleichwertige Funktionalität zu erreichen? Im Wesentlichen habe ich einen kleinen Vorrat, den ich regelmäßig anwenden möchte, aber ich möchte nicht immer nach git stash list
der tatsächlichen Vorratsnummer suchen müssen.
git stash push -m stashname
ist die aktuelle Syntax .git stash save stashname
wurde veraltet.Antworten:
Das ist wie man es macht:
Wo
"my_stash"
ist der Versteckname?Einige weitere nützliche Dinge zu wissen: Alle Verstecke werden in einem Stapel gespeichert. Art:
Dadurch werden alle Ihre Verstecke aufgelistet.
Geben Sie Folgendes ein, um einen Stash anzuwenden und aus dem Stash-Stack zu entfernen:
Geben Sie Folgendes ein, um einen Stash anzuwenden und im Stack-Stack zu behalten:
Wo
n
ist der Index der versteckten Änderung?quelle
git stash apply <custom-name>
git stash push -m my_stash
ist die aktuelle Syntax .git stash save my_stash
wurde veraltet.git stash save
ist ab 2.15.x / 2.16 veraltet , stattdessen können Sie verwendengit stash push -m "message"
Sie können es so verwenden:
git stash push -m "message"
Dabei ist "Nachricht" Ihre Notiz für diesen Vorrat.
Um den Vorrat abzurufen, können Sie Folgendes verwenden :
git stash list
. Dies gibt eine Liste wie diese aus, zum Beispiel:Dann geben Sie einfach
apply
Folgendes anstash@{index}
:Referenzen git stash manpage
quelle
push
eher alssave
Syntax: Git Stash Pushgit stash push
: stackoverflow.com/a/47231547/6309git stash apply stash@{1}
in Powershell laufen, erhalten Sie eine Rückerstattungerror: unknown switch 'e'
. Verwenden Sie stattdessengit stash apply --index 1
odergit stash apply 'stash@{1}'
oder Escape}
und{
mit einem Backtick `.Sie können einen Vorrat in einen Zweig verwandeln, wenn Sie der Meinung sind, dass dies wichtig genug ist:
von der Manpage:
Dadurch wird ein neuer Zweig mit dem Namen erstellt und ausgecheckt,
<branchname>
der mit dem Commit beginnt, bei dem der<stash>
ursprünglich erstellt wurde. Er wendet die aufgezeichneten Änderungen<stash>
auf den neuen Arbeitsbaum und Index an und löscht dann den,<stash>
wenn dies erfolgreich abgeschlossen wurde. Wenn nein<stash>
angegeben ist, wird die neueste angewendet.Dies ist nützlich, wenn sich der Zweig, auf dem Sie ausgeführt haben, so
git stash save
stark geändert hat, dass die Anwendung von git stash aufgrund von Konflikten fehlschlägt. Da der Stash zusätzlich zu dem Commit angewendet wird, der zum Zeitpunkt der Ausführung von git stash HEAD war, wird der ursprünglich gestaute Status ohne Konflikte wiederhergestellt.Sie können diesen neuen Zweig später an einen anderen Ort zurückversetzen, der von Ihrem Standort abhängt, als Sie ihn versteckt haben.
quelle
git stash apply
)git stash push -m 'name'
hat funktioniert.Wenn Sie nur nach einer einfachen Möglichkeit suchen, einige oder alle Ihrer aktuellen Änderungen an der Arbeitskopie zu speichern und sie später nach Belieben erneut anzuwenden, ziehen Sie eine Patch-Datei in Betracht:
Hin und wieder frage ich mich, ob ich dafür Verstecke verwenden sollte und dann sehe ich Dinge wie den Wahnsinn oben und bin zufrieden mit dem, was ich tue :)
quelle
Stashes sind keine dauerhaften Dinge, wie Sie sie wollen. Sie sollten wahrscheinlich besser mit Tags für Commits bedient werden. Konstruieren Sie das Ding, das Sie verstauen möchten. Machen Sie ein Commit daraus. Erstellen Sie ein Tag für dieses Commit. Dann rollen Sie Ihren Zweig zurück zu
HEAD^
. Wenn Sie diesen Stash erneut anwenden möchten, können Sie ihn verwendengit cherry-pick -n tagname
(-n
is--no-commit
).quelle
named commit
irgendwo rumzuhängen. Der einzige leichte Ärger ist, dass es beim Kirschpflücken nicht festgeschrieben wird und im Diff bleibt, was bedeutet, dass es beim nächsten Festschreiben manuell nicht eingecheckt werden muss.--no-stage
Option patchen ! Siehe auchVerwenden Sie
git stash push -m aNameForYourStash
, um es zu speichern. Verwenden Sie danngit stash list
, um den Index des Stashs zu lernen, den Sie anwenden möchten. Verwenden Sie dann,git stash pop --index 0
um den Stash zu öffnen und anzuwenden.Hinweis: Ich verwende Git Version 2.21.0.windows.1
quelle
git stash {push,save}
Ich habe diese beiden Funktionen in meiner
.zshrc
Datei:Verwenden Sie sie auf diese Weise:
quelle
Was ist damit?
quelle
git stash apply stash^{/<regex>}
es nicht funktioniert (es funktioniert nicht) Durchsuchen Sie die Stash-Liste (siehe Kommentare unter der akzeptierten Antwort ).git stash list
Das zeigt mir die Verstecke zusammen mit der zugehörigen Indexnummer. Dann gehe ich zu 2.git stash apply 0
- wobei 0 die Indexnummer ist, die ich vom ersten Befehl an nachgeschlagen hätteAlias
sapply = "!f() { git stash apply \"$(git stash list | awk -F: --posix -vpat=\"$*\" \"$ 0 ~ pat {print $ 1; exit}\")\"; }; f"
Verwendungszweck
git sapply "<regex>"
Bearbeiten: Ich habe mich an meine ursprüngliche Lösung gehalten, aber ich sehe, warum die Mehrheit die Version von Etan Reisner (oben) bevorzugen würde. Also nur fürs Protokoll:
quelle
awk -F: '{print $1}'
würde die Notwendigkeit des Sed vollständig beseitigen. Warum sollte dies auch in eine Funktion eingeschlossen werden? Und mitawk -F: -vpat="$*" '$0 ~ pat {print $1}'
sollte sollte es auch möglich sein, den Grep fallen zu lassen. Möglicherweise ist jedoch ein etwas anderes Zitat für das Muster erforderlich.{print $1; exit}
, um nach der ersten übereinstimmenden Zeile zu beenden.Es ist bedauerlich, dass
git stash apply stash^{/<regex>}
das nicht funktioniert (es durchsucht die Stash-Liste nicht wirklich, siehe die Kommentare unter der akzeptierten Antwort ).Hier sind Drop-In-Ersetzungen, die nach
git stash list
Regex suchen , um die erste (neueste) zu findenstash@{<n>}
und diese dann an folgende Adresse zu übergebengit stash <command>
:Beachten Sie, dass die richtigen Ergebniscodes zurückgegeben werden, damit Sie diese Befehle in anderen Skripten verwenden können. Dies kann überprüft werden, nachdem Befehle ausgeführt wurden mit:
Seien Sie nur vorsichtig bei Exploits mit variabler Erweiterung, da ich mir über den
--grep=$1
Teil nicht sicher war . Es sollte vielleicht sein,--grep="$1"
aber ich bin mir nicht sicher, ob dies die Regex-Begrenzer stören würde (ich bin offen für Vorschläge).quelle
Diese Antwort hat Klemen Slavič viel zu verdanken. Ich hätte die akzeptierte Antwort nur kommentiert, aber ich habe noch nicht genug Repräsentanten :(
Sie können auch einen Git-Alias hinzufügen, um den Stash-Ref zu finden und ihn in anderen Aliasen zum Anzeigen, Anwenden, Löschen usw. zu verwenden.
Beachten Sie, dass der Grund für das
ref=$( ... ); echo ${ref:-<no_match>};
Muster darin besteht, dass keine leere Zeichenfolge zurückgegeben wird, die dazu führen würde, dass sshow, sapply und sdrop auf den neuesten Stash abzielen, anstatt wie erwartet zu scheitern.quelle
Alias Dies ist möglicherweise eine direktere Syntax für Unix-ähnliche Systeme, ohne dass eine Funktion gekapselt werden muss. Fügen Sie ~ / .gitconfig unter [alias] Folgendes hinzu
Verbrauch: sapply regex
Beispiel: git sshow MySecretStash
Der Bindestrich am Ende lautet "Eingabe von Standardeingabe übernehmen".
quelle
Verwenden Sie ein kleines Bash-Skript, um die Nummer des Stashs zu ermitteln. Nennen Sie es "gitapply":
Verwendungszweck:
... wobei foo eine Teilzeichenfolge des Namens des gewünschten Stashs ist.
quelle
Verwenden Sie
git stash save NAME
zu speichern.Dann ... können Sie mit diesem Skript auswählen, welche Anwendung angewendet werden soll (oder Pop):
Ich mag es, die Namen der Verstecke zu sehen und zu wählen. Außerdem benutze ich Zshell und wusste ehrlich gesagt nicht, wie ich einige der oben genannten Bash-Aliase verwenden soll;)
Hinweis: Wie Kevin sagt, sollten Sie stattdessen Tags und Cherry-Picks verwenden.
quelle
git stash save
wird zugunsten von abgelehntgit stash push
.Dies ist eine Möglichkeit, dies mit PowerShell zu erreichen:
Weitere Details hier
quelle
in meiner Fischschale
verwenden
gsap name_of_stash
quelle
Spät zur Party hier, aber wenn Sie VSCode verwenden, können Sie dies schnell tun, indem Sie die Befehlspalette (STRG / CMD + UMSCHALT + P) öffnen und "Pop Stash" eingeben. Sie können Ihren Stash nach Namen abrufen ohne die git CLI verwenden zu müssen
quelle
git stash apply
funktioniert auch mit anderen refs alsstash@{0}
. Sie können also normale Tags verwenden , um einen dauerhaften Namen zu erhalten. Dies hat auch den Vorteil, dass Sie nicht versehentlichgit stash drop
odergit stash pop
es.So können Sie einen Alias
pstash
(auch als "persistenter Stash" bezeichnet) wie folgt definieren :Jetzt können Sie einen getaggten Stash erstellen:
und
show
undapply
es wieder wie gewohnt:quelle
Ich glaube nicht, dass es eine Möglichkeit gibt, einen Vorrat mit seinem Namen zu knallen.
Ich habe eine Bash-Funktion erstellt, die dies tut.
Anwendungsbeispiel:
Ich hoffe, es hilft!
quelle
Für alles außer der Stash-Erstellung würde ich eine andere Lösung vorschlagen, indem ich fzf als Abhängigkeit einführe . Ich empfehle, sich 5 Minuten Zeit zu nehmen und sich damit vertraut zu machen, da es insgesamt ein großer Produktivitätssteigerer ist.
Wie auch immer, ein verwandter Auszug aus ihrer Beispielseite mit Stash-Suche. Es ist sehr einfach, das Scriptlet zu ändern, um zusätzliche Funktionen hinzuzufügen (z. B. Stash-Anwendung oder Löschen):
quelle
Ich bin mir nicht sicher, warum dieses Thema so bestürzt ist. Ich kann einen Stash sowohl mit einem Push als auch mit dem veralteten Speichern benennen, und ich kann einen regulären Ausdruck verwenden, um ihn mit einem Apply zurückzuziehen:
Git-Stash-Methode, um einen Namen zum Anwenden zu verwenden
Wie bereits erwähnt, ist der Befehl save veraltet, funktioniert jedoch weiterhin. Sie können ihn daher auf älteren Systemen verwenden, auf denen Sie sie nicht mit einem Push-Aufruf aktualisieren können. Im Gegensatz zum Push-Befehl ist der Schalter -m beim Speichern nicht erforderlich.
Probleme mit einem Pop & Drop
Ich glaube nicht, dass es mit einem Pop funktioniert, aber ich denke, das liegt daran, dass der Pop nach dem Anwenden einen Drop ausführt und der Regex nicht Drop-freundlich ist. Das ist aber nur eine Vermutung. Ich habe es nicht getestet.
Dies ist Git 2.2 und Windows 10.
Visueller Beweis
Hier ist ein wunderschönes animiertes GIF, das den Prozess demonstriert.
Reihenfolge der Ereignisse
Das GIF läuft schnell, aber wenn Sie schauen, ist der Prozess der folgende:
Macht das überhaupt Sinn?
Um ehrlich zu sein, bin ich mir nicht sicher, welchen Nutzen dieser Ansatz hat. Es ist wertvoll, dem Stash einen Namen zu geben, aber nicht den Abruf. Vielleicht wäre es hilfreich, den Prozess zu skripten, aber es ist immer noch viel einfacher, nur einen Vorrat mit Namen zu platzieren.
Das sieht für mich viel einfacher aus als der reguläre Ausdruck.
quelle