¿Cómo puedo enumerar todas las confirmaciones que cambiaron un archivo específico?

804

¿Hay alguna manera de enumerar todas las confirmaciones que cambiaron un archivo específico?

Daniel
fuente
1
¿Está buscando cambios en un archivo en una sola rama? en todas las sucursales locales; en todas las ramas en un solo control remoto; o a través de todo? Creo que a través de todo esto requerirá un guión.
benhorgen

Respuestas:

1083

Los --followtrabajos para un archivo en particular

git log --follow -- filename

Diferencia a otras soluciones dadas

Tenga en cuenta que otras soluciones incluyen git log path(sin el --follow). Ese enfoque es útil si desea realizar un seguimiento, por ejemplo, de los cambios en un directorio , pero se tambalea cuando se cambia el nombre de los archivos (por lo tanto, use --follow filename).

jackrabb1t
fuente
32
+1 --followrepresenta los cambios de nombre, por lo que esto es más robusto quegit log -- path
Gabe Moothart
42
Tenga en cuenta que --followacepta una ruta , que puede ser un archivo pero también un directorio. En el caso de este último, se ejecutará recursivamente e informará los cambios a todos los archivos por debajo de ese punto. (Este comportamiento no está documentado en la página de manual y puede no ser permanente.)
StvnW
55
¿Cuál es la diferencia entre ese y sologit log filename?
VaTo
8
@SaulOrtega, git log filenameno sigue el cambio de nombre del archivo, es decir, mostrará todas las confirmaciones con respecto a ese nombre de archivo (no archivo real). Si crea archivos Xy Y, cambiado tanto, y luego borrado Yy renombrado Xa Yy luego también cambió, y se ejecuta git log Y, obtendrá mensajes para ambos vieja Y y la nueva uno. Y al contrario, con --followusted obtendrá confirmaciones con respecto a ese archivo cuando fue nombrado X y cuando fue nombrado Y.
MarSoft
77
use "git log --all filename" para ver todos los commits en todas las ramas
Lebnik
122

git log pathDebes hacer lo que quieras. Del git loghombre :

[--] <path>…

Show only commits that affect any of the specified paths. To prevent confusion with 
options and branch names, paths may need to be prefixed with "-- " to separate them
from options or refnames.
Gabe Moothart
fuente
11
No funciona si la ruta del archivo ha cambiado. La respuesta de Jackrabbit funciona para este caso.
kwahn
1
Esto funciona si necesita restringir el registro a una rama específica
enms.
64

He estado analizando esto de cerca y todas estas respuestas no parecen realmente mostrarme todos los compromisos en todas las ramas.

Esto es lo que se me ocurrió al jugar con las opciones de vista de edición de gitk. Esto me muestra todos los commits para un archivo, independientemente de la rama, local, reflog y remoto.

gitk --all --first-parent --remotes --reflog --author-date-order -- filename

También funciona con git log:

git log --all --first-parent --remotes --reflog --author-date-order -- filename
BigMiner
fuente
11
Esto es perfecto para cuando alguien hace cambios pero se olvidan de dónde cometieron los cambios.
earthmeLon
2
Muy útil. Incluye también confirmaciones de escondite
Juan Antonio Tubío
Esta debería ser la respuesta preferida. La pregunta era encontrar todos los commits, este lo hace.
carl verbiest
Aviso que --reflogincluye confirmaciones que fueron modificadas / modificadas o descartadas. Tal vez eso debería ser obvio, ¡pero traté de usar esto git logy estaba tratando de entender por qué estaba viendo confirmaciones aparentemente duplicadas!
Soren Bjornstad
43

Utilice el siguiente comando para obtener confirmaciones para un archivo específico:

git log -p filename
Sankar Subburaj
fuente
8
Entiendo que esto no responde exactamente la pregunta ya que quería una lista de confirmaciones, pero esto es oro y está en mi archivo.
zkent
3
Esto no funcionará en absoluto si el archivo no existe en la rama actualmente desprotegida. Puede agregar la rama como git log -p mybranch -- filenameo simplemente usar git log --all -- filenamepara buscar en todas las ramas.
Soren Bjornstad
37

Debería ser tan simple como git log <somepath>; verifique la página de manual ( git-log(1)).

Personalmente, me gusta usar git log --stat <path>para poder ver el impacto de cada confirmación en el archivo.

