2011-09-14 12 views
7

Dire che ho una directory contenente centinaia di file. Modifico molti di loro, ma in seguito capisco che i miei cambiamenti sono pessimi. Se lo faccio:Come posso ripristinare solo i file modificati su un checkout git?

git checkout whole_folder 

Quindi tutto viene nuovamente estratto e devo ricompilare tutto. C'è un modo per fare il checkout solo sui file modificati, o devo eseguire checkout su ogni file separatamente?

+0

Se fai 'git checkout - ' (la versione leggermente più sicura di 'git checkout whole_folder') i timestamp rimangono lo stesso per i file che non sono modificati da quel comando. Ciò significa che il tuo processo di compilazione dovrebbe ancora ricostruire solo i file che ritiene minimamente necessario in base ai minuti. –

+0

Sei sicuro che git controlli tutto? Git IIRC cerca davvero di controllare solo i file che sono modificati e non toccare nient'altro quando fai git checkout - whole_folder, o git reset --hard HEAD. – holygeek

+0

Quindi, dovrei fare 'git checkout - whole_folder'? – Geo

risposta

13

Prova questo:

$ git checkout `git ls-files -m` 

liste -m solo i file modificati.

+0

Non è disponibile una soluzione multipiattaforma? A volte utilizzo Windows da una shell standard 'cmd.exe'. – Geo

2

Quello che stai facendo è corretto, ma si potrebbe desiderare di aggiungere una disambiguazione -- nel caso in cui si dispone di un nome di directory che è la stessa di un nome del ramo, vale a dire:

git checkout -- whole_folder 

git si aggiornerà solo il timestamp sui file che deve effettivamente essere modificato, quindi se lo strumento di creazione basato sulle dipendenze sta utilizzando correttamente mtimes, il numero minimo di file sicuri dovrebbe essere ricostruito. Se vedi comportamenti diversi, sarebbe un bug.

2

Ma

git checkout -- $(git ls-files -m) 

anche checksout i file cancellati.

Se si vuole checkout solo i file modificati questo lavoro per me:

git checkout -- $(git status -uno | grep --colour=never '#' | awk '{ print $2 $3 }' | grep --colour=never ^modified: | cut -c10-) 
+0

Grazie a @TheFox. Ha quasi funzionato. Doveva modificare il comando su un po 'per farlo funzionare per me. Ecco la riga che ho usato: '' 'git checkout - $ (stato git | grep modificato: | cut -c14-)' '' – user1029978

Problemi correlati