Antworten:
Auf der git stash- Manpage können Sie lesen (im Abschnitt "Diskussion", direkt nach der Beschreibung "Optionen"), dass:
Ein Stash wird als Commit dargestellt, dessen Baum den Status des Arbeitsverzeichnisses aufzeichnet, und sein erstes übergeordnetes Element ist das Commit bei HEAD, als der Stash erstellt wurde.
Sie können Stash (z. B. stash@{0}
das erste / oberste Stash) als Zusammenführungs-Commit behandeln und Folgendes verwenden:
$ git diff stash@{0}^1 stash@{0} -- <filename>
Erläuterung: bezeichnet stash@{0}^1
das erste übergeordnete Element des angegebenen Stashs. Dies ist, wie in der obigen Erläuterung angegeben, das Commit, bei dem Änderungen gespeichert wurden. Wir verwenden diese Form von "git diff" (mit zwei Commits), weil stash@{0}
/ refs/stash
ein Merge-Commit ist, und wir müssen git mitteilen, gegen welches Elternteil wir uns unterscheiden möchten. Kryptischer:
$ git diff stash@{0}^! -- <filename>
sollte auch funktionieren ( Erläuterungen zur Syntax finden Sie in der Manpage zu git rev-rev^!
parse im Abschnitt "Festlegen von Bereichen").
Ebenso können Sie git checkout verwenden , um eine einzelne Datei aus dem Vorrat zu überprüfen:
$ git checkout stash@{0} -- <filename>
oder um es unter einem anderen Dateinamen zu speichern:
$ git show stash@{0}:<full filename> > <newfile>
oder
$ git show stash@{0}:./<relative filename> > <newfile>
( Beachten Sie, dass hier <vollständiger Dateiname> der vollständige Pfadname einer Datei relativ zum obersten Verzeichnis eines Projekts ist (denken Sie: relativ zu stash@{0}
)).
Möglicherweise müssen Sie vor stash@{0}
Shell-Erweiterung schützen , dh verwenden "stash@{0}"
oder 'stash@{0}'
.
git checkout
Manpage doppelt überprüft . Die Datei kann nicht an einem anderen Speicherort abgelegt werden. Es gibt einen Verweis darauf in: stackoverflow.com/questions/888414/…
git checkout
Ansatz die genaue Datei aus dem Stash kopiert - er führt sie nicht wie in Ihrem Arbeitsverzeichnis zusammen git stash apply
. (Wenn Sie also Änderungen an der Basis haben, auf der der Stash erstellt wurde, gehen diese verloren).
git stash apply
, dass diese Datei im Arbeitsbaum bereitgestellt werden muss, damit die Änderungen in einer Datei zusammengeführt werden können, die im Arbeitsbaum seit dem Speichern der Datei geändert wurde. Damit die automatische Zusammenführung funktioniert, können dieselben Dateien nicht sowohl in der Arbeitskopie als auch in der versteckten Kopie, die zusammengeführt werden soll, geändert werden. Schließlich entfernt Stash Apply den Artikel nicht wie gewünscht aus dem Stash git stash pop
.
Wenn Sie git stash apply
anstatt verwenden git stash pop
, wird der Stash auf Ihren Arbeitsbaum angewendet, der Stash bleibt jedoch erhalten.
Nachdem dies erledigt ist, können Sie die gewünschte Datei add
/ commit
und die verbleibenden Änderungen zurücksetzen.
git stash pop stash@{0}
(Liste der verstaute Änderungen: git stash list
)
Es gibt eine einfache Möglichkeit, Änderungen von jedem Zweig zu erhalten, einschließlich Verstecken:
$ git checkout --patch stash@{0} path/to/file
Sie können die Dateispezifikation weglassen, wenn Sie in vielen Teilen patchen möchten. Oder lassen Sie den Patch (aber nicht den Pfad) weg, um alle Änderungen an einer einzelnen Datei zu erhalten. Ersetzen Sie 0
durch die Stash-Nummer von git stash list
, wenn Sie mehr als eine haben. Beachten Sie, dass dies so ist diff
und bietet, alle Unterschiede zwischen den Zweigen anzuwenden . Schauen Sie sich an, um Änderungen von nur einem Commit / Stash zu erhalten git cherry-pick --no-commit
.
git help checkout
. --patch
führt interaktives Zusammenführen durch. Es wendet alle Teile an, die Sie in der Shell genehmigen (oder was auch immer Sie speichern, wenn Sie e
den Patch bearbeiten möchten). Der Pfad allein überschreibt die Datei, wie ich geschrieben habe, "alle Änderungen".
git config --global alias.applydiffat '!git checkout --patch "$1" -- $(git diff --name-only "$1"^ "$1")'
- Dann werden git applydiffat stash@{4}
nur Dateien verwendet, die sich zwischen dem Stash und dem übergeordneten Stash geändert haben.
So sehen Sie die gesamte Datei: git show stash@{0}:<filename>
Um den Unterschied zu sehen: git diff stash@{0}^1 stash@{0} -- <filename>
diff
mit difftool
Ihrem Lieblings externen diff zu verwenden.
$ git checkout stash@{0} -- <filename>
Anmerkungen:
Stellen Sie sicher, dass nach dem Parameter "-" und dem Dateinamen ein Leerzeichen steht
Ersetzen Sie Null (0) durch Ihre spezifische Lagernummer. Verwenden Sie:
git stash list
Basierend auf Jakub Narębskis Antwort - Kürzere Version
Sie können den Diff für einen Stash mit " git show stash@{0}
" erhalten (oder wie auch immer die Nummer des Stash lautet; siehe "Git Stash List"). Es ist einfach, den Abschnitt des Diff für eine einzelne Datei zu extrahieren.
git show stash
Sie diese Option, um das oberste Versteck anzuzeigen (normalerweise das einzige, das Sie haben). Ebenso können Sie den Unterschied zwischen Ihrem aktuellen Zweig und dem Stash mit anzeigen git diff head stash
.
Das am einfachsten zu verstehende Konzept, obwohl es vielleicht nicht das beste ist, ist, dass Sie drei Dateien geändert haben und eine Datei speichern möchten.
Wenn Sie dies tun git stash
, um sie alle zu verstauen, git stash apply
bringen Sie sie wieder zurück und dann git checkout f.c
auf die betreffende Datei, um sie effektiv zurückzusetzen.
Wenn Sie diese Datei entstapeln möchten, führen Sie a aus git reset --hard
und führen Sie sie dann git stash apply
erneut aus, wobei Sie die Tatsache ausnutzen, dassgit stash apply
der nicht aus dem .
Wenn die versteckten Dateien mit der aktuellen Version zusammengeführt werden müssen, verwenden Sie die vorherigen Methoden mit diff. Andernfalls können Sie sie git pop
entstapeln, git add fileWantToKeep
Ihre Datei git stash save --keep-index
bereitstellen und alles außer dem, was sich auf der Bühne befindet, verstauen. Denken Sie daran, dass der Unterschied zu den vorherigen darin besteht, dass die Datei aus dem Stash "herausspringt". Die vorherigen Antworten behalten es bei, git checkout stash@{0} -- <filename>
damit es Ihren Bedürfnissen entspricht.
Verwenden Sie Folgendes, um die Änderungen auf eine Datei in einem Stash auf Ihren Arbeitsbaum anzuwenden.
git diff stash^! -- <filename> | git apply
Dies ist im Allgemeinen besser als die Verwendung, git checkout
da Sie keine Änderungen verlieren, die Sie seit dem Erstellen des Stashs an der Datei vorgenommen haben.
Verwenden Sie die Git Stash- Erweiterung in Visual Studio Code