2010-06-29 19 views

Respuesta

41

Esto es lo mejor que podía llegar a:

git log --name-only --pretty=oneline --full-index HEAD^^..HEAD | grep -vE '^[0-9a-f]{40} ' | sort | uniq 

Cambie el cabezal ^^ y la cabeza con las confirmaciones que desea comparar.

Mi intento utiliza git log con --name-only para enumerar todos los archivos de cada confirmación entre los especificados. --pretty=oneline hace que la parte sobre la lista de archivos consista solo en el SHA de confirmación y el título del mensaje. --full-index hace que el SHA tenga 40 caracteres completos. grep filtra todo lo que parezca un SHA seguido de un espacio. A menos que tenga archivos que comiencen con un SHA seguido de un espacio, el resultado debe ser exacto.

+0

Cuando ejecuto ese comando contra la cabeza^y la cabeza, tengo una lista de lo que parece ser cada archivo en el repositorio; incluso aquellos que no han cambiado. –

+0

Mi mal, el formato es " .. " en lugar de "". – igorw

+0

Gracias, un poco incómodo pero servirá. – Andrew

27

Creo que este comando es su respuesta:

git diff --stat abc123 xyz123 #where abc123 and xyz123 are SHA1 hashes of commit objects 

Directamente desde el git community book

Si no desea ver todo el parche, se puede añadir el '--stat' opción, que limitará la salida a los archivos que han cambiado junto con un pequeño gráfico de texto que representa cuántas líneas cambiaron en cada archivo.

+2

Más específicamente, 'git diff --stat '. –

+3

No, esto no es exactamente lo que él quería. Git diff hace una diferencia directa entre los árboles, no considera los commits. Si crea un nuevo archivo con el contenido "A", entonces cambie el contenido a "B", luego cámbielos de nuevo a "A", "git diff --stat HEAD ^^ HEAD" le dará un resultado en blanco. – igorw

+2

'git diff --name-only' es probablemente mejor que' git diff --stat' pero como se señala 'git diff' no está haciendo lo que el OP quería. – nnutter

1

Ésta es similar a igorw 's, pero evita la eliminación del SHA a través grep:

git log --pretty='format:' --name-only HEAD^^..HEAD | sort -u 

Si, además, quieres ver cómo se modificaron los archivos, reemplazar --name-only con --name-status.

+0

Acabo de probar este comando. Tomó alrededor de 10 segundos para procesar y luego comenzó a arrojar una enorme lista de archivos. –

+0

@ ostler.c: ¿Pasó el rango de revisión en '" $ @ "'? De lo contrario, mostrará los cambios existentes, que es mucho :-) He revisado mi respuesta para usar un ejemplo, como en las otras respuestas. –

+0

Muy bien, eso tiene sentido. Me sorprende que no supiera "$ @". Aunque, no creo que sea muy útil para la mayoría de los comandos. –

4

Si sólo desea ver los nombres de los archivos donde cometen b es cronológicamente después a:

git diff <a commit sha1>...<b commit sha2> --name-only # b is after a in time 

Si desea ver todos los nombres de archivo y lo que fue cambiado de cometer un cometer b luego dejar caer el último argumento.

git diff <a commit sha1>...<b commit sha2> # shows file names and what changed in each file 

Un ejemplo de <commit sha1> son el envío de datos de identificación, al igual 675ee6860d2c273bcc6c6a0536634a107e2a3d9f. En general, los primeros 8-10 dígitos funcionarán en la mayoría de los proyectos, pero pueden necesitar más si el proyecto tiene montones de confirmaciones. Normalmente uso el resultado de la identificación desde git log --oneline.

Cuando obtiene una diferencia de ... b y b es posterior a un tiempo, es fácil ver lo que ha cambiado en cada archivo cronológicamente.

1

Yo usaría; tomando los primeros 8 del commit hash. Si quieres puedes tubería en un archivo de acuerdo con el siguiente:

git log 12345678..87654321 > C:\GitChanges.txt 
Cuestiones relacionadas