C'era una volta un file nel mio progetto che ora vorrei poter ottenere.
Il problema è: non ho idea di quando l'ho eliminato e su quale percorso fosse.
Come posso individuare i commit di questo file quando esisteva?
C'era una volta un file nel mio progetto che ora vorrei poter ottenere.
Il problema è: non ho idea di quando l'ho eliminato e su quale percorso fosse.
Come posso individuare i commit di questo file quando esisteva?
Risposte:
Se non conosci il percorso esatto che puoi utilizzare
git log --all --full-history -- "**/thefile.*"
Se conosci il percorso in cui si trovava il file, puoi farlo:
git log --all --full-history -- <path-to-file>
Questo dovrebbe mostrare un elenco di commit in tutti i rami che hanno toccato quel file. Quindi, puoi trovare la versione del file che desideri e visualizzarla con ...
git show <SHA> -- <path-to-file>
O ripristinalo nella tua copia di lavoro con:
git checkout <SHA>^ -- <path-to-file>
Nota il simbolo del punto di inserimento ( ^), che ottiene il checkout prima di quello identificato, poiché al momento del <SHA>commit il file viene eliminato, dobbiamo guardare il commit precedente per ottenere il contenuto del file eliminato
git log -- <path>non avrà output quando ci si trova in un ramo in cui il file non è mai esistito. Dovresti sempre usare git log --all -- <path>, per assicurarti di non perdere i cambiamenti avvenuti su altri rami. Il comando git log -- <path>può essere molto pericoloso se si dispone di più di un ramo e si tende a dimenticare percorsi e rami (come me) ed è anche pericoloso se si lavora con altri sviluppatori.
--all(grazie Philip ) alla tua git logrisposta, in modo che le persone non perdano modifiche e file su altri rami. Ciò salverebbe molto il dolore alle persone smemorate come me.
git checkout <SHA>^ -- <path-to-file>(notare il simbolo ^), poiché al momento del <SHA> il commit del file è stato cancellato, dobbiamo guardare al commit precedente per ottenere il contenuto del file cancellato
Ottieni un elenco dei file eliminati e copia il percorso completo del file eliminato
git log --diff-filter=D --summary | grep delete
Eseguire il comando successivo per trovare l'ID commit di quel commit e copiare l'id commit
git log --all -- FILEPATH
Mostra diff del file eliminato
git show COMMIT_ID -- FILE_PATH
Ricorda, puoi scrivere l'output in un file usando >like
git show COMMIT_ID -- FILE_PATH > deleted.diff
unknown revision or path not in the working tree.
git log --diff-filter=D --summary | grep -E 'delete|^commit\s+\S+'
git-grep-latest(){ result_path=$(git log --diff-filter=D --summary | grep $1 | head -1 | awk '{print $4;}'); latest_commit=$(git log --all -- $result_path | head -1 | awk '{print $2;}'); git show $latest_commit -- $result_path; }e ora puoi semplicemente fare:git-grep-latest some_text
linux pipes.. ti piacerà.
Impossibile modificare la risposta accettata, quindi aggiungendola come risposta qui,
per ripristinare il file in git, utilizzare quanto segue (notare il segno '^' subito dopo SHA)
git checkout <SHA>^ -- /path/to/file
<SHA>~1dovrebbe funzionare allo stesso modo senza la necessità di avvolgerlo tra virgolette.
Supponiamo che tu voglia recuperare un file chiamato MyFile, ma non sei sicuro del suo percorso (o della sua estensione, del resto):
Prelim .: Evita la confusione avvicinandoti alla radice git
Un progetto non banale può avere più directory con nomi simili o identici.
> cd <project-root>
Trova il percorso completo
git log --diff-filter = D --summary | grep elimina | grep MyFile
delete mode 100644 full/path/to/MyFile.js
full/path/to/MyFile.js è il percorso e il file che stai cercando.
Determina tutti i commit che hanno interessato quel file
git log --oneline --follow - full / path / to / MyFile.js
bd8374c Some helpful commit message
ba8d20e Another prior commit message affecting that file
cfea812 The first message for a commit in which that file appeared.
Guarda il file
Se si sceglie il commit elencato per primo (l'ultimo in ordine cronologico, qui bd8374c), il file non verrà trovato, poiché è stato eliminato in quel commit.
> git checkout bd8374c -- full/path/to/MyFile.js
`error: pathspec 'full/path/to/MyFile.js' did not match any file(s) known to git.`
Basta selezionare il commit precedente (aggiungi un cursore):
> git checkout bd8374c^ -- full/path/to/MyFile.js
git log --diff-filter=D --summary | find "delete" | find "MyFile"E il passaggio 3 , notare le virgolette attorno all'hash:git checkout "bd8374c^" -- full/path/to/MyFile.js
@Amber ha dato la risposta corretta! Ancora un'altra aggiunta, se non conosci il percorso esatto del file puoi usare i caratteri jolly! Questo ha funzionato per me.
git log --all -- **/thefile.*
Di seguito è riportato un semplice comando, in cui un utente dev o un utente git può passare un nome file eliminato dalla directory principale del repository e ottenere la cronologia:
git log --diff-filter=D --summary | grep filename | awk '{print $4; exit}' | xargs git log --all --
Se qualcuno, può migliorare il comando, per favore fallo.
Prova a utilizzare uno dei visualizzatori, ad esempio in gitkmodo da poter sfogliare la cronologia per trovare quel file ricordato per metà. (utilizzare gitk --allse necessario per tutti i rami)
--allopzione è fondamentale sia per la risposta che per la risposta accettata.
Sommario:
Si cerca il percorso completo del file nella cronologia dei file eliminati git log --diff-filter=D --summary | grep filename
Ripristini il tuo file dal commit prima che fosse eliminato
restore () {
filepath="$@"
last_commit=$(git log --all --full-history -- $filepath | grep commit | head -1 | awk '{print $2; exit}')
echo "Restoring file from commit before $last_commit"
git checkout $last_commit^ -- $filepath
}
restore my/file_path
Ecco la mia soluzione:
git log --all --full-history --oneline -- <RELATIVE_FILE_PATH>
git checkout <COMMIT_SHA>^ -- <RELATIVE_FILE_PATH>