Cómo hacer que git log muestre nombres de archivo como svn log -v


987

El registro de SVN tiene un modo "-v" que genera nombres de archivos modificados en cada confirmación, de esta manera:

jes5199 $ svn log -v
-------------------------------------------------- ----------------------
r1 | jes5199 | 2007-01-03 14:39:41 -0800 (mié, 03 de enero de 2007) | 1 linea
Caminos cambiados:
   A / AUTORES
   A / COPIA
   A / ChangeLog
   A / EVOLUCIÓN
   A / INSTALAR
   A / MacOSX

¿Hay una manera rápida de obtener una lista de archivos modificados en cada commit en git?


15
¿Me pregunto por qué git logno solo admite un -vinterruptor como muchos esperan / quieren? </gripe>
MarkHu

Respuestas:


1528

Para nombres de ruta completos de archivos modificados:

git log --name-only

Para nombres completos de ruta y estado de archivos modificados:

git log --name-status

Para nombres de ruta abreviados y un diffstat de archivos modificados:

git log --stat

Hay muchas más opciones, mira los documentos .


17
Yo uso git log --numstat. Ver git help logpara más opciones.
ma11hew28

29
git log --name-only --onelinetambién es bastante elegante: una línea de color para la confirmación y un archivo por línea. stackoverflow.com/a/14227496/1995714
cp.engr el

44
Con git 2.7.3, tuve que usarlo git log --name-status --find-renamespara mostrar archivos renombrados en lugar de adición + eliminación.
Suzanne Dupéron

1
Tenga en cuenta que --statabrevia caminos largos; El ancho es configurable, pero los histogramas envueltos son más difíciles de leer. Otros formatos como --numstatsiempre imprimen rutas completas.
Beni Cherniavsky-Paskin

@ ma11hew28 Gracias. --numstatestá en la línea 946 de esa página de manual a partir de git 2.22.00. Esas son muchas más opciones de las que la mayoría de la gente necesita.
Restablece a Monica - M. Schröder

139

NOTA: está en desuso, use en su lugar git whatchangedgit log

Se alienta a los nuevos usuarios a usar git-log [1] en su lugar. El whatchangedcomando es esencialmente el mismo que git-log [1], pero por defecto muestra el formato de salida de diferencias sin formato y omite las fusiones.

El comando se mantiene principalmente por razones históricas; Los dedos de muchas personas que aprendieron Git mucho antes de que git logse inventaran leyendo la lista de correo del kernel de Linux están entrenados para escribirlo.


Puedes usar el comando git whatchanged --stat para obtener una lista de archivos que cambiaron en cada confirmación (junto con el mensaje de confirmación).

Referencias


50

git show También es un gran comando.

Es algo así como svn diff, pero puedes pasarle un guid de compromiso y ver esa diferencia.


46

Si desea obtener los nombres de archivo solo sin el resto del mensaje de confirmación, puede usar:

git log --name-only --pretty=format: <branch name>

Esto se puede extender para usar las diversas opciones que contienen el nombre del archivo:

git log --name-status --pretty=format: <branch name>

git log --stat --pretty=format: <branch name>

Una cosa a tener en cuenta al usar este método es que hay algunas líneas en blanco en la salida que deberán ignorarse. Usar esto puede ser útil si desea ver los archivos que se han cambiado en una sucursal local, pero aún no se ha enviado a una sucursal remota y no hay ninguna garantía de que lo último del remoto ya se haya incorporado. Por ejemplo :

git log --name-only --pretty=format: my_local_branch --not origin/master

Mostraría todos los archivos que se han cambiado en la rama local, pero que aún no se han fusionado con la rama maestra en el control remoto.


1
Nota sobre el espacio en blanco en los ejemplos anteriores: es como git log --stat --pretty="format:" $branchName,. Entonces, por ejemplo git log --stat --pretty="format:" $(git rev-parse --abbrev-ref HEAD),. Mientras lo hago, aquí está el encantamiento exacto que terminó siendo relevante para mi propósito:git log --name-only --pretty="format: " master..$(git rev-parse --abbrev-ref HEAD)
driftcatcher

41

Lo uso a diario para mostrar el historial con archivos que cambiaron:

git log --stat --pretty=short --graph

Para que sea breve, agregue un alias en su .gitconfighaciendo:

git config --global alias.ls 'log --stat --pretty=short --graph'

El mío está muy cerca de eso, git log --pretty = oneline --graph --name-status. Me parece más conciso, solo muestra la lista de los archivos que cambiaron.
Peter Suwara

15

Yo uso esto:

git log --name-status <branch>..<branch> | grep -E '^[A-Z]\b' | sort | uniq

que genera solo una lista de archivos y su estado (agregado, modificado, eliminado):

A   sites/api/branding/__init__.py
M   sites/api/branding/wtv/mod.py
...

