¿Cómo obtener una lista de todos los archivos que cambiaron entre dos confirmaciones de Git?

178

Debido a la burocracia, necesito obtener una lista de todos los archivos modificados en mi repositorio para un informe (comencé con el código fuente existente).

¿Qué debo ejecutar para obtener esta lista?

Chen Kinnrot
fuente
34
"debido a la burocracia" xD
ptim

Respuestas:

238

Para los archivos modificados entre un SHA determinado y su confirmación actual:

git diff --name-only <starting SHA> HEAD

o si desea incluir archivos modificados pero aún no confirmados:

git diff --name-only <starting SHA>

De manera más general, la siguiente sintaxis siempre le indicará qué archivos cambiaron entre dos confirmaciones (especificadas por sus SHA u otros nombres):

git diff --name-only <commit1> <commit2>
Ámbar
fuente
2
y si quieres saber los archivos modificados para una confirmación en concreto hacer:git diff --name-only <SHA> <SHA>^
thebugfinder
3
Usar la --name-statusbandera en lugar de --name-onlyes útil para obtener una lista de archivos y ver su estado de modificación, como Agregado o Modificado.
Thane Plummer
@Amber debería mencionar las notas de @Thane Plummer que --name-statusmuestran lo que les sucedió
Zoltán Süle
64

Para encontrar los nombres de todos los archivos modificados desde su última confirmación:

git diff --name-only

O (para obtener un poco más de información, incluidos los archivos sin seguimiento):

git status
Tim Bellis
fuente
48
  • Para una lista de todos los unstaged archivos modificados de orugas:

    git diff --name-only
    
  • Para enumerar todos los archivos cambiados rastreados por etapas :

    git diff --name-only --staged
    
  • Para enumerar todos los archivos cambiados rastreados y no escalonados :

    { git diff --name-only ; git diff --name-only --staged ; } | sort | uniq
    
  • Para enumerar todos los archivos no rastreados (los enumerados por git status, sin incluir los archivos ignorados):

    git ls-files --other --exclude-standard
    

Si está utilizando esto en un script de shell y desea verificar mediante programación si estos comandos devuelven algo, le interesará git diffla --exit-codeopción.

Flimm
fuente
16

Cuando agregué / modifiqué / eliminé muchos archivos (desde la última confirmación), me gusta ver esas modificaciones en orden cronológico.

Para eso uso:

  • Para enumerar todos los archivos no organizados:

    git ls-files --other --modified --exclude-standard
    
  • Para obtener la última fecha de modificación para cada archivo:

    while read filename; do  echo -n "$(stat -c%y -- $filename 2> /dev/null) "; echo $filename;  done
    

Aunque ruvim sugiere en los comentarios :

xargs -0 stat -c '%y %n' -- 
  • Para ordenarlos del más antiguo al más reciente:

    sort
    

Un alias hace que sea más fácil de usar:

alias gstlast='git ls-files --other --modified --exclude-standard|while read filename; do  echo -n "$(stat -c%y -- $filename 2> /dev/null) "; echo $filename;  done|sort'

O (más corto y más eficiente, gracias a ruvim )

alias gstlast='git ls-files --other --modified --exclude-standard|xargs -0 stat -c '%y %n' --|sort'

Por ejemplo:

username@hostname:~> gstlast
2015-01-20 11:40:05.000000000 +0000 .cpl/params/libelf
2015-01-21 09:02:58.435823000 +0000 .cpl/params/glib
2015-01-21 09:07:32.744336000 +0000 .cpl/params/libsecret
2015-01-21 09:10:01.294778000 +0000 .cpl/_deps
2015-01-21 09:17:42.846372000 +0000 .cpl/params/npth
2015-01-21 12:12:19.002718000 +0000 sbin/git-rcd

Ahora puedo revisar mis modificaciones, desde la más antigua hasta la más reciente.

VonC
fuente
¿Por qué no usar una xargssola llamada stat? La git ls-files -z --other --modified --exclude-standard | xargs -0 stat -c '%y %n' -- | sort
frase
@ruvim Gracias. Muy buena sugerencia. He editado la respuesta para incluir su comentario, para mayor visibilidad.
VonC
4

Necesito una lista de archivos que hayan cambiado el contenido entre dos confirmaciones (solo agregadas o modificadas), así que usé:

git diff --name-only --diff-filter=AM <commit hash #1> <commit hash #2>

Las diferentes opciones de filtro de diferencias de la documentación de git diff :

filtro diferencial = [(A | C | D | M | R | T | U | X | B)… [*]]

Seleccione solo los archivos que se añaden (A), se copian (C), se eliminan (D), se modifican (M), se cambian de nombre (R), se les cambia su tipo (es decir, archivo normal, enlace simbólico, submódulo, ...) (T), no están fusionados (U), son desconocidos (X) o se han roto sus pares (B). Se puede usar cualquier combinación de los caracteres de filtro (incluido ninguno). Cuando se agrega * (All-or-none) a la combinación, todas las rutas se seleccionan si hay algún archivo que coincida con otros criterios en la comparación; Si no hay ningún archivo que coincida con otros criterios, no se selecciona nada.

Además, estas letras mayúsculas se pueden descartar para excluir. Por ejemplo, --diff-filter = ad excluye las rutas agregadas y eliminadas.

Si también desea enumerar el estado (p. Ej., A / M), cambie --name-onlya --name-status.

Forraje
fuente
3

La lista de modificaciones no preparadas se puede obtener usando git statusy el grepcomando como a continuación. Algo como git status -s | grep M:

root@user-ubuntu:~/project-repo-directory# git status -s | grep '^ M'
 M src/.../file1.js
 M src/.../file2.js
 M src/.../file3.js
 ....
SuperNova
fuente
Tenga en cuenta que esto solo se puede usar para cambios no organizados, por lo que no es útil para 'archivos que cambiaron entre dos confirmaciones de Git'
John Vandenberg
2

Con git showusted puede obtener un resultado similar. Para ver el commit (como se ve a la git logvista) con la lista de archivos incluidos, use:

git show --name-only [commit-id_A]^..[commit-id_B]

¿Dónde [commit-id_A]está la confirmación inicial y [commit-id_B]es la última confirmación de lo que desea mostrar?

Atención especial con ^símbolo. Si no pone eso, la información commit-id_A no se desplegará.

Kurapika
fuente
1

Si desea verificar los archivos modificados, debe ocuparse de muchas cosas pequeñas, como cuál será el mejor para usar, como si desea verificar cuáles de los archivos cambiados simplemente escriba

estado de git: mostrará los archivos con cambios

entonces, si desea saber qué cambios se deben realizar, puede verificarlos de alguna manera,

git diff: mostrará todos los cambios en todos los archivos

es bueno solo cuando se modifica un solo archivo

y si desea verificar un archivo en particular, use

git diff

Saurabh Pal
fuente