Ich habe meine Änderungen verstaut. Jetzt möchte ich nur einige Dateien aus dem Stash entfernen. Wie kann ich das machen?
Ich habe meine Änderungen verstaut. Jetzt möchte ich nur einige Dateien aus dem Stash entfernen. Wie kann ich das machen?
Antworten:
Wie unten erwähnt und unter " Wie würde ich eine einzelne Datei (oder Änderungen an einer Datei) aus einem Git-Stash extrahieren? " Ausführlich beschrieben , können Sie die Verwendung git checkout
oder git show
das Wiederherstellen einer bestimmten Datei anwenden .
git checkout stash@{0} -- <filename>
Das wird überschrieben filename
: Stellen Sie sicher, dass Sie keine lokalen Änderungen vorgenommen haben, oder Sie möchten stattdessen die versteckte Datei zusammenführen .
(Wie kommentiert von Jaime M. , für bestimmte Shell wie tcsh , wo Sie brauchen , um die Sonderzeichen zu entkommen, würde die Syntax sein: git checkout 'stash@{0}' -- <filename>
)
oder um es unter einem anderen Dateinamen zu speichern:
git show stash@{0}:<full filename> > <newfile>
(Beachten Sie, dass hier der
<full filename>
vollständige Pfadname einer Datei relativ zum obersten Verzeichnis eines Projekts angegeben ist (denken Sie: relativ zustash@{0}
)).
yucer schlägt in den Kommentaren vor :
Wenn Sie manuell auswählen möchten, welche Änderungen Sie aus dieser Datei übernehmen möchten:
git difftool stash@{0}..HEAD -- <filename>
Vivek fügt in den Kommentaren hinzu :
Sieht so aus, als ob "
git checkout stash@{0} -- <filename>
" die Version der Datei zum Zeitpunkt der Ausführung des Stashs wiederherstellt - es werden NICHT (nur) die versteckten Änderungen für diese Datei angewendet.
Um Letzteres zu tun:
git diff stash@{0}^1 stash@{0} -- <filename> | git apply
(Wie von Peterflynn kommentiert , müssen Sie in einigen Fällen möglicherweise einen ( ) führenden Schrägstrich aus herkömmlichen Diff-Pfaden entfernen. )| git apply -p1
p1
Wie kommentiert: "unstash" ( git stash pop
), dann:
git add
)git stash --keep-index
Der letzte Punkt ist, was es Ihnen ermöglicht, einige Dateien zu behalten, während andere gespeichert werden.
Es wird in " So verstauen Sie nur eine Datei aus mehreren Dateien, die sich geändert haben " veranschaulicht .
git stash pop
aufgrund von Dateikonflikten nicht möglich ist. Die Antwort von Balamurugan A hat in diesem Fall den Trick für mich getan.
unstash
bedeutet pop
, wie es mir wahrscheinlich in den meisten Fällen der Fall ist, beantwortet dies die Frage nur teilweise. Wie entfernen Sie dann die selektiv angewendeten Teile aus dem Vorrat, um spätere Konflikte und / oder Verwirrung beim Löschen der verbleibenden Änderungen zu vermeiden?
git checkout stash@{N} <File(s)/Folder(s) path>
Z.B. Um nur die Datei ./test.c und den Ordner ./include aus dem letzten Speicher wiederherzustellen,
git checkout stash@{0} ./test.c ./include
-a
beim Erstellen des Stashs eine Flagge verwendet .
Ich denke, VonCs Antwort ist wahrscheinlich das, was Sie wollen, aber hier ist eine Möglichkeit, ein selektives "Git Apply" durchzuführen:
git show stash@{0}:MyFile.txt > MyFile.txt
checkout
nichts kümmert .
git show stash@`{0`}:Path/To/MyFile.txt |sc Path/To/MyFile.txt
- Die Backticks sind erforderlich, damit PS die geschweiften Klammern nicht speziell interpretiert. Dies sc
ist erforderlich, da der PS- >
Operator standardmäßig UTF-16 (eigentlich UCS-2) verwendet, was wahrscheinlich nicht das ist, was Sie möchten. Die Antwort von @Balamurugan A leidet nicht unter diesen Problemen.
Listen Sie zuerst alle Verstecke auf
git stash list
↓
stash@{0}: WIP on Produktkonfigurator: 132c06a5 Cursor bei glyphicon plus und close zu zeigende Hand ändern
stash@{1}: WIP on Produktkonfigurator: 132c06a5 Cursor bei glyphicon plus und close zu zeigende Hand ändern
stash@{2}: WIP on master: 7e450c81 Merge branch 'Offlineseite'
Zeigen Sie dann, welche Dateien sich im Stash befinden (wählen Sie Stash 1 aus):
git stash show 1 --name-only
//Hint: you can also write
//git stash show stash@{1} --name-only
↓
ajax/product.php
ajax/productPrice.php
errors/Company/js/offlineMain.phtml
errors/Company/mage.php
errors/Company/page.phtml
js/konfigurator/konfigurator.js
Wenden Sie dann die gewünschte Datei an:
git checkout stash@{1} -- <filename>
oder ganzer Ordner:
git checkout stash@{1} /errors
Es funktioniert auch ohne, --
aber es wird empfohlen, sie zu verwenden. Siehe diesen Beitrag.
Es ist auch üblich, einen doppelten Bindestrich als Signal zu erkennen, um die Optionsinterpretation zu stoppen und alle folgenden Argumente wörtlich zu behandeln.
git stash pop
ein Fehler für nicht verfolgte Dateien aufgetreten ist. Vielen Dank.
Wenn Sie git stash pop
(ohne Konflikte) den Stash entfernen, nachdem er angewendet wurde. Wenn Sie git stash apply
dies jedoch tun, wird der Patch angewendet, ohne ihn aus der Stash-Liste zu entfernen. Dann können Sie die unerwünschten Änderungen mit zurücksetzengit checkout -- files...
git stash pop
und es Konflikte gibt, diese manuell beheben, und der Stash wird NICHT entfernt.
Noch ein Weg:
git diff stash@{N}^! -- path/to/file1 path/to/file2 | git apply -R
checkout
oder show
blind überschreiben, anstatt nur Änderungen zu übernehmen. "One more way" ist eine Untertreibung.
path/to/file2
was Sie gegen dieselbe Datei in Ihrem Arbeitsbereich unterscheiden möchten. Das Weglassen des zweiten Pfades funktioniert gut für mich. - Und ich erhalte eine Fehlermeldung mit der -R
Option ("Patch in umgekehrter Reihenfolge anwenden", versuche die versteckte Version zu patchen?!). Meine Arbeitsversion sieht also so aus git diff stash@{N}^! -- path/to/file | git apply -
.
...| git apply -3 -
Für Windows-Benutzer: Geschweifte Klammern haben in PowerShell eine besondere Bedeutung. Sie können entweder mit einfachen Anführungszeichen umgeben oder mit einem Backtick entkommen. Zum Beispiel:
git checkout 'stash@{0}' YourFile
Ohne sie erhalten Sie möglicherweise eine Fehlermeldung:
Unknown switch 'e'