Stash solo un singolo file


177

Mi piacerebbe essere in grado di nascondere solo le modifiche da un singolo file:

git stash save -- just_my_file.txt

Quanto sopra non funziona però. Qualche alternativa?



per un singolo file, invece di destreggiarsi tra i comandi stash, l'approccio molto più semplice è quello di copiare un singolo file e quando si desidera ripristinarlo per copiare semplicemente sull'originale. per esempio. cp just_my_file.txt just_my_file.txt.manualstash ora puoi fare tutti i checkout e tutto il resto e poiché la copia è "file non tracciato", puoi spostarti tra i rami e eseguire il commit senza problemi. Quando sei sul ramo / commit giusto dove vuoi "unire il singolo file" fai mv just_my_file.txt.manualstash just_my_file.txte ora puoi rivedere le modifiche e impegnarlo dove necessario
Dimitry K

Risposte:


174

Penso che stash -psia probabilmente la scelta che vuoi, ma nel caso in cui ti imbatti in altre cose ancora più difficili in futuro, ricorda che:

Stashè davvero solo un'alternativa molto semplice ai soli branchset leggermente più complessi . Stash è molto utile per spostare rapidamente le cose, ma puoi realizzare cose più complesse con i rami senza molto più mal di testa e lavoro.

# git checkout -b tmpbranch
# git add the_file
# git commit -m "stashing the_file"
# git checkout master

vai in giro e fai quello che vuoi, e poi semplicemente rebasee / o mergeil tmpbranch. In realtà non è che il lavoro molto più quando è necessario fare più attento monitoraggio di scorta permetterà.


2
Sul lato positivo, puoi trasformare gli stash in veri rami senza un grande dolore.
Wes Hardaker,

90

Se non si desidera specificare un messaggio con le modifiche nascoste, passare il nome file dopo un doppio trattino.

$ git stash -- filename.ext

Se si tratta di un file non tracciato / nuovo, dovrai prima metterlo in scena.

Tuttavia, se si fa desidera specificare un messaggio, l'uso push.

git stash push -m "describe changes to filename.ext" filename.ext

Entrambi i metodi funzionano nelle versioni git 2.13+


1
Questa risposta sembra la più semplice da me quando making modifica modifiche: git stash -- filename.ext, git commit --amend, git stash pop
Brandon Dewey

1
Penso che questo debba fare affidamento su alcune nuovissime funzionalità. Non funziona in git 2.1.4.
Richard Smith,

Ne risulta un comportamento strano per me, con lo stash che viene salvato, ma gli stessi file vengono aggiunti allo staging allo stesso tempo (git v2.20.1),
paradroid

58

È possibile nascondere interattivamente singole linee con git stash -p(analogo a git add -p).

Non richiede un nome file, ma potresti semplicemente saltare altri file con dfino a quando non hai raggiunto il file che desideri conservare e lo stash cambia tutti lì a.


3
Questo richiede molto tempo se hai molti file che non vuoi riporre.
jjj,

23
non so quando è cambiato, ma a partire da git 2.14.1te puoi specificare il nome del filegit stash -p <filename>
muon

21

L'opzione migliore è mettere in scena tutto tranne questo file, e dire a stash di mantenere l'indice git stash save --keep-index, riponendo così il file non messo in scena:

$ git add .
$ git reset thefiletostash
$ git stash save --keep-index

Come sottolinea Dan, thefiletostashè l'unico a essere ripristinato dalla scorta, ma blocca anche gli altri file, quindi non è esattamente quello che vuoi.


2
Sebbene ciò mantenga l'indice nello stesso stato, non nasconde anche i file che si trovano nell'indice? In altre parole, se dopo aver fatto questo esegui il commit dell'indice sul ramo corrente, quindi passa a un altro ramo e lo fai git stash pop, non applicherà tutti i file, non solo quello che volevamo riporre?
Dan Molding,

@DanMoulding: hai perfettamente ragione, non ci ho pensato.
Charles B

16

Nel caso in cui intendi effettivamente "annullare le modifiche" ogni volta che usi "git stash" (e non usi davvero git stash per riporlo temporaneamente), in quel caso puoi usare

git checkout -- <file>

Nota che git stash è solo un'alternativa più rapida e semplice alla ramificazione e al fare cose.


Penso che questa sia la risposta migliore se desideri rimuovere tutte le modifiche modificate in un singolo file.
Mohamed Haseel,

e vorrei che questa fosse la risposta migliore per quel particolare compito
Zakir hussain,

6
La domanda era abbastanza chiara e non chiedeva come ripristinare le modifiche in un file. Downvoted.
Richard Smith,

@MukulJain In realtà avevo bisogno di usare lo stash per file in modo molto temporaneo (fondamentalmente separando alcune modifiche in due commit che interessavano le stesse linee, per un file). In realtà non voglio sottovalutare, solo affermare che è inutile per me.
Paul Stelian,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.