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 log
risposta, 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>~1
dovrebbe 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 gitk
modo da poter sfogliare la cronologia per trovare quel file ricordato per metà. (utilizzare gitk --all
se necessario per tutti i rami)
--all
opzione è 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>