Verstecken Sie Änderungen, während Sie die Änderungen im Arbeitsverzeichnis von Git beibehalten

144

Gibt es einen git stashBefehl, der Ihre Änderungen versteckt, sie aber auch im Arbeitsverzeichnis speichert? Also im Grunde ein git stash; git stash applyin einem Schritt?

Michael Dorst
quelle
Gleiche Frage: stackoverflow.com/q/6315459/350384
Mariusz Pawelski
1
@MariuszPawelski Nein, nicht wirklich. Diese Frage ist spezifischer als meine. Die Antwort auf meine Frage war einfach "nein". Vielen Dank für den Link, er kann für einige Leute oder sogar für mich zu einem späteren Zeitpunkt hilfreich sein.
Michael Dorst
Um klar zu sein, meine Frage ist anders, weil ich nicht verlangt habe, dass die Dateien unberührt bleiben. Ich habe nur nach Alternativen gesucht git stash && git stash apply. Sie werden feststellen, dass die Antworten auf diese Frage ganz anders sind als meine.
Michael Dorst
Ah, richtig, Ihre Frage ist etwas weniger spezifisch. Aber ich habe diese Frage gestellt, weil ihre Antworten auch Ihre Anforderungen erfüllen. Auf diese Weise wird diese Frage in der Seitenleiste als "Verknüpft" angezeigt, sodass sie für jemanden hilfreich sein kann.
Mariusz Pawelski

Antworten:

155

Eine andere Möglichkeit, dies zu tun, besteht darin, die Änderungen, die Sie beibehalten möchten, zu inszenieren und dann alles zu verstauen, indem Sie --keep-index:

$ git add modified-file.txt
$ git stash push --keep-index

Mit den obigen Befehlen wird alles gespeichert, die Dateien bleiben jedoch in Ihrem Arbeitsverzeichnis gespeichert.

Aus der offiziellen Linux Kernel Git-Dokumentation fürgit stash oder von git-scm :

Wenn die --keep-indexOption verwendet wird, bleiben alle Änderungen, die bereits zum Index hinzugefügt wurden, erhalten.

Cirelli94
quelle
3
Dies ist bei weitem die einfachste Erklärung für --keep-index, die ich gesehen habe. Ich habe nicht ganz verstanden, wie es in den Dokumenten formuliert war.
40 Detectives
52

git stashund dann git stash apply( git stash && git stash apply) werden Dateien gespeichert und sofort danach gespeichert. Immerhin haben Sie Ihre Änderungen im Stash und im Arbeitsverzeichnis.

Sie können einen Alias ​​erstellen, wenn Sie ihn in einem Stück haben möchten. Setzen Sie einfach so etwas wie folgt ein ~/.gitconfig:

[alias]
    sta = "!git stash && git stash apply"

Der Nachteil dieses Ansatzes besteht darin, dass alle Dateien gespeichert und neu erstellt werden. Dies bedeutet, dass Zeitstempel für die betreffenden Dateien geändert werden. (Emacs beschwert sich, wenn ich versuche, die Datei zu speichern, wenn sie vor dem Öffnen geöffnet wurde git sta, und kann zu unnötigen Neuerstellungen führen, wenn Sie sie verwenden makeoder Freunde.)

verrückter Kopf
quelle
1
Was ist der Unterschied zwischen git stash; git stash applyund git stash && git stash apply?
Michael Dorst
2
@anthropomorphic git config --global alias.sta "!git stash && git stash apply"sollte es tun.
Wie kann ich diesen Alias ​​für die Verwendung git stash savemit einem Argument ändern und dann tun git stash apply?
Spinningarrow
1
@ JaySidri, Bang bedeutet, dass es sich tatsächlich um einen externen Befehl handelt, nicht um ein Git-Argument. In den Dokumenten heißt es : "Wie Sie sehen können, ersetzt Git den neuen Befehl einfach durch einen beliebigen Alias. Möglicherweise möchten Sie jedoch einen externen Befehl anstelle eines Git-Unterbefehls ausführen. In diesem Fall starten Sie den Befehl mit einem ! Charakter. "
Madhead
10

Eine kleine Verbesserung der Antwort, die in der Praxis wahrscheinlich verwendet werden kann.

$ git add modified-file.txt  
(OR $ git add .    ---- for all modified file)
$ git stash save --keep-index "Your Comment"
Premchandra Singh
quelle
HINWEIS: funktioniert nicht ohne "git add" (z. B. für geänderte, aber nicht zu Commit-Dateien hinzugefügte Dateien)
alex_1948511
4

Es gibt einen Trick, der Ihnen helfen kann, nicht etwas zu verstauen, sondern FWIW:

git add -A
git commit -m "this is what's called stashing"       (create new stash commit)
git tag stash                               (mark the commit with 'stash' tag)
git reset HEAD~        (Now go back to where you've left with your working dir intact)

Und jetzt steht Ihnen ein mit Commit-Tags versehener Stash zur Verfügung. Es ist git stash popohnehin nicht möglich, einen zu erstellen, aber Sie können von dort aus Patches erstellen oder Dateien usw. zurücksetzen. Außerdem bleiben Ihre Arbeitsverzeichnisdateien übrigens intakt.

KenIchi
quelle
2

Sie können git stash createein Stash-Commit erstellen und es dann im Stash speichern, indem Sie Folgendes verwenden git stash store:

git stash store $(git stash create) -m "Stash commit message"

Dies kann in einem Git-Alias ​​gespeichert werden, um es bequemer zu machen:

git config --global alias.stash-keep '!git stash store $(git stash create)'

git stash-keep -m "Stash commit message"

Beachten Sie, dass dies nicht tun alles , das git stash pushtut. Beispielsweise wird der Filialname nicht an das Commit angehängt, z stash@{0}: On myBranch: Stash commit message. B. " ".

M. Justin
quelle
1
Ich liebe dieses !! Eine Korrektur aber: man git-stashsagt der -m <message>kommen muss , bevor die Hash begehen. Außer, dass sich etwas am neuesten Git ändert.
Tanius