rfunduk
fuente
99
O incluso -psi desea ver la diferencia completa, no solo que haya modificado algunas líneas.
Cascabel
Es cierto, pero eso es bastante ruidoso considerando que la mayoría de los archivos se han cambiado muchas veces a lo largo de sus vidas. No quiero ver diferencias completas de cada confirmación que haya tocado un archivo. Por lo general, busco algo específico, para poder obtener un registro con solo impactos y luego git showen los compromisos específicos que parecen ser importantes.
rfunduk
git log --stat --follow - * .html => lista de salida de confirmaciones con exactamente un archivo en cada confirmación. ¡Muy agradable!
Sergio Belevskij
18

Alternativamente (desde Git 1.8.4), también es posible obtener todas las confirmaciones que han cambiado una parte específica de un archivo. Puede obtener esto pasando la línea de inicio y el número de línea final.

El resultado devuelto sería la lista de confirmaciones que modificaron esta parte en particular. El comando es como:

git log --pretty=short -u -L <upperLimit>,<lowerLimit>:<path_to_filename>

donde upperLimitestá el start_line_numbery lowerLimites elending_line_number

Más información: https://www.techpurohit.com/list-some-useful-git-commands

jitendrapurohit
fuente
17

Como señaló jackrabb1t, --followes más robusto ya que continúa enumerando la historia más allá de los cambios de nombre / movimientos. Por lo tanto, si está buscando un archivo que actualmente no está en la misma ruta o un archivo que ha sido renombrado a través de varias confirmaciones, --seguimiento lo rastreará.

Esta puede ser una mejor opción si desea visualizar los cambios de nombre / ruta:

git log --follow --name-status -- <path>

Pero si quieres una lista más compacta con solo lo que importa:

git log --follow --name-status --format='%H' -- <path>

o incluso

git log --follow --name-only --format='%H' -- <path>

La desventaja es que --followsolo funciona para un solo archivo.

Roberto
fuente
44
--followfunciona para una sola ruta , que podría ser un directorio. Si se pasa un directorio, se ejecutará recursivamente e informará los cambios a todos los archivos debajo de ese punto.
StvnW
10

Si está intentando: seguir un archivo eliminado en una confirmación anterior, use

git log --follow -- filename
snovelli
fuente
3
Para los gitnovatos: use git log -p --follow -- filenamepara mostrar los cambios también. También tenga en cuenta: "nombre de archivo" puede ser un archivo, un directorio o un submódulo.
Tino
8

Si desea ver todas las confirmaciones que cambiaron un archivo, en todas las ramas, use esto:

git log --follow --all <filepath>
Always_Beginner
fuente
8

Si desea buscar todas las confirmaciones por filenamey no por filepath , use:

git log --all -- '*.wmv'
Mundo maravilloso
fuente
6

Si desea ver todos los cambios realizados en las confirmaciones que cambiaron un archivo en particular (en lugar de solo los cambios en el archivo en sí), puede pasar --full-diff:

git log -p --full-diff [branch] -- <path>
Cúbico
fuente
o sin el[branch]
Anentropic
1
@Anentropic Se suponía que los corchetes indicaban que el argumento es opcional.
Cubic
Es todo lo que necesito, muestra un cambio completo, incluye algunos cambios de la fusión.
ThanhLD
5

Se usa git log --all <filename>para ver los commits que influyen <filename>en todas las ramas.

Lebnik
fuente
4
gitk <path_to_filename>

Asumiendo que el paquete "gitk" ya está instalado.

Si no está instalado, haga esto:

sudo apt-get install gitk

Y luego intente el comando anterior. Es para Linux ... Podría ayudar a los usuarios de Linux si quieren una GUI.

Breen ho
fuente
Para los usuarios de Windows, tenga en cuenta que gitkse incluye con Git para Windows.
Soren Bjornstad
2

Para obtener una lista de los hashes de confirmación, use git rev-list

 git rev-list HEAD <filename>

Salida:

b7c4f0d7ebc3e4c61155c76b5ebc940e697600b1
e3920ac6c08a4502d1c27cea157750bd978b6443
ea62422870ea51ef21d1629420c6441927b0d3ea
4b1eb462b74c309053909ab83451e42a7239c0db
4df2b0b581e55f3d41381f035c0c2c9bd31ee98d

lo que significa que 5 commits han tocado este archivo. Es el orden cronológico inverso, por lo que la primera confirmación de la lista b7c4f0d7es la más reciente.

Boris
fuente
1

En Linux puedes usar gitk para esto.

Se puede instalar usando "sudo apt-get install git-gui gitk". Se puede usar para ver confirmaciones de un archivo específico por "gitk <nombre de archivo>".

Chamila Wijayarathna
fuente
1
# Shows commit history with patch
git log -p -<no_of_commits> --follow <file_name>

# Shows brief details like "1 file changed, 6 insertions(+), 1 deletion(-)"
git log --stat --follow <file_name>

Referencia

AnshBikram
fuente