7

git diff --stat HEAD^!muestra los archivos modificados y los recuentos de líneas agregados / eliminados para el último commit ( HEAD).

Me parece que no hay un solo comando para obtener resultados concisos que consisten solo en nombres de archivos y recuentos de líneas agregados y eliminados para varias confirmaciones a la vez, por lo que creé mi propio script bash para eso:

#!/bin/bash
for ((i=0; i<=$1; i++))
do
    sha1=`git log -1 --skip=$i --pretty=format:%H`
    echo "HEAD~$i $sha1"
    git diff --stat HEAD~$(($i+1)) HEAD~$i 
done

Para ser llamado, por ejemplo. ./changed_files 99para obtener los cambios de forma concisa de HEADa HEAD~99. Se puede canalizar, por ejemplo. a less.


¿No puedes hacer git diff --stat HEAD..masterpara mostrar la diferencia entre HEAD y master, o no existía esto cuando publicaste tu respuesta en 2012?
Ferrybig

1
La pregunta de @Ferrybig OP es sobre cómo "obtener una lista de archivos modificados en cada confirmación" , no sobre la diferencia entre HEADy master. Esas son dos cosas diferentes.
nrz

4

Creo que la siguiente es la pantalla ideal para enumerar qué archivos cambiaron por confirmación en un formato conciso:

git log --pretty=oneline --graph --name-status

3

Un resumen de respuestas con salida de ejemplo

Esto está utilizando un repositorio local con cinco confirmaciones simples.

‣ git log --name-only
commit ed080bc88b7bf0c5125e093a26549f3755f7ae74 (HEAD -> master)
Author: My Name <user@email.com>
Date:   Mon Oct 21 15:46:04 2019 -0700

    mv file4 to file5

file5

commit 5c4e8cfbe3554fe3d7d99b5ae4ba381fa1cdb328
Author: My Name <user@email.com>
Date:   Mon Oct 21 15:36:32 2019 -0700

    foo file1

    really important to foo before the bar

file1

commit 1b6413400b5a6a96d062a7c13109e6325e081c85
Author: My Name <user@email.com>
Date:   Mon Oct 21 15:34:37 2019 -0700

    foobar file2, rm file3

file2
file3

commit e0dd02ce23977c782987a206236da5ab784543cc
Author: My Name <user@email.com>
Date:   Mon Oct 21 15:33:05 2019 -0700

    Add file4

file4

commit b58e85692f711d402bae4ca606d3d2262bb76cf1
Author: My Name <user@email.com>
Date:   Mon Oct 21 15:32:41 2019 -0700

    Added files

file1
file2
file3


‣ git log --name-status
commit ed080bc88b7bf0c5125e093a26549f3755f7ae74 (HEAD -> master)
Author: My Name <user@email.com>
Date:   Mon Oct 21 15:46:04 2019 -0700

    mv file4 to file5

R100    file4   file5

commit 5c4e8cfbe3554fe3d7d99b5ae4ba381fa1cdb328
Author: My Name <user@email.com>
Date:   Mon Oct 21 15:36:32 2019 -0700

    foo file1

    really important to foo before the bar

M       file1

commit 1b6413400b5a6a96d062a7c13109e6325e081c85
Author: My Name <user@email.com>
Date:   Mon Oct 21 15:34:37 2019 -0700

    foobar file2, rm file3

M       file2
D       file3

commit e0dd02ce23977c782987a206236da5ab784543cc
Author: My Name <user@email.com>
Date:   Mon Oct 21 15:33:05 2019 -0700

    Add file4

A       file4

commit b58e85692f711d402bae4ca606d3d2262bb76cf1
Author: My Name <user@email.com>
Date:   Mon Oct 21 15:32:41 2019 -0700

    Added files

A       file1
A       file2
A       file3


‣ git log --stat
commit ed080bc88b7bf0c5125e093a26549f3755f7ae74 (HEAD -> master)
Author: My Name <user@email.com>
Date:   Mon Oct 21 15:46:04 2019 -0700

    mv file4 to file5

 file4 => file5 | 0
 1 file changed, 0 insertions(+), 0 deletions(-)

commit 5c4e8cfbe3554fe3d7d99b5ae4ba381fa1cdb328
Author: My Name <user@email.com>
Date:   Mon Oct 21 15:36:32 2019 -0700

    foo file1

    really important to foo before the bar

 file1 | 3 +++
 1 file changed, 3 insertions(+)

commit 1b6413400b5a6a96d062a7c13109e6325e081c85
Author: My Name <user@email.com>
Date:   Mon Oct 21 15:34:37 2019 -0700

    foobar file2, rm file3

 file2 | 1 +
 file3 | 0
 2 files changed, 1 insertion(+)

