Ich würde gerne wissen, ob es möglich ist, eine einzelne Datei oder ein Diff einer Datei aus einem Git-Stash zu extrahieren, ohne das Stash-Änderungsset zu entfernen.
Könnte jemand dazu einige Vorschläge / Ideen machen können?
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 zusammengit 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 Stashgit stash pop
.Wenn Sie
git stash apply
anstatt verwendengit 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.quelle
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:
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 vongit stash list
, wenn Sie mehr als eine haben. Beachten Sie, dass dies so istdiff
und bietet, alle Unterschiede zwischen den Zweigen anzuwenden . Schauen Sie sich an, um Änderungen von nur einem Commit / Stash zu erhaltengit cherry-pick --no-commit
.quelle
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 Siee
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 werdengit applydiffat stash@{4}
nur Dateien verwendet, die sich zwischen dem Stash und dem übergeordneten Stash geändert haben.Kurze Antwort
So sehen Sie die gesamte Datei:
git show stash@{0}:<filename>
Um den Unterschied zu sehen:
git diff stash@{0}^1 stash@{0} -- <filename>
quelle
diff
mitdifftool
Ihrem Lieblings externen diff zu verwenden.Anmerkungen:
Stellen Sie sicher, dass nach dem Parameter "-" und dem Dateinamen ein Leerzeichen steht
Ersetzen Sie Null (0) durch Ihre spezifische Lagernummer. Verwenden Sie:
Basierend auf Jakub Narębskis Antwort - Kürzere Version
quelle
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.quelle
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 anzeigengit 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 danngit 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 danngit stash apply
erneut aus, wobei Sie die Tatsache ausnutzen, dassgit stash apply
der nicht aus dem .quelle
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 Dateigit 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.quelle
Verwenden Sie Folgendes, um die Änderungen auf eine Datei in einem Stash auf Ihren Arbeitsbaum anzuwenden.
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.quelle
Verwenden Sie die Git Stash- Erweiterung in Visual Studio Code
quelle