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

El registro de SVN tiene un modo "-v" que genera nombres de archivo de archivos cambiados en cada confirmación, así:

jes5199 $ svn log -v -------------------------------------------- ---------------------------- r1 | jes5199 | 2007-01-03 14:39:41 -0800 (miércoles, 03 de enero de 2007) | 1 línea Rutas cambiadas: A / AUTHORS A / COPYING A / ChangeLog A / EVOLUTION A / INSTALL A / MacOSX

¿Existe una forma rápida de obtener una lista de archivos modificados en cada confirmación en git?

preguntado el 04 de agosto de 09 a las 18:08

Preguntarse por qué git log no solo es compatible con un -v cambiar como muchos esperan / quieren? -

11 Respuestas

Para conocer los nombres de ruta completos de los archivos modificados:

git log --name-only

Para conocer los nombres de ruta completos y el estado de los archivos modificados:

git log --name-status

Para nombres de ruta abreviados y un estado de diferencias de archivos modificados:

git log --stat

Hay muchas más opciones echa un vistazo a los documentos.

contestado el 04 de mayo de 17 a las 09:05

yo suelo git log --numstat. Vea git help log para más opciones. - ma11hew28

git log --name-only --oneline tambié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

Con git 2.7.3, tuve que usar git log --name-status --find-renames para que muestre archivos renombrados en lugar de adición + eliminación. - Suzanne Dupéron

Tenga en cuenta que --stat abrevia caminos largos; el ancho es configurable pero los histogramas ajustados son más difíciles de leer. Otros formatos como --numstat imprima siempre rutas completas. - Beni Cherniavsky-Paskin

@ ma11hew28 Gracias. --numstat está en la línea 946 de esa página de manual a partir de git 2.22.00. Eso es un montón más opciones de las que la mayoría de la gente necesita. - Martín Schröder

NOTA: git whatchanged está en desuso, use git log

Se anima a los nuevos usuarios a utilizar git-log [1] en lugar. los whatchanged comando es esencialmente el mismo que git-log [1] pero por defecto muestra el formato de salida sin formato diff y omite las fusiones.

El comando se mantiene principalmente por razones históricas; dedos de muchas personas que aprendieron Git mucho antes git log fue inventado leyendo la lista de correo del kernel de Linux está capacitado 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

Respondido el 11 de Septiembre de 16 a las 22:09

git show también es un gran comando.

Es como svn diff, pero puede pasarle un guid de confirmación y ver que diff.

respondido 22 mar '11, 00:03

No es el GUID de la confirmación, pero su hash SHA1. - trama cerebral

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

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

Esto luego 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 que aún no se han enviado a una sucursal remota y no hay garantía de que ya se haya extraído lo último del control remoto. 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 la remota.

Respondido 11 Jul 13, 03:07

Tenga en cuenta los espacios en blanco en los ejemplos anteriores: es como, git log --stat --pretty="format:" $branchName. Así por ejemplo, git log --stat --pretty="format:" $(git rev-parse --abbrev-ref HEAD). Mientras estoy en eso, 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) - atrapasueños

Utilizo esto 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 .gitconfig haciendo:

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

Respondido 06 ago 15, 20:08

El mío está muy cerca de eso, git log --pretty = oneline --graph --name-status. Lo encuentro más conciso, solo mostrando la lista de los archivos que cambiaron. - Pedro Suwara

Yo uso esto:

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

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

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

Respondido el 30 de Septiembre de 14 a las 14:09

git diff --stat HEAD^! muestra archivos modificados y recuentos de líneas agregadas / eliminadas para la última confirmación (HEAD).

Me parece que no hay un comando único para obtener una salida concisa que consista solo en nombres de archivo y recuentos de líneas agregadas y eliminadas para varias confirmaciones a la vez, así 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

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

respondido 25 nov., 12:01

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

La pregunta de @Ferrybig OP es sobre cómo "para obtener una lista de archivos modificados en cada confirmación", no sobre el diff entre HEAD y master. Esas son dos cosas diferentes. - nrz

Encuentro 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

Respondido el 05 de junio de 19 a las 18:06

Un resumen de respuestas con salida de ejemplo

Esto está usando 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

Respondido 21 Oct 19, 23:10

Otro comando útil sería git diff-tree <hash> donde hash también puede ser 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 de origen, modo de destino, hash de origen, hash de destino, estado, nombre de archivo

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

respondido 24 mar '19, 14:03

Generalmente los uso 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>"

contestado el 07 de mayo de 19 a las 17:05

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 se enumeran en la salida. - Stein

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.