Question Rechercher lorsqu'un fichier a été supprimé dans Git


J'ai un dépôt Git avec n commits.

J'ai un fichier dont j'ai besoin, et qui était dans le dépôt, et que je cherche et pense soudainement "Oh, où est ce fichier?"

Y a-t-il une (série de) commande (s) Git qui me dira que "le fichier really_needed.txt a été supprimé au commit n-13"?

En d'autres termes, sans regarder chaque commit individuel, et sachant que mon repo Git a chaque changement de chaque fichier, puis-je trouver rapidement le dernier commit qui a ce fichier, donc je peux le récupérer?


669
2017-07-27 04:23


origine


Réponses:


git log -- [file path] montre les changements d'un fichier, fonctionne même si le fichier a été supprimé.

git log -1 -- [file path]

Voir Quel commit a supprimé un fichier


720
2018-05-19 13:48



Réponse courte:

git log --full-history -- your_file

vous montrera tout s'engage dans l'histoire de votre repo, y compris les commits de fusion, qui a touché your_file. Le dernier (en haut) est celui qui a supprimé le fichier.

Quelques explications:

le --full-history Le 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 sur comment cela fonctionne et je manque le courage et le courage nécessaire pour essayer de le comprendre à partir du code source, mais les documents git-log J'ai beaucoup à dire:

Mode par défaut

Simplifie l'histoire à l'histoire la plus simple expliquant l'état final de l'arbre. Plus simple car il élague certaines branches secondaires si le résultat final est le même (c'est-à-dire fusionner des branches avec le même contenu)

C'est évidemment inquiétant quand le fichier dont nous voulons l'histoire est supprimé, puisque l'histoire la plus simple expliquant l'état final d'un fichier supprimé est pas d'histoire. Y a-t-il un risque que git log sans pour autant --full-history va 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$ touchez foo && git ajoutez foo && git commit -m "Ajouté foo"
[master (root-commit) ddff7a7] Added foo
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 foo
mark@lunchbox:~/example$ git checkout -b nouvellebranch
Switched to a new branch 'newbranch'
mark@lunchbox:~/example$ barre de menu && git barre d'ajout && git commit -m "Barre ajoutée"
[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 "Supprimé foo"
rm 'foo'
[master 7740344] Deleted foo
 1 file changed, 0 insertions(+), 0 deletions(-)
 delete mode 100644 foo
mark@lunchbox:~/example$ git checkout nouvellebranch
Switched to branch 'newbranch'
mark@lunchbox:~/example$ git rm bar && git commit -m "Barre supprimée"
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 fusionne 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-histoire - 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-histoire - barre
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 dans la décharge du terminal ci-dessus a entraîné littéralement aucune sortie; Git "simplifie" l'histoire dans une fiction où bar Jamais existé. git log --full-history -- bar, d'autre part, nous donne l'engagement qui a créé bar et le commit qui l'a supprimé.

Pour être clair: cette question n'est pas purement théorique. J'ai seulement regardé dans les docs et découvert le --full-history drapeau parce que git log -- some_file échouait pour moi dans un référentiel réel où j'essayais de suivre un fichier supprimé. La simplification de l'historique peut parfois être utile lorsque vous essayez de comprendre comment actuellement existant fichier est arrivé à être dans son état actuel, mais en essayant de traquer un fichier effacement il est plus susceptible de vous vider en cachant le commit que vous aimez. Toujours utiliser le --full-history drapeau pour ce cas d'utilisation.


160
2018-01-12 23:00



Git log mais vous devez préfixer le chemin avec --

Par exemple:

dan-mac:test dani$ git log file1.txt
fatal: ambiguous argument 'file1.txt': unknown revision or path not in the working tree.

dan-mac:test dani$ git log -- file1.txt
 commit 0f7c4e1c36e0b39225d10b26f3dea40ad128b976
 Author: Daniel Palacio <danpal@gmail.com>
 Date:   Tue Jul 26 23:32:20 2011 -0500

 foo

81
2017-07-27 04:35



Je viens d'ajouter une solution ici (y a-t-il un moyen de lister tous les fichiers supprimés dans le dépôt?) pour trouver les validations de fichiers supprimés en utilisant une expression rationnelle:

git log --diff-filter=D --summary | sed -n '/^commit/h;/\/some_dir\//{G;s/\ncommit \(.*\)/ \1/gp}'

Cela retourne tout supprimé dans un répertoire nommé some_dir (cascade). Toute sed regexp là où \/some_dir\/ est va faire.

OSX (merci à @triplee et @keif)

git log --diff-filter=D --summary | sed -n -e '/^commit/h' -e '\:/:{' -e G -e 's/\ncommit \(.*\)/ \1/gp' -e }

18
2017-10-23 10:11