2010-06-29 14 views

risposta

41

Questo è il meglio che ho potuto venire con:

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

Sostituire TESTA ^^ e la testa con i commit che si desidera confrontare.

Il mio tentativo utilizza git log con --name-only per elencare tutti i file di ciascun commit tra quelli specificati. --pretty=oneline rende la parte sopra l'elenco dei file composto solo da SHA di commit e titolo del messaggio. --full-index rende SHA i 40 caratteri completi. grep filtra qualsiasi cosa simile a uno SHA seguito da uno spazio. A meno che non si abbiano file che iniziano con uno SHA seguito da uno spazio, il risultato dovrebbe essere accurato.

+0

Quando eseguo questo comando contro la testa^e la testa, ho un elenco di quello che sembra ogni singolo file nel repository; anche quelli che non sono cambiati. –

+0

Il mio male, il formato è " .. " invece di "". – igorw

+0

Grazie, un po 'imbarazzante, ma lo farà. – Andrew

27

Penso che questo comando è la vostra risposta:

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

Direttamente dal git community book

Se non si desidera vedere l'intero patch, è possibile aggiungere il '--stat' opzione, che limiterà l'output ai file che sono cambiati insieme a un piccolo grafico testuale che mostra quante linee sono cambiate in ogni file.

+2

In particolare, 'git diff --stat '. –

+3

No, non è esattamente quello che voleva. Git diff fa una differenza diretta tra gli alberi, non considera i commit. Se crei un nuovo file con contenuto "A", quindi modifica i contenuti in "B", quindi li rimandi a "A", "git diff --stat HEAD ^^ HEAD' ti darà un risultato vuoto. – igorw

+2

'git diff --name-only' è probabilmente migliore di' git diff --stat' ma come sottolineato 'git diff' non sta facendo quello che l'OP voleva. – nnutter

1

Questo è simile a igorw 's, ma evita la rimozione della SHA via grep:

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

Se inoltre volete vedere come i file sono stati modificati, sostituire --name-only con --name-status.

+0

Ho appena testato questo comando. Ci sono voluti circa 10 secondi per elaborare poi ha iniziato a sputare un elenco di file enorme. –

+0

@ ostler.c: hai passato l'intervallo di revisione in '" $ @ "'? Altrimenti mostrerà le modifiche esistenti, il che è molto :-) Ho rivisto la mia risposta per usare un esempio, come nelle altre risposte. –

+0

Va bene, è logico. Sono sorpreso di non sapere "$ @". Sebbene, non lo trovo molto utile per la maggior parte dei comandi. –

4

Se vogliono solo vedere i nomi dei file in cui commettono b è cronologicamente dopo a:

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

Se si desidera visualizzare tutti i nomi dei file e ciò che è stato cambiato da commettere un commettere b poi cadere l'ultimo discussione.

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

Un esempio di <commit sha1> sono il commit id come 675ee6860d2c273bcc6c6a0536634a107e2a3d9f. Generalmente le prime 8-10 cifre funzioneranno sulla maggior parte dei progetti, ma potrebbero aver bisogno di più se il progetto ha un gran numero di commit. In genere utilizzo l'output dell'id da git log --oneline.

Quando si ottiene una differenza di a ... b e b è più tardi di una volta, è facile vedere ciò che è stato modificato in ogni file cronologicamente.

1

Vorrei usare; prendendo i primi 8 dell'hash commit. Se si voleva si poteva tubo in un file come per il seguito:

git log 12345678..87654321 > C:\GitChanges.txt 
Problemi correlati