299 votes

git - Trouver le commit où le fichier a été ajouté

Disons que j'ai un fichier foo.js qui a été commis il y a quelque temps. Je voudrais simplement trouver le commit où ce fichier a été ajouté pour la première fois.

Après avoir lu les réponses et bricolé moi-même, ceci fonctionne pour moi.

git log --follow --diff-filter=A --find-renames=40% foo.js

1 votes

C'est mieux que toutes les réponses, car il trace les fichiers renommés.

0 votes

Je pense qu'il y a des cas limites où cela peut retourner plus d'un résultat, par exemple lorsqu'un fichier est ajouté puis supprimé et ajouté à nouveau dans un autre commit (c'est-à-dire pas un renommage). La réponse de Seth Robinson semble gérer ces cas.

1 votes

Par curiosité, comment avez-vous choisi les 40 % pour --find-renames ? Il semble que cela fonctionne très bien pour moi et j'en ai récupéré quelques-uns. --follow ne l'a pas fait, juste par curiosité...

439voto

stelterd Points 496

Voici une façon plus simple, "purement Git", de le faire, sans avoir besoin de pipeline :

git log --diff-filter=A -- foo.js

Vérifiez la documentation. Vous pouvez faire la même chose pour Supprimé, Modifié, etc.

https://git-scm.com/docs/git-log#Documentation/git-log.txt---diff-filterACDMRTUXB82308203

J'ai un alias pratique pour cela, car je l'oublie toujours :

git config --global alias.whatadded 'log --diff-filter=A'

C'est aussi simple que cela :

git whatadded -- foo.js

L'exemple ci-dessous permet d'effectuer une recherche récursive dans les sous-répertoires du fichier $PWD para foo.js sans qu'il soit nécessaire de fournir un chemin d'accès absolu ou relatif au fichier, ni que le fichier se trouve dans le même répertoire que l'élément de commande. $PWD

git log --diff-filter=A -- **foo.js

32 votes

+1 ! Cependant, mon fichier était dans un sous-dossier, et n'a donc fonctionné qu'après avoir ajouté un astérisque devant git log --diff-filter=A -- *subfolder/foo.js

4 votes

Comment cela fonctionne-t-il pour les fichiers qui sont fusionnés à partir d'autres branches, mais qui n'ont pas nécessairement été ajoutés à la branche en cours de fusion par l'utilisateur effectuant la fusion ?

0 votes

Le lien ci-dessus ne permet pas d'accéder aux informations sur le drapeau. Peut-être que cela a changé depuis la publication. git-scm.com/docs/git-log#Documentation/

28voto

Seth Robertson Points 13276
git log --follow --find-renames=40% --oneline -- foo.js | tail -n 1

2 votes

Ce serait bien d'avoir --follow .

2 votes

La solution acceptée n'a pas fonctionné pour moi, mais celle-ci a fonctionné. Merci !

0 votes

J'ai modifié la réponse pour inclure les deux --follow y --find-renames=40% afin qu'il suive les renommages de fichiers et trouve l'auteur original - j'espère que c'est OK ?

6voto

Reidel Points 117

Ce qui suit ne vous intéresse peut-être pas, mais je pense que cela vous aidera à l'avenir et fait partie de l'écosystème de débogage de Git :

Vous pouvez utiliser git-blame pour montrer quelle révision et quel auteur a modifié en dernier lieu chaque ligne d'un fichier, en particulier une annotation de fichier. Visitez https://git-scm.com/book/en/v2/Git-Tools-Debugging-with-Git

Par exemple,

git blame -L 174,190  xx.py

L'option -L permet de restreindre la sortie de l'annotation aux lignes 174 à 190, vous verrez donc les auteurs et le hash de commit, etc. de la ligne 174 à 190 pour le fichier xx.py.

1voto

Martin Points 481

S'il est possible de le faire de manière non-programmée, c'est très rapide. Ouvrez l'interface graphique de gitk.

gitk file

Ensuite, il suffit de faire défiler jusqu'au premier commit

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X