Ukryłem swoje zmiany. Teraz chcę rozpakować tylko niektóre pliki ze skrytki. W jaki sposób mogę to zrobić?
Ukryłem swoje zmiany. Teraz chcę rozpakować tylko niektóre pliki ze skrytki. W jaki sposób mogę to zrobić?
Odpowiedzi:
Jak wspomniano poniżej i szczegółowo opisano w „ Jak wyodrębnić pojedynczy plik (lub zmiany w pliku) z skrytki git? ”, Możesz zastosować użycie git checkout
lub git show
przywrócić określony plik.
git checkout stash@{0} -- <filename>
To powoduje nadpisywanie filename
: upewnij się, że nie masz lokalnych modyfikacji, albo możesz zamiast tego scalić ukryty plik .
(Jak skomentował przez Jaime M. , dla niektórych muszli jak tcsh, gdzie trzeba uciec znaków specjalnych, składnia będzie: git checkout 'stash@{0}' -- <filename>
)
lub aby zapisać go pod inną nazwą pliku:
git show stash@{0}:<full filename> > <newfile>
(zwróć uwagę, że tutaj
<full filename>
jest pełna ścieżka do pliku w stosunku do górnego katalogu projektu (pomyśl: w odniesieniu dostash@{0}
)).
Yumper sugeruje w komentarzach :
Jeśli chcesz ręcznie wybrać zmiany, które chcesz zastosować z tego pliku:
git difftool stash@{0}..HEAD -- <filename>
Vivek dodaje w komentarzach :
Wygląda na to, że „
git checkout stash@{0} -- <filename>
” przywraca wersję pliku z momentu wykonania skrytki - NIE stosuje (tylko) ukrytych zmian dla tego pliku.
Aby zrobić to drugie:
git diff stash@{0}^1 stash@{0} -- <filename> | git apply
(jak skomentował przez peterflynn , może być konieczne | git apply -p1
w niektórych przypadkach usunięcie jednego ( p1
) prowadzącej ukośnik od tradycyjnych ścieżek różnice)
Jak skomentowano: „unstash” ( git stash pop
), a następnie:
git add
)git stash --keep-index
Ostatni punkt pozwala zachować niektóre pliki podczas ukrywania innych.
Ilustruje to „ Jak ukryć tylko jeden plik z wielu plików, które uległy zmianie ”.
git stash pop
powodu konfliktu plików. Odpowiedź Balamurugana A pomogła mi w tym przypadku.
unstash
oznacza to pop
, jak mi się wydaje, że w większości przypadków prawdopodobnie tak by było, to tylko częściowo odpowiada na pytanie. Jak następnie usunąć selektywnie zastosowane elementy ze skrytki, aby uniknąć późniejszych konfliktów i / lub zamieszania podczas usuwania pozostałych zmian?
git checkout stash@{N} <File(s)/Folder(s) path>
Na przykład. Aby przywrócić tylko plik ./test.c i folder ./include z ostatniego składowania,
git checkout stash@{0} ./test.c ./include
-a
flagi podczas tworzenia skrytki.
Myślę, że odpowiedź VonC jest prawdopodobnie tym, czego chcesz, ale oto sposób na selektywne „zastosuj git”:
git show stash@{0}:MyFile.txt > MyFile.txt
checkout
.
git show stash@`{0`}:Path/To/MyFile.txt |sc Path/To/MyFile.txt
- backsticks są konieczne, aby PS nie interpretował specjalnie nawiasów klamrowych, i sc
jest to konieczne, ponieważ >
operator PS domyślnie przyjmuje UTF-16 (właściwie UCS-2), co prawdopodobnie nie jest tym, czego chcesz. Odpowiedź @Balamurugan A nie cierpi z powodu tych problemów.
Najpierw wypisz wszystkie skrytki
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'
Następnie pokaż, które pliki są w skrytce (wybierzmy skrytkę 1):
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
Następnie zastosuj plik, który chcesz:
git checkout stash@{1} -- <filename>
lub cały folder:
git checkout stash@{1} /errors
Działa również bez, --
ale zaleca się ich użycie. Zobacz ten post.
Konwencjonalne jest również uznawanie podwójnego myślnika za sygnał do zatrzymania interpretacji opcji i traktowania wszystkich następujących argumentów dosłownie.
git stash pop
zgłosił błąd dotyczący nieśledzonych plików. Dziękuję Ci.
Jeśli ty git stash pop
(bez konfliktów) usunie skrytkę po jej zastosowaniu. Ale jeśli git stash apply
zastosujesz łatkę bez usuwania jej z listy skrytek. Następnie możesz cofnąć niechciane zmiany za pomocągit checkout -- files...
git stash pop
i tam JESTEŚ konflikty, będziesz musiał je naprawić ręcznie, a skrytka NIE zostanie usunięta.
Jeszcze jeden sposób:
git diff stash@{N}^! -- path/to/file1 path/to/file2 | git apply -R
checkout
lub show
spowoduje zastąpienie pliku na ślepo zamiast po prostu wprowadzania zmian. „Jeszcze jeden sposób” to mało powiedziane.
path/to/file2
co chcesz odróżnić od tego samego pliku w obszarze roboczym. Wyjście z drugiej ścieżki działa dla mnie dobrze. - I pojawia się komunikat o błędzie przy użyciu -R
opcji („zastosować łatkę w odwrotnej kolejności”, próbując załatać ukrytą wersję ?!). Tak wygląda moja działająca wersja git diff stash@{N}^! -- path/to/file | git apply -
.
...| git apply -3 -
Dla użytkowników systemu Windows: nawiasy klamrowe mają specjalne znaczenie w programie PowerShell. Możesz albo otoczyć pojedyncze cudzysłowy, albo uciec za pomocą backsticka. Na przykład:
git checkout 'stash@{0}' YourFile
Bez tego może pojawić się błąd:
Unknown switch 'e'