Domanda Trova e ripristina un file eliminato in un repository Git


Dì che sono in un repository Git. Eliminare un file e confermare questa modifica. Continuo a lavorare e ad impegnarmi ancora di più. Quindi, trovo che ho bisogno di ripristinare quel file.

So che posso eseguire il checkout di un file usando git checkout HEAD^ foo.bar, ma non so davvero quando quel file è stato cancellato.

  1. Quale sarebbe il modo più rapido per trovare il commit che ha cancellato un determinato nome file?
  2. Quale sarebbe il modo più semplice per riportare il file nella mia copia di lavoro?

Spero di non dover scorrere manualmente i miei registri, controllare l'intero progetto per un dato SHA e quindi copiare manualmente il file nel mio checkout del progetto originale.


2382
2018-06-04 22:40


origine


risposte:


Trova l'ultimo commit che ha interessato il percorso specificato. Poiché il file non è nel commit HEAD, questo commit deve averlo eliminato.

git rev-list -n 1 HEAD -- <file_path>

Quindi controlla la versione al commit prima, usando il cursore (^) simbolo:

git checkout <deleting_commit>^ -- <file_path>

O in un comando, se $file è il file in questione.

git checkout $(git rev-list -n 1 HEAD -- "$file")^ -- "$file"

Se stai usando zsh e hai abilitato l'opzione EXTENDED_GLOB, il simbolo del punto di inserimento non funzionerà. Puoi usare ~1 anziché.

git checkout $(git rev-list -n 1 HEAD -- "$file")~1 -- "$file"

2718
2017-07-11 07:12



  1. Uso git log --diff-filter=D --summary per ottenere tutti i commit che hanno cancellato i file e cancellati i file;
  2. Uso git checkout $commit~1 filename per ripristinare il file eliminato.

Dove $commit è il valore del commit che hai trovato al passaggio 1, ad es. e4cf499627


723
2018-06-04 23:10



Per ripristinare tutti i file eliminati in una cartella, immettere il seguente comando.

git ls-files -d | xargs git checkout --

301
2017-12-02 06:11



Sono arrivato a questa domanda cercando di ripristinare un file che ho appena cancellato ma non avevo ancora commesso il cambiamento. Nel caso in cui ti trovi in ​​questa situazione, tutto ciò che devi fare è il seguente:

git checkout HEAD -- path/to/file.ext


99
2018-04-10 00:03



Se sei pazzo, usa git-bisect. Ecco cosa fare:

git bisect start
git bisect bad
git bisect good <some commit where you know the file existed>

Ora è il momento di eseguire il test automatico. Il comando della shell '[ -e foo.bar ]' restituirà 0 se foo.bar esiste, e 1 altrimenti. Il comando "run" di git-bisect userà la ricerca binaria per trovare automaticamente il primo commit in cui il test fallisce. Inizia a metà dell'intervallo assegnato (da buono a cattivo) e lo taglia a metà in base al risultato del test specificato.

git bisect run '[ -e foo.bar ]'

Ora sei al commit che l'ha cancellato. Da qui, puoi tornare al futuro e usarlo git-revert per annullare la modifica,

git bisect reset
git revert <the offending commit>

oppure puoi tornare indietro di un commit e ispezionare manualmente il danno:

git checkout HEAD^
cp foo.bar /tmp
git bisect reset
cp /tmp/foo.bar .

82
2018-06-04 22:46



Il mio nuovo alias preferito, basato su bonyiii'S risposta (upvoted), e la mia risposta su "Passa un argomento ad un comando Git alias":

git config alias.restore '!f() { git checkout $(git rev-list -n 1 HEAD -- $1)~1 -- $(git diff --name-status $(git rev-list -n 1 HEAD -- $1)~1 | grep '^D' | cut -f 2); }; f'

Ho perso un file, cancellato per sbaglio qualche commit fa?
Presto:

git restore my_deleted_file

Crisi evitata.


Robert Dailey propone nei commenti il seguente alias:

restore-file = !git checkout $(git rev-list -n 1 HEAD -- "$1")^ -- "$1"

E Jegan aggiunge nei commenti:

Per impostare l'alias dalla riga di comando, ho usato questo comando:

git config --global alias.restore "\!git checkout \$(git rev-list -n 1 HEAD -- \"\$1\")^ -- \"\$1\"" 

61
2018-02-17 15:33



Se conosci il nome del file, questo è un modo semplice con i comandi di base:

Elenca tutti i commit per quel file.

git log -- path/to/file

L'ultimo commit (in alto) è quello che ha cancellato il file. Quindi è necessario ripristinare il penultimo commit.

git checkout {second to last commit} -- path/to/file

42
2018-02-27 01:50



Per ripristinare un file cancellato e attivato:

git reset HEAD some/path
git checkout -- some/path

È stato testato su Git versione 1.7.5.4.


27
2017-07-04 04:39



Se hai apportato solo modifiche e cancellato un file, ma non lo hai commesso, ora hai interrotto le modifiche

git checkout -- .

ma i tuoi file cancellati non sono tornati, devi semplicemente eseguire il seguente comando:

git checkout <file_path>

E presto, il tuo file è tornato.


21
2017-09-02 15:30



Ho avuto questa soluzione.

  1. Ottieni l'ID del commit in cui il file è stato eliminato utilizzando uno dei seguenti modi.

    • git log --grep=*word* 
    • git log -Sword
    • git log | grep --context=5 *word*
    • git log --stat | grep --context=5 *word* # raccomandato se a malapena ricorda niente
  2. Dovresti ottenere qualcosa del tipo:

commit bfe68bd117e1091c96d2976c99b3bcc8310bebe7 Autore: Alexander   Orlov Data: gio 12 maggio 23:44:27 2011   0200

replaced deprecated GWT class
- gwtI18nKeySync.sh, an outdated (?, replaced by a Maven goal) I18n generation script

commit 3ea4e3af253ac6fd1691ff6bb89c964f54802302 Autore: Alexander   Orlov Data: gio 12 maggio 22:10:22 2011   0200

3. Ora usando l'id di commit bfe68bd117e1091c96d2976c99b3bcc8310bebe7 fai:

git checkout bfe68bd117e1091c96d2976c99b3bcc8310bebe7^1 yourDeletedFile.java

Poiché l'id di commit fa riferimento al commit in cui il file è stato già cancellato, devi fare riferimento al commit appena prima di bfe68b che puoi fare aggiungendo ^1. Questo significa: dammi il commit subito prima di bfe68b.


20
2018-03-01 10:48



git checkout /path/to/deleted.file

13
2018-06-25 19:40