Git-Stash ohne Zwischenspeicher: Wie werden alle nicht bereitgestellten Änderungen entfernt?

96

Angenommen, in einem von git versionierten Projekt werden zwei Änderungen vorgenommen. Ein Set ist inszeniert und das andere nicht.

Ich möchte inszenierte Änderungen erneut überprüfen, indem ich mein Projekt in diesem Zustand ausführe (vor dem Festschreiben). Was ist ein einfacher Weg, um alle nicht bereitgestellten Änderungen zu beseitigen und nur inszeniert zu lassen? Ich brauche also nicht bereitgestellte Änderungen, um aus meinem Projekt zu verschwinden, aber um sie für weitere Arbeiten irgendwo zu speichern.

Das klingt sehr nach git stashBefehl. Aber git stashwürde sowohl nicht inszenierte als auch inszenierte Änderungen von meinem Projekt entfernen. Und ich kann so etwas nicht finden git stash uncached.

klm123
quelle
Bis heute gibt es mit meinem Git 2.21 noch keine gute Antwort darauf. Alle Antworten unten sind entweder falsch ( -kOption) oder umständlich zu verwenden.
Penghe Geng

Antworten:

98

Update 2:
Ich bin mir nicht sicher, warum sich die Leute über diese Antwort beschweren. Es scheint perfekt mit mir zu funktionieren. Für die nicht extrahierten Dateien können Sie das -uFlag hinzufügen

Der vollständige Befehl wird git stash --keep-index -u

Und hier ist ein Ausschnitt aus der git-stashHilfe

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

Wenn die Option --include-untracked verwendet wird, werden alle nicht verfolgten Dateien ebenfalls gespeichert und dann mit git clean bereinigt, sodass das Arbeitsverzeichnis in einem sehr sauberen Zustand bleibt. Wenn stattdessen die Option --all verwendet wird, werden die ignorierten Dateien zusätzlich zu den nicht verfolgten Dateien gespeichert und bereinigt.

Und das ist ein GIF, wie es aussieht:

Geben Sie hier die Bildbeschreibung ein

Aktualisieren:

Obwohl dies die ausgewählte Antwort ist, haben viele darauf hingewiesen, dass die [Antwort unten] (https://stackoverflow.com/a/34681302/292408) die richtige ist. Ich empfehle, sie zu überprüfen.

Ich habe meine Antwort heute (31.1.2020) erneut gegen die Git-Version getestet 2.24.0und glaube immer noch, dass sie korrekt ist. Ich habe oben einen kleinen Hinweis zu den nicht verfolgten Dateien hinzugefügt. Wenn Sie denken, dass es nicht funktioniert, erwähnen Sie bitte auch Ihre Git-Version.

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

git stash --keep-index

Aus der Dokumentation vongit-stash :

Teil-Commits testen

Sie können verwenden, git stash save --keep-indexwenn Sie zwei oder mehr Festschreibungen aus den Änderungen im Arbeitsbaum vornehmen und jede Änderung vor dem Festschreiben testen möchten:

# ... hack hack hack ...
$ git add --patch foo            # add just first part to the index
$ git stash save --keep-index    # save all other changes to the stash
$ edit/build/test first part
$ git commit -m 'First part'     # commit fully tested change
$ git stash pop                  # prepare to work on all other changes
# ... repeat above five steps until one commit remains ...
$ edit/build/test remaining parts
$ git commit foo -m 'Remaining parts'

Wenn Sie jedoch nur die bereitgestellten Änderungen visuell überprüfen möchten, können Sie Folgendes versuchen difftool:

git difftool --cached
Mohammad AbuShady
quelle
4
Sehen Sie auch, git stash [-p|--patch]was sich wie interaktives Verstauen anfühlt. Unter man git stash"Mit --patch können Sie interaktiv Hunks aus dem Diff zwischen HEAD und dem zu verstauenden Arbeitsbaum auswählen."
hier
1
Ich in der Regel add -p, checkout -pund reset -pnie versucht stash -p, danke für den Tipp: D
Mohammad AbuShady
18
Beachten Sie, dass in dieser Antwort auch die von Ihnen bereitgestellten Änderungen gespeichert werden.
Ben Flynn
Diese Antwort ist nicht wirklich nützlich, da sie zu Verwirrung führen wird. Diese Antwort ist besser stackoverflow.com/a/34681302/292408 .
Elijah Lynn
1
@ElijahLynn Ich habe auf die andere Antwort verlinkt, da ich viele Leute gefunden habe, die sagten, es sei die bessere Antwort, danke für Ihren Kommentar
Mohammad AbuShady
99

In der akzeptierten Antwort werden auch inszenierte Änderungen gespeichert, wie einige hervorgehoben haben, und nicht verfolgte Dateien werden nicht gespeichert. Hier ist eine Möglichkeit, dies zu tun, ohne die bereitgestellten Änderungen im Stash zu erhalten und gleichzeitig nicht verfolgte Dateien zu entfernen und zu verstauen.

Die Idee ist, ein vorübergehendes Festschreiben Ihrer bereitgestellten Änderungen durchzuführen, dann die nicht bereitgestellten Änderungen zu speichern und das temporäre Festschreiben aufzuheben:

# temp commit of your staged changes:
$ git commit --message "WIP"

# stage your previously unstaged files before stashing (so you get untracked files):
$ git add .

$ git stash

# now un-commit your WIP commit:
$ git reset --soft HEAD^

Zu diesem Zeitpunkt haben Sie einen Vorrat Ihrer nicht bereitgestellten Änderungen und nur Ihre bereitgestellten Änderungen in Ihrer Arbeitskopie.

stephen.hanson
quelle
21
Dies ist wirklich die richtige Antwort IMO. Die --keep-indexOption in der aktuellen akzeptierten Antwort stashes noch was im Index ist, ist es gerade auch hält es im Index. Dann wird es dupliziert und es kommt zu Heiterkeit.
Ken Williams
3
@ KenWilliams <del> Heiterkeit </ del> <ins> Tragödie </ ins>
Dienstag,
@ KenWilliams Das hat mich wirklich irritiert. OP können Sie bitte die ausgewählte Antwort anpassen?
Mike Murko
2
Der git add .Schritt sollte möglicherweise verbessert werden, git add --allda dadurch auch die Dateien in einem Verzeichnis über dem aktuellen Arbeitsverzeichnis abgerufen werden sollten.
Elijah Lynn
1
Dies ist die bisher beste Antwort, da die Option --keep-index in der akzeptierten Antwort irreführend ist. Dies sollte die akzeptierte Antwort sein.
Elijah Lynn
21

Ich fand, dass die markierte Antwort für mich nicht funktionierte, da ich etwas brauchte, das wirklich nur meine nicht inszenierten Änderungen versteckte. Die markierte Antwort enthält git stash --keep-indexsowohl die inszenierten als auch die nicht inszenierten Änderungen. Der --keep-indexTeil lässt lediglich den Index auch auf der Arbeitskopie intakt. Das funktioniert für OP, aber nur, weil er eine etwas andere Frage gestellt hat, als er eigentlich wollte.

Der einzig wahre Weg, nicht bereitgestellte Änderungen zu speichern, besteht darin, den Speicher überhaupt nicht zu verwenden:

git diff > unstaged.diff
git apply -R unstaged.diff

git checkout -- .wird auch statt funktionieren apply -R.

Arbeit Arbeit Arbeit...

git apply unstaged.diff
rm unstaged.diff
Binäres Phile
quelle
1
Hier auf git version 2.6.1.windows.1, git stash -karbeitete wie beschrieben.
Koppor
Dies sollte die akzeptierte Antwort sein! Es ist das einzige in mehreren Stackoverflow-Threads, das das tut, was es behauptet, und sich nicht darauf verlässt, temporäre Commits durchzuführen!
user643011
1
@ user643011: Temp Commits sind keine schlechte Sache in Git. Sie kosten nichts und schaden niemandem.
Fritz
1
@Fritz: In einigen Szenarien sind keine temporären Commits möglich. Dies kann fehlschlagen, wenn Sie einen Pre-Commit-Hook haben, der den aktuellen Arbeitscode überprüft. Wenn Ihre bereitgestellten Änderungen gut sind, Ihre nicht bereitgestellten Änderungen jedoch nicht, werden bei diesem Ansatz keine bereitgestellten Änderungen festgeschrieben.
Penghe Geng
1
Dies schließt nicht verfolgte Dateien nicht ein. Sie müssen "git ls-files" verwenden, um diese im Diff-Patch zu finden und
einzuschließen
5

Git: Verstecke nicht bereitgestellte Änderungen

Dadurch werden alle Änderungen gespeichert, die Sie nicht hinzugefügt haben:

git stash -k

Beachten Sie, dass neu erstellte (und nicht hinzugefügte) Dateien in Ihrem Arbeitsverzeichnis verbleiben, sofern Sie nicht auch den -uSchalter verwenden.

git stash -k -u 

Außerdem muss Ihr Arbeitsverzeichnis sauber sein (dh alle Änderungen müssen hinzugefügt werden), wenn Sie später Stash Pop aktivieren.

http://makandracards.com/makandra/853-git-stash-unstaged-changes

Cory Danielson
quelle
13
Dies entspricht git stash --keep-index. Bereitgestellte Dateien sind im Vorrat enthalten.
Benjamin Cheah