Ho nascosto le mie modifiche. Ora voglio decomprimere solo alcuni file dalla scorta. Come posso fare questo?
Ho nascosto le mie modifiche. Ora voglio decomprimere solo alcuni file dalla scorta. Come posso fare questo?
Risposte:
Come menzionato di seguito , e dettagliato in " Come estrarre un singolo file (o le modifiche a un file) da un git stash? ", È possibile applicare l'uso git checkout
o git show
ripristinare un file specifico.
git checkout stash@{0} -- <filename>
Ciò sovrascrive filename
: assicurati di non avere modifiche locali, oppure potresti voler unire il file nascosto .
(Come commentato da Jaime M. , di certo shell come tcsh in cui è necessario fuggire i caratteri speciali, la sintassi sarebbe: git checkout 'stash@{0}' -- <filename>
)
o per salvarlo con un altro nome file:
git show stash@{0}:<full filename> > <newfile>
(nota che qui
<full filename>
c'è il percorso completo di un file relativo alla prima directory di un progetto (pensa: relativo astash@{0}
)).
yucer suggerisce nei commenti :
Se si desidera selezionare manualmente quali modifiche si desidera applicare da quel file:
git difftool stash@{0}..HEAD -- <filename>
Vivek aggiunge nei commenti :
Sembra che "
git checkout stash@{0} -- <filename>
" ripristini la versione del file al momento dell'esecuzione dello stash - NON applica (solo) le modifiche stash per quel file.
Per fare quest'ultimo:
git diff stash@{0}^1 stash@{0} -- <filename> | git apply
(come commentato da peterflynn , | git apply -p1
in alcuni casi potrebbe essere necessario rimuovere una ( p1
) barra iniziale dai percorsi diff tradizionali)
Come commentato: "unstash" ( git stash pop
), quindi:
git add
)git stash --keep-index
L'ultimo punto è ciò che ti consente di conservare alcuni file mentre ne riponi altri.
È illustrato in " Come eliminare solo un file da più file che sono stati modificati ".
git stash pop
causa di conflitti tra file. La risposta di Balamurugan A mi ha aiutato in questo caso.
unstash
significhi pop
, come mi sembra che probabilmente nella maggior parte dei casi, questo risponde solo parzialmente alla domanda. Come si rimuovono quindi i pezzi applicati in modo selettivo dalla scorta per evitare conflitti e / o confusione successivi quando si aprono le modifiche rimanenti?
git checkout stash@{N} <File(s)/Folder(s) path>
Per esempio. Per ripristinare solo il file ./test.c e la cartella ./include dall'ultimo nascosto,
git checkout stash@{0} ./test.c ./include
-a
bandiera durante la creazione della scorta.
Penso che la risposta di VonC sia probabilmente quello che vuoi, ma ecco un modo per fare un "git apply" selettivo:
git show stash@{0}:MyFile.txt > MyFile.txt
checkout
nulla.
git show stash@`{0`}:Path/To/MyFile.txt |sc Path/To/MyFile.txt
- i backtick sono necessari affinché PS non interpreti in modo speciale le parentesi graffe, e ciò sc
è necessario perché l' >
operatore di PS imposta automaticamente UTF-16 (in realtà UCS-2) che probabilmente non è quello che desideri. La risposta di @Balamurugan A non soffre di questi problemi.
Prima elenca tutti gli stash
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'
Quindi mostra quali file si trovano nella scorta (selezioniamo la scorta 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
Quindi applica il file che ti piace:
git checkout stash@{1} -- <filename>
o intera cartella:
git checkout stash@{1} /errors
Funziona anche senza, --
ma si consiglia di usarli. Vedi questo post.
È anche convenzionale riconoscere un doppio trattino come segnale per interrompere l'interpretazione delle opzioni e trattare letteralmente tutti i seguenti argomenti.
git stash pop
generava un errore per i file non tracciati. grazie.
Se tu git stash pop
(senza conflitti) rimuoverà lo stash dopo che è stato applicato. Ma se git stash apply
applicherai la patch senza rimuoverla dall'elenco di stash. Quindi è possibile ripristinare le modifiche indesiderate congit checkout -- files...
git stash pop
e ci SONO conflitti, dovrai risolverli manualmente e lo stash NON verrà rimosso.
Un altro modo:
git diff stash@{N}^! -- path/to/file1 path/to/file2 | git apply -R
checkout
o show
sovrascriverà ciecamente il tuo file invece di applicare solo le modifiche. "Un altro modo" è un eufemismo.
path/to/file2
come si desidera diff sullo stesso file nell'area di lavoro. Lasciare il secondo percorso funziona bene per me. - E ricevo un messaggio di errore usando l' -R
opzione ("applica la patch al contrario", provando a correggere la versione nascosta ?!). Quindi la mia versione funzionante sembra git diff stash@{N}^! -- path/to/file | git apply -
.
...| git apply -3 -
Per utenti Windows: le parentesi graffe hanno un significato speciale in PowerShell. Puoi circondare con virgolette singole o scappare con il backtick. Per esempio:
git checkout 'stash@{0}' YourFile
Senza di essa, potresti ricevere un errore:
Unknown switch 'e'