Visualizzazione di un file eliminato in Git


105

Ho cancellato un file con Git e poi eseguito il commit, quindi il file non è più nella mia copia di lavoro. Voglio esaminare il contenuto di quel file, ma non ripristinarlo effettivamente. Come posso fare questo?

Risposte:


145
git show HEAD^:path/to/file

È possibile utilizzare un identificatore di commit esplicito o HEAD~nper vedere versioni precedenti o se è stato eseguito più di un commit da quando è stato eliminato.


6
Notare che path/to/fileè il percorso completo dall'inizio del progetto (directory superiore del repository).
Jakub Narębski

1
Ho fatal: Invalid object name 'HEAD^'.(devo menzionare che ho solo "commit iniziale")
vladkras

1
Se l'eliminazione è organizzata ma non salvata, usa HEAD invece di HEAD ^ (poiché esisteva in HEAD). Ad esempio, pensavo di aver bisogno di un file, quindi l'ho aggiunto e mi sono impegnato a salvare il mio lavoro, quindi l'ho cancellato in seguito quando ho trovato una soluzione diversa. Per vedere il file originale prima di eseguire di nuovo il commit, ho mostrato a git HEAD: path / to / file
Tony Wickham

1
Penso che valga anche la pena ricordare che funziona solo se il file è stato eliminato nel commit più recente. Se il file è stato cancellato diversi commit fa, dovrai usare una delle altre risposte.
jayhendren

50

Se questo è un file che hai cancellato qualche tempo fa e non vuoi cercare una revisione , puoi usare (il file è chiamato fooin questo esempio; puoi usare un percorso completo):

git show $(git rev-list --max-count=1 --all -- foo)^:foo

L' rev-listinvocazione cerca tutte le revisioni di fooma ne elenca solo una. Poiché rev-listelenca in ordine cronologico inverso, ciò che elenca è l'ultima revisione che è cambiata foo, che sarebbe il commit che è stato cancellato foo. (Questo si basa sul presupposto che git non consente di modificare un file eliminato e tuttavia rimane eliminato.) Non è possibile utilizzare semplicemente la revisione che rev-listritorna così com'è perché foonon esiste più lì. Devi chiedere quello appena prima che contiene l'ultima revisione del file, da qui il file ^in git show.


2
Potrebbe essere necessario modificare l'ultimo foo in ./foo. E se non usano bash, ottieni l'id con "git rev-list --max-count = 1 --all - foo" e poi esegui "git show 5824127a8d99576632a04ac2b5c2344bcf751967: ./ foo" con l'id (524 .. è the id)
Dror

1
Bella risposta. Ho dovuto usare ~ invece di ^. Non so perché. E solo così le persone sono chiare su questo, 'foo' qui deve essere un percorso completo dalla radice git.
pedorro

Puoi scrivere **/foose non conosci il percorso (questo funzionerà per il comando rev-list ma non per il comando show. Tuttavia con il commit dal comando rev-list puoi trovare il percorso).
Nickolai

10

Poiché potresti non ricordare il percorso esatto, puoi invece ottenere sha1 da git log, quindi puoi semplicemente emettere

 git cat-file -p <sha1>

5
Per conto di Samuel Slund : Un modo per trovare la somma sha1 da usare sopra è: git whatchanged --no-abbrevche fornisce un output simile a git (o svn) log.
rumore senza arte
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.