¿Cómo enumerar solo los nombres de archivo que cambiaron entre dos confirmaciones?

1954

Tengo un montón de confirmaciones en el repositorio. Quiero ver una lista de archivos cambiados entre dos confirmaciones: de SHA1 a SHA2.

¿Qué comando debo usar?

Shawn
fuente
3
Para un commit y su padre: stackoverflow.com/questions/424071/…
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

Respuestas:

2666
git diff --name-only SHA1 SHA2

donde solo necesita incluir suficiente SHA para identificar los commits. También puedes hacer, por ejemplo

git diff --name-only HEAD~10 HEAD~5

para ver las diferencias entre el décimo último commit y el quinto último (más o menos).

Peter
fuente
152
Esto también funciona para git show. git show --name-only SHA1.
August Lilleaas el
78
git diff --name-status [TAG|SHA1]muestra qué operaciones se realizaron también en los archivos
reconbot
2
también puede hacer: git diff --name-only HEAD @ {3} HEAD @ {0} para las confirmaciones exactas que desea comparar.
b01
77
@AugustLilleaas en realidad usando show solo mostrará los 2 commits específicos, si tienes commits entre esos 2 se quedarán fuera
chrisan
44
Como se indica a continuación, git diff --name-statusno parece querer mostrar archivos agregados. @sschuberth señaló git show, que parece que no funciona correctamente para mí: git show --pretty=format: --name-status. Sólo haciendo git show --name-statusda un poco más de información, pero todavía agradable y denso ... que será mi nuevo comando Goto;)
travc
417
git diff --name-status [SHA1 [SHA2]]

es como --name-only, excepto que obtienes un prefijo simple que te dice qué pasó con el archivo (modificado, eliminado, agregado ...)

git log --name-status --oneline [SHA1..SHA2]

es similar, pero las confirmaciones se enumeran después del mensaje de confirmación, por lo que puede ver cuándo se modificó un archivo.

  • si está interesado en lo que sucedió con ciertos archivos / carpetas, puede agregarlo -- <filename> [<filename>...]a la git logversión.

  • si quieres ver lo que sucedió para un solo commit, llámalo SHA1, luego haz
    git log --name-status --oneline [SHA1^..SHA1]

Indicadores de estado del archivo:
M modificado - El archivo ha sido modificado
C copiar-editar - El archivo ha sido copiado y modificado
R renombrar-editar - El archivo ha sido renombrado y modificado
A agregado - El archivo ha sido agregado
D eliminado - El archivo ha sido eliminado
U sin fusionar - El archivo tiene conflictos después de una fusión

artfulrobot
fuente
Resulta que digo git diff --name-status y dio el 'archivo agregado'.
aartista
1
Para git log, debe tener dos puntos entre los SHA, como SHA1..SHA2, y el segundo SHA no es opcional, por lo que debería verse así: git log --name-status --oneline [SHA1 .. SHA2]
twasbrillig
¿Hay alguna manera de excluir ciertos archivos / ciertos tipos de archivos?
agosto
3
La --relative[=<path>]opción puede ayudarte, no estoy seguro. De lo contrario siempre hay | erep -v '(.tmp|.foo|.dontwant)$'...
artfulrobot
80

Parece que nadie ha mencionado el cambio --stat:

$ git diff --stat HEAD~5 HEAD
 .../java/org/apache/calcite/rex/RexSimplify.java   | 50 +++++++++++++++++-----
 .../apache/calcite/sql/fun/SqlTrimFunction.java    |  2 +-
 .../apache/calcite/sql2rel/SqlToRelConverter.java  | 16 +++++++
 .../org/apache/calcite/util/SaffronProperties.java | 19 ++++----
 .../org/apache/calcite/test/RexProgramTest.java    | 24 +++++++++++
 .../apache/calcite/test/SqlToRelConverterTest.java |  8 ++++
 .../apache/calcite/test/SqlToRelConverterTest.xml  | 15 +++++++
 pom.xml                                            |  2 +-
 .../apache/calcite/adapter/spark/SparkRules.java   |  7 +--
 9 files changed, 117 insertions(+), 26 deletions(-)

También hay --numstat

$ git diff --numstat HEAD~5 HEAD
40      10      core/src/main/java/org/apache/calcite/rex/RexSimplify.java
1       1       core/src/main/java/org/apache/calcite/sql/fun/SqlTrimFunction.java
16      0       core/src/main/java/org/apache/calcite/sql2rel/SqlToRelConverter.java
8       11      core/src/main/java/org/apache/calcite/util/SaffronProperties.java
24      0       core/src/test/java/org/apache/calcite/test/RexProgramTest.java
8       0       core/src/test/java/org/apache/calcite/test/SqlToRelConverterTest.java
15      0       core/src/test/resources/org/apache/calcite/test/SqlToRelConverterTest.xml
1       1       pom.xml
4       3       spark/src/main/java/org/apache/calcite/adapter/spark/SparkRules.java

y --shortstat

$ git diff --shortstat HEAD~5 HEAD
9 files changed, 117 insertions(+), 26 deletions(-)
leeyuiwah
fuente
44
La respuesta aceptada es correcta, pero esto es muy útil y le brinda un poco de información adicional. ¡Gracias!
kontur
2
Convino en que esta es una respuesta más útil ya que contiene las estadísticas de diferencias.
internetross
52

Pero para ver los archivos cambiados entre su rama y su ancestro común con otra rama (por ejemplo, origen / maestro):

git diff --name-only `git merge-base origin/master HEAD`
Tim James
fuente
1
¡Esto fue realmente útil! Ojalá pudiera decir simplemente git diffstatus mastero similar, que desencadena lo anterior.
oma
3
O git show --pretty=format: --name-only origin/master...
sschuberth
Es posible que no pueda convertirlo en un alias git, pero definitivamente puede ponerlo en su .bashrc.
Fred
3
O incluso más simple: git diff --name-only HEAD...master(tenga en cuenta los tres puntos). Para una explicación detallada, ver aquí .
ostrokach
1
Parece la respuesta correcta en su mayoría! Simple git diff --name-only master..branchno corresponde a la lista de PR de github. De esta manera más precisa. Pero de todos modos tengo 173 archivos chaneados frente a 171 en github PR. (sin merge-baseque tenga 228 vs 171)
x'ES
21

Para complementar la respuesta de @ artfulrobot, si desea mostrar los archivos modificados entre dos ramas:

git diff --name-status mybranch..myotherbranch

Ten cuidado con la precedencia. Si coloca primero la rama más nueva, mostrará los archivos como eliminados en lugar de agregados.

Agregar una greplata puede refinar aún más las cosas:

git diff --name-status mybranch..myotherbranch | grep "A\t"

Eso mostrará solo los archivos agregados myotherbranch.

Max MacLeod
fuente
44
Las expresiones regulares son agradables y pueden hacer casi cualquier cosa. Sin embargo, en este caso, también existe el --diff-filterque proporciona esta funcionalidad de forma nativa, lo que significa menos posibilidades de resultados incorrectos (por ejemplo, falsos positivos)
Jasper
8

Agregue el alias de abajo a su ~/.bash_profile, luego ejecute source ~/.bash_profile; ahora cada vez que necesite ver los archivos actualizados en la última confirmación, ejecución, showfilesdesde su repositorio git.

alias showfiles='git show --pretty="format:" --name-only'
Zorayr
fuente
2
O git config --global alias.showfiles 'show --pretty="format:" --name-only'para hacer git showfiles.
cgmb
7

Esto mostrará los cambios en los archivos:

git diff --word-diff SHA1 SHA2
Julio Marins
fuente
5

También tenga en cuenta que si solo desea ver los archivos modificados entre la última confirmación y la anterior. Esto funciona bien:git show --name-only

Parris
fuente
3

Use git log --pretty = oneline> C: \ filename.log

que registrará solo un en línea (--pretty = en línea) que es el nombre del archivo modificado. También registrará todos los detalles en su archivo de salida.

Agni
fuente
git log --pretty=onelinesolo me da el SHA y el mensaje de confirmación usando git 2.10.1
maldito
3

Como artfulrobot dijo en su respuesta:

git diff --name-status [SHA1 [SHA2]]

Mi ejemplo:

git diff --name-status 78a09k12067c24d8f117886c4723ccf111af4997 
4b95d595812211553070046bf2ebd807c0862cca
M       views/layouts/default.ctp
M       webroot/css/theme.css
A       webroot/img/theme/logo.png
Jaime Montoya
fuente
3

Solo para alguien que necesita enfocarse solo en archivos Java, esta es mi solución:

 git diff --name-status SHA1 SHA2 | grep '\.java$'
K. símbolo
fuente
1

Lo siguiente funciona bien para mí:

$ git show --name-only --format=tformat: SHA1..SHA2

También se puede usar con una sola confirmación:

git show --name-only --format=tformat: SHA1

lo cual es útil para usar en Jenkins, donde se le proporciona una Lista de changeSet SHA's y desea iterar sobre ellos para ver qué archivos se han cambiado.

Esto es similar a algunas de las respuestas anteriores, pero usar en tformat:lugar de format:eliminar el espacio separador entre confirmaciones.

blindsnowmobile
fuente
0

Basado en git diff --name-statusescribí la extensión git-diffview git que representa una vista de árbol jerárquica de lo que cambió entre dos caminos.

Bernard Opic
fuente