Frage Wie man einen Stash nach Namen in git benennt und zurückholt


Ich hatte immer den Eindruck, dass du damit einen Namen vergeben kannst git stash save stashname, die Sie später anwenden können git stash apply stashname. Aber es scheint, dass in diesem Fall nur das passiert stashname wird als Stash-Beschreibung verwendet.

Gibt es keine Möglichkeit, einen Stash 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 nicht immer jagen muss git stash list was ist seine tatsächliche Stash-Nummer?


927
2018-06-29 21:33


Ursprung


Antworten:


Sie können den Stash tatsächlich anhand des Namens finden, indem Sie die reguläre Ausdruckssyntax von git zum Adressieren von Objekten verwenden:

stash^{/<regex>}
:/<regex>

Zum Beispiel, wenn Sie Ihren Stash mit einem gespeicherten Namen speichern:

git stash save "guacamole sauce WIP"

... können Sie einen regulären Ausdruck verwenden, um diesen Speicher zu adressieren:

git stash apply stash^{/guacamo}

Dadurch wird der jüngste Stash angewendet, der dem regulären Ausdruck entspricht guacamo. Auf diese Weise müssen Sie nicht wissen, auf welcher Nummer der Stapel im Stapel liegt, Sie müssen nur seinen Namen wissen. Dafür gibt es keine Syntax, aber Sie können einen Alias ​​in Ihrem erstellen .gitconfig Datei:

[alias]
sshow = "!f() { git stash show stash^{/$*} -p; }; f"
sapply = "!f() { git stash apply stash^{/$*}; }; f"

Sie können dann verwenden git sapply <regex> dieses Versteck anwenden (ohne zu fallen).
 Sie können dann verwenden git sshow <regex> zu zeigen: Dateien geändert, Einfügungen und Löschungen

BEARBEITEN: Requisiten zu diese StackOverflow-Antwort wie man bash Argumente in Git Aliases verwendet.

EDIT 2: Diese Antwort enthielt früher drop und list Aliase, aber ich habe sie seitdem entfernt drop benötigt die stash@{n} Syntax während list filterte die Taschen überhaupt nicht. Wenn jemand weiß, wie man einen SHA-1 Hash-Hash in einen Stash Ref auflöst, könnte ich auch die anderen Befehle implementieren.

EDIT 3: Pro IsiIch habe eine Patch-Flagge hinzugefügt, um zu zeigen, was der Inhalt des Stash ist, wenn man einen zeigt.


1147
2017-07-27 13:17



Das ist wie man es macht:

git stash save "my_stash"

wo "my_stash" ist der Name des Stash ...

Einige nützliche Dinge zu wissen: Alle Taschen sind in einem Stapel gespeichert. Eintippen :

git stash list

Dies wird alle Ihre Taschen auflisten.

Um einen Vorrat zu verwenden und ihn aus dem Stapel zu entfernen, kannst du geben,

git stash pop stash@{n}

Um einen Stash zu übernehmen und ihn im Stash-Stack zu behalten, tippe:

git stash apply stash@{n}

Wo n im Index der Versteckt sich ändern.


321
2018-03-04 08:18



Du kannst einen Vorrat in einen Zweig verwandeln, wenn du das Gefühl hast, dass es wichtig genug ist:

git stash branch <branchname> [<stash>]

von der man-Seite:

Dadurch wird ein neuer Zweig mit dem Namen <Branchname> erstellt und ausgecheckt, beginnend mit dem Commit, bei dem der <Stash> ursprünglich erstellt wurde. Er wendet die in <stash> aufgezeichneten Änderungen auf den neuen Arbeitsbaum und Index an und löscht den <stash> wird erfolgreich abgeschlossen. Wenn kein <stash> angegeben ist, wird der neueste verwendet.

Dies ist nützlich, wenn der Zweig, auf dem Sie git stash save ausgeführt haben, sich so geändert hat, dass die git stash-Anwendung aufgrund von Konflikten fehlschlägt. Da der Stash auf den Commit angewendet wird, der zu dem Zeitpunkt, als git stash ausgeführt wurde, HEAD war, stellt er den ursprünglichen verdeckten Status ohne Konflikte wieder her.

Sie können diesen neuen Zweig später an einen anderen Ort umbuchen, der ein Nachfahre dessen ist, wo Sie sich befanden, als Sie ihn verstauten.


64
2018-06-29 22:34



Vorhänge sind nicht dazu bestimmt, dauerhafte Dinge zu sein, wie du es willst. Sie würden wahrscheinlich besser mit Tags bei Commits bedient werden. Konstruiere das, was du verstauen willst. Machen Sie ein Commit daraus. Erstellen Sie ein Tag für dieses Commit. Dann rolle deinen Zweig zurück nach HEAD^. Jetzt, wenn Sie diesen Stash erneut anwenden möchten, können Sie ihn verwenden git cherry-pick -n tagname (-n ist --no-commit).


30
2018-06-29 21:39



git stash save ist veraltet Jetzt können Sie stattdessen verwenden git stash push -m "message" 

Sie können wie folgt vorgehen:

git stash push -m "message" 

wo "Nachricht" ist dein Stash-Name ...


15
2018-03-29 15:08



Wenn Sie nur nach einem einfachen Weg suchen, um einige oder alle Änderungen Ihrer aktuellen Arbeitskopie zu speichern und diese später erneut anzuwenden, sollten Sie eine Patch-Datei in Betracht ziehen:

# save your working copy changes
git diff > some.patch

# re-apply it later
git apply some.patch

Hin und wieder frage ich mich, ob ich für diesen Fall eine Box benutzen soll und dann sehe ich Dinge wie den Wahnsinn oben und bin zufrieden mit dem, was ich mache :)


12
2017-11-10 16:06



Alias

sapply = "!f() { git stash apply \"$(git stash list | awk -F: --posix -vpat=\"$*\" \"$ 0 ~ pat {print $ 1; exit}\")\"; }; f"

Verwendung

git sapply "<regex>"

  • kompatibel mit Git für Windows

Edit: Ich habe mich an meine ursprüngliche Lösung gehalten, aber ich sehe, warum die Mehrheit Etan Reisners Version (oben) bevorzugen würde. Also nur für das Protokoll:

sapply = "!f() { git stash apply \"$(git stash list | grep -E \"$*\" | awk \"{ print $ 1; }\" | sed -n \"s/://;1p\")\"; }; f"

7
2017-11-26 22:51



Diese Antwort ist Klemen Slavič zu verdanken. Ich hätte nur die akzeptierte Antwort kommentiert, aber ich habe noch nicht genug rep :(

Sie können auch einen Git-Alias ​​hinzufügen, um den Stash-Ref zu finden und ihn in anderen Aliasen für Show, Apply, Drop usw. zu verwenden.

[alias]
    sgrep = "!f() { ref=$(git --no-pager stash list | grep "$1" | cut -d: -f1 | head -n1); echo ${ref:-<no_match>}; }; f"
    sshow = "!f() { git stash show $(git sgrep "$1") -p; }; f"
    sapply = "!f() { git stash apply $(git sgrep "$1"); }; f"
    sdrop = "!f() { git stash drop $(git sgrep "$1"); }; f"

Beachten Sie, dass der Grund für die ref=$( ... ); echo ${ref:-<no_match>}; pattern ist so, dass eine leere Zeichenkette nicht zurückgegeben wird, was dazu führen würde, dass sshow, sapply und sdrop den neuesten Stash als Ziel haben anstatt wie erwartet.


5
2018-01-11 01:30



Alias Dies könnte eine direktere Syntax für Unix-ähnliche Systeme sein, ohne in einer Funktion eingekapselt zu werden. Fügen Sie Folgendes zu ~ / .gitconfig unter [alias] hinzu

sshow = !sh -c 'git stash show stash^{/$*} -p' -
sapply = !sh -c 'git stash apply stash^{/$*}' -
ssave = !sh -c 'git stash save "${1}"' -

Verwendung:     sapply Regex

Beispiel:     git sshow MySecretStash

Der Bindestrich am Ende sagt, nehmen Sie die Eingabe von der Standardeingabe.


3
2017-08-22 17:00



Ich habe diese zwei Funktionen in meinem .zshrc Datei:

function gitstash() {
    git stash push -m "zsh_stash_name_$1"
}

function gitstashapply() {
    git stash apply $(git stash list | grep "zsh_stash_name_$1" | cut -d: -f1)
}

Mit ihnen auf diese Weise:

gitstash nice

gitstashapply nice

2
2018-06-06 18:53