git - Encuentra commit donde se agregó el archivo

208

Digamos que tengo un archivo foo.jsque se confirmó hace algún tiempo. Me gustaría simplemente encontrar el commit donde se agregó este archivo por primera vez.

Después de leer las respuestas y mis propios retoques, esto funciona para mí.

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

Respuestas:

318

Aquí hay una manera más simple, "puro Git" de hacerlo, sin necesidad de canalización:

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

Consulta la documentación. Puede hacer lo mismo para Borrado, Modificado, etc.

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

Tengo un alias útil para esto, porque siempre lo olvido:

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

Esto lo hace tan simple como:

git whatadded -- foo.js

El debajo de un trazador de líneas buscará recursivamente a través de los subdirectorios de la $PWDde foo.jssin tener que suministrar y ruta absoluta o relativa al archivo, ni la necesidad de archivo para estar en el mismo directorio que el$PWD

git log --diff-filter=A -- **foo.js
Stelterd
fuente
27
+1! Sin embargo, mi archivo estaba en una subcarpeta, por lo que solo funcionó después de agregar un asterisco en el frentegit log --diff-filter=A -- *subfolder/foo.js
Geo
44
¿Cómo funciona esto en los archivos que se fusionan de otras sucursales, pero que no se agregaron necesariamente a la rama que el usuario realizó la fusión?
g33kz0r
El enlace del documento anterior no salta a la información de la bandera. Tal vez ha cambiado desde publicado. git-scm.com/docs/git-log#Documentation/…
webbower
1
Sí, cambiaron la estructura de anclaje en los documentos. Actualizado, gracias!
stelterd
@geo, creo que entiendo lo que dices, pero en realidad no, pero tengo un caso de uso similar, donde generalmente me mantengo dentro de la raíz del proyecto de un directorio git y emito comandos desde allí, y el uso del revestimiento proporcionado git log --diff-filter=A -- foo.jsno imprimió el commit ID / hash a STDOUT en mi terminal en lugar de tener que proporcionar la ruta relativa al archivo desde la raíz de repositorio git para obtener los resultados deseados
ipatch
17
git log --oneline -- foo.js | tail -n 1
Seth Robertson
fuente
1
Sería bueno tenerlo --follow.
Yasushi Shoji
La solución aceptada no funcionó para mí, pero esto sí. ¡Gracias!
Stevie Howard
1

Lo siguiente puede no ser de su interés, pero creo que lo ayudará en el futuro y es parte del ecosistema de depuración en Git:

Puede usar git-blamepara mostrar qué revisión y autor modificaron por última vez cada línea de un archivo, especialmente la anotación de archivo. Visite https://git-scm.com/book/en/v2/Git-Tools-Debugging-with-Git

Por ejemplo,

git blame -L 174,190  xx.py
Reidel
fuente
¿Podría explicar por favor qué hace cada uno de los operandos? Me doy cuenta de que ha proporcionado un enlace a la rtfm relevante, pero una pequeña aclaración haría de su publicación una ventanilla única.
rossmcm
Como dice el libro Pro-Git Si rastrea un error en su código y quiere saber cuándo se introdujo y por qué, la anotación de archivos suele ser su mejor herramienta. Le muestra qué confirmación fue la última en modificar cada línea de cualquier archivo, por lo que este ejemplo que mostré usa la opción -L para limitar la salida a las líneas 174 a 190 y lo último es solo el archivo de destino que desea verificar ( xx.py) en este caso un archivo de python @rossmcm
Reidel