Réponse courte:
git log --full-history -- your_file
vous montrera toutes les validations de l'historique de votre dépôt, y compris les validations de fusion, qui ont touché your_file
. Le dernier (en haut) est celui qui a supprimé le fichier.
Quelques explications:
Le --full-history
drapeau ici est important. Sans cela, Git effectue une "simplification de l'historique" lorsque vous lui demandez le journal d'un fichier. Les documents sont légers sur les détails de la façon dont cela fonctionne et je n'ai pas le courage et le courage nécessaires pour essayer de le comprendre à partir du code source, mais les documents git-log ont beaucoup à dire:
Mode par défaut
Simplifie l'historique à l'historique le plus simple expliquant l'état final de l'arbre. Plus simple car il taille certaines branches latérales si le résultat final est le même (c'est-à-dire fusionner des branches avec le même contenu)
Cela concerne évidemment le moment où le fichier dont nous voulons l'historique est supprimé , car l'historique le plus simple expliquant l'état final d'un fichier supprimé n'est pas un historique . Y a-t-il un risque que git log
sans --full-history
vouloir simplement prétendre que le fichier n'a jamais été créé? Malheureusement oui. Voici une démonstration:
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
Remarquez comment git log -- bar
le vidage de terminal ci-dessus n'a entraîné littéralement aucune sortie; Git "simplifie" l'histoire en une fiction qui bar
n'a jamais existé. git log --full-history -- bar
, d'autre part, nous donne le commit qui a créé bar
et le commit qui l'a supprimé.
Pour être clair: cette question n'est pas seulement théorique. J'ai seulement regardé les documents et découvert le --full-history
drapeau parce que git log -- some_file
j'échouais dans un vrai référentiel où j'essayais de retrouver un fichier supprimé. La simplification de l'historique peut parfois être utile lorsque vous essayez de comprendre comment un fichier existant est devenu dans son état actuel, mais lorsque vous essayez de retrouver une suppression de fichier, il est plus probable qu'il vous dérange en masquant la validation qui vous intéresse . Utilisez toujours l' --full-history
indicateur pour ce cas d'utilisation.