Risposta breve:
git log --full-history -- your_file
ti mostrerò tutti i commit nella storia del tuo repository, inclusi i commit di unione, che sono stati toccati your_file
. L'ultimo (in alto) è quello che ha eliminato il file.
Qualche spiegazione:
La --full-history
bandiera qui è importante. Senza di essa, Git esegue la "semplificazione della cronologia" quando viene richiesta la registrazione di un file. I documenti sono chiari sui dettagli di come funziona esattamente e mi manca la grinta e il coraggio necessari per cercare di capirlo dal codice sorgente, ma i documenti di git-log hanno molto da dire:
Modalità di default
Semplifica la storia alla storia più semplice spiegando lo stato finale dell'albero. Più semplice perché elimina alcuni rami laterali se il risultato finale è lo stesso (cioè unendo i rami con lo stesso contenuto)
Questo ovviamente riguarda quando il file di cui vogliamo la cronologia viene eliminato , poiché la cronologia più semplice che spiega lo stato finale di un file eliminato non è cronologia . Esiste il rischio che git log
senza --full-history
volontà si possa semplicemente affermare che il file non è mai stato creato? Sfortunatamente sì. Ecco una dimostrazione:
mark@lunchbox:~/example$ git init
Initialised empty Git repository in /home/mark/example/.git/
mark@lunchbox:~/example$ touch foo && git add foo && git commit -m "Added foo"
[master (root-commit) ddff7a7] Added foo
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 foo
mark@lunchbox:~/example$ git checkout -b newbranch
Switched to a new branch 'newbranch'
mark@lunchbox:~/example$ touch bar && git add bar && git commit -m "Added bar"
[newbranch 7f9299a] Added bar
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 bar
mark@lunchbox:~/example$ git checkout master
Switched to branch 'master'
mark@lunchbox:~/example$ git rm foo && git commit -m "Deleted foo"
rm 'foo'
[master 7740344] Deleted foo
1 file changed, 0 insertions(+), 0 deletions(-)
delete mode 100644 foo
mark@lunchbox:~/example$ git checkout newbranch
Switched to branch 'newbranch'
mark@lunchbox:~/example$ git rm bar && git commit -m "Deleted bar"
rm 'bar'
[newbranch 873ed35] Deleted bar
1 file changed, 0 insertions(+), 0 deletions(-)
delete mode 100644 bar
mark@lunchbox:~/example$ git checkout master
Switched to branch 'master'
mark@lunchbox:~/example$ git merge newbranch
Already up-to-date!
Merge made by the 'recursive' strategy.
mark@lunchbox:~/example$ git log -- foo
commit 77403443a13a93073289f95a782307b1ebc21162
Author: Mark Amery
Date: Tue Jan 12 22:50:50 2016 +0000
Deleted foo
commit ddff7a78068aefb7a4d19c82e718099cf57be694
Author: Mark Amery
Date: Tue Jan 12 22:50:19 2016 +0000
Added foo
mark@lunchbox:~/example$ git log -- bar
mark@lunchbox:~/example$ git log --full-history -- foo
commit 2463e56a21e8ee529a59b63f2c6fcc9914a2b37c
Merge: 7740344 873ed35
Author: Mark Amery
Date: Tue Jan 12 22:51:36 2016 +0000
Merge branch 'newbranch'
commit 77403443a13a93073289f95a782307b1ebc21162
Author: Mark Amery
Date: Tue Jan 12 22:50:50 2016 +0000
Deleted foo
commit ddff7a78068aefb7a4d19c82e718099cf57be694
Author: Mark Amery
Date: Tue Jan 12 22:50:19 2016 +0000
Added foo
mark@lunchbox:~/example$ git log --full-history -- bar
commit 873ed352c5e0f296b26d1582b3b0b2d99e40d37c
Author: Mark Amery
Date: Tue Jan 12 22:51:29 2016 +0000
Deleted bar
commit 7f9299a80cc9114bf9f415e1e9a849f5d02f94ec
Author: Mark Amery
Date: Tue Jan 12 22:50:38 2016 +0000
Added bar
Si noti come git log -- bar
nel dump del terminale sopra riportato non abbia prodotto letteralmente output; Git sta "semplificando" la storia in una finzione dove bar
non è mai esistita. git log --full-history -- bar
d'altra parte, ci dà il commit che ha creato bar
e il commit che lo ha eliminato.
Per essere chiari: questo problema non è solo teorico. Ho solo esaminato i documenti e scoperto il--full-history
bandiera perché git log -- some_file
non riuscivo per me in un vero repository in cui stavo cercando di rintracciare un file eliminato. La semplificazione della cronologia a volte può essere utile quando stai cercando di capire come un file attualmente esistente è arrivato al suo stato attuale, ma quando cerchi di rintracciare una cancellazione di file è più probabile che ti rovini nascondendo il commit che ti interessa . Usa sempre la --full-history
bandiera per questo caso d'uso.