git - Rechercher un commit où le fichier a été ajouté

208

Disons que j'ai un fichier foo.jsqui a été validé 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 ma propre bricolage, cela fonctionne pour moi

git log --follow --diff-filter=A --find-renames=40% foo.js
Steven Penny
la source

Réponses:

318

Voici une manière plus simple et "pure Git" de le faire, sans aucun pipeline nécessaire:

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

Consultez 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'

Cela rend aussi simple que:

git whatadded -- foo.js

La ligne ci-dessous recherche récursivement dans les sous-répertoires de $PWDfor foo.jssans avoir à fournir de chemin absolu ou relatif vers le fichier, et le fichier n'a pas besoin d'être dans le même répertoire que le$PWD

git log --diff-filter=A -- **foo.js
stelterd
la source
27
+1! Cependant, mon fichier était dans un sous-dossier, donc n'a fonctionné qu'après avoir ajouté un astérisque à l'avantgit log --diff-filter=A -- *subfolder/foo.js
Geo
4
Comment cela fonctionne-t-il sur les fichiers qui sont fusionnés à partir d'autres branches, mais qui n'ont pas nécessairement été ajoutés à la branche fusionnée par l'utilisateur effectuant la fusion?
g33kz0r
Le lien doc ci-dessus ne permet pas d'accéder aux informations sur le drapeau. Peut-être que cela a changé depuis sa publication. git-scm.com/docs/git-log#Documentation/…
webbower
1
Oui, ils ont changé la structure d'ancrage dans les documents. Mis à jour, merci!
stelterd
@geo je pense que je comprends ce que vous dites mais pas vraiment, mais j'ai un cas d'utilisation similaire, où je reste généralement dans la racine du projet d'un répertoire git et émets des commandes à partir de là, et l'utilisation de la doublure fournie git log --diff-filter=A -- foo.jsn'a pas imprimé le commit ID / hash to STDOUT dans mon terminal, je devais plutôt fournir le chemin relatif vers le fichier à partir de la racine git repo afin d'obtenir les résultats souhaités
ipatch
17
git log --oneline -- foo.js | tail -n 1
Seth Robertson
la source
1
Je serais bien d'avoir --follow.
Yasushi Shoji
La solution acceptée n'a pas fonctionné pour moi, mais cela a fonctionné. Merci!
Stevie Howard
1

Les éléments suivants peuvent ne pas vous intéresser, mais je pense que cela vous aidera à l'avenir et fait partie du débogage de l'écosystème dans Git:

Vous pouvez utiliser git-blamepour montrer quelle révision et quel auteur ont modifié en dernier chaque ligne d'un fichier, en particulier l'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
Reidel
la source
Pourriez-vous expliquer ce que font chacun des opérandes? Je me rends compte que vous avez fourni un lien vers le rtfm concerné, mais un peu d'élucidation ferait de votre message un guichet unique.
rossmcm
Comme le dit le livre Pro-Git Si vous traquez un bogue dans votre code et que vous voulez savoir quand il a été introduit et pourquoi, l'annotation des fichiers est souvent votre meilleur outil. Il vous montre quel commit a été le dernier à modifier chaque ligne d'un fichier, donc cet exemple que j'ai montré utilise l'option -L pour limiter la sortie aux lignes 174 à 190 et la dernière chose est juste le fichier cible que vous souhaitez vérifier ( xx.py) dans ce cas un fichier python @rossmcm
Reidel