commit e0dd02ce23977c782987a206236da5ab784543cc
Author: My Name <user@email.com>
Date:   Mon Oct 21 15:33:05 2019 -0700

    Add file4

 file4 | 0
 1 file changed, 0 insertions(+), 0 deletions(-)

commit b58e85692f711d402bae4ca606d3d2262bb76cf1
Author: My Name <user@email.com>
Date:   Mon Oct 21 15:32:41 2019 -0700

    Added files

 file1 | 0
 file2 | 0
 file3 | 0
 3 files changed, 0 insertions(+), 0 deletions(-)


‣ git log --name-only --oneline
ed080bc (HEAD -> master) mv file4 to file5
file5
5c4e8cf foo file1
file1
1b64134 foobar file2, rm file3
file2
file3
e0dd02c Add file4
file4
b58e856 Added files
file1
file2
file3


‣ git log --pretty=oneline --graph --name-status
* ed080bc88b7bf0c5125e093a26549f3755f7ae74 (HEAD -> master) mv file4 to file5
| R100  file4   file5
* 5c4e8cfbe3554fe3d7d99b5ae4ba381fa1cdb328 foo file1
| M     file1
* 1b6413400b5a6a96d062a7c13109e6325e081c85 foobar file2, rm file3
| M     file2
| D     file3
* e0dd02ce23977c782987a206236da5ab784543cc Add file4
| A     file4
* b58e85692f711d402bae4ca606d3d2262bb76cf1 Added files
  A     file1
  A     file2
  A     file3


‣ git diff-tree HEAD
ed080bc88b7bf0c5125e093a26549f3755f7ae74
:100644 000000 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 0000000000000000000000000000000000000000 D  file4
:000000 100644 0000000000000000000000000000000000000000 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 A  file5


‣ git log --stat --pretty=short --graph
* commit ed080bc88b7bf0c5125e093a26549f3755f7ae74 (HEAD -> master)
| Author: My Name <user@email.com>
| 
|     mv file4 to file5
| 
|  file4 => file5 | 0
|  1 file changed, 0 insertions(+), 0 deletions(-)
| 
* commit 5c4e8cfbe3554fe3d7d99b5ae4ba381fa1cdb328
| Author: My Name <user@email.com>
| 
|     foo file1
| 
|  file1 | 3 +++
|  1 file changed, 3 insertions(+)
| 
* commit 1b6413400b5a6a96d062a7c13109e6325e081c85
| Author: My Name <user@email.com>
| 
|     foobar file2, rm file3
| 
|  file2 | 1 +
|  file3 | 0
|  2 files changed, 1 insertion(+)
| 
* commit e0dd02ce23977c782987a206236da5ab784543cc
| Author: My Name <user@email.com>
| 
|     Add file4
| 
|  file4 | 0
|  1 file changed, 0 insertions(+), 0 deletions(-)
| 
* commit b58e85692f711d402bae4ca606d3d2262bb76cf1
  Author: My Name <user@email.com>

      Added files

   file1 | 0
   file2 | 0
   file3 | 0
   3 files changed, 0 insertions(+), 0 deletions(-)


‣ git log --name-only --pretty=format:
file5

file1

file2
file3

file4

file1
file2
file3


‣ git log --name-status --pretty=format:
R100    file4   file5

M       file1

M       file2
D       file3

A       file4

A       file1
A       file2
A       file3


‣ git diff --stat 'HEAD^!'
 file4 => file5 | 0
 1 file changed, 0 insertions(+), 0 deletions(-)


‣ git show
commit ed080bc88b7bf0c5125e093a26549f3755f7ae74 (HEAD -> master)
Author: My Name <user@email.com>
Date:   Mon Oct 21 15:46:04 2019 -0700

    mv file4 to file5

diff --git a/file4 b/file5
similarity index 100%
rename from file4
rename to file5


Créditos a @ CB-Bailey @ Peter-Suwara @Gaurav @ Omer-Dagan @xsor @Hazok @nrz @ptc


0

Otro comando útil sería git diff-tree <hash>donde el hash puede ser también un rango de hash (denotado por <old>..<new>notación). Un ejemplo de salida:

$ git diff-tree  HEAD
:040000 040000 8e09a be406 M myfile

Los campos son:

modo fuente, modo dest, hash fuente, hash dest, estado, nombre de archivo

Los estados son los que esperaría: D (eliminado), A (agregado), M (modificado), etc. Consulte la página del manual para obtener una descripción completa.


0

Generalmente uso estos para obtener los registros:

$ git log --name-status --author='<Name of author>' --grep="<text from Commit message>"

$ git log --name-status --grep="<text from Commit message>"

1
No conocía estas opciones, pero esta publicación sería más útil si explicara que filtra el registro. Por un momento, pensé que era una forma de cambiar la forma en que los autores aparecen en la lista de resultados.
Stein
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.