Cómo hacer que git log muestre nombres de archivo como svn log -v
Frecuentes
Visto 441,602 equipos
1057
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?
11 Respuestas
1642
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
141
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
54
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
48
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
45
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
15
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
7
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
4
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
4
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
0
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
0
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 svn git logging or haz tu propia pregunta.
Preguntarse por qué
git log
no solo es compatible con un-v
cambiar como muchos esperan / quieren? - MarkHu