Come ottenere un elenco di tutti i file che sono stati modificati tra due commit Git?


178

A causa della burocrazia, ho bisogno di ottenere un elenco di tutti i file modificati nel mio repository per un rapporto (ho iniziato con il codice sorgente esistente).

Cosa devo eseguire per ottenere questo elenco?


34
"a causa della burocrazia" xD
ptim

Risposte:


238

Per i file modificati tra un determinato SHA e il tuo commit corrente:

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

o se si desidera includere file modificati ma non ancora impegnati:

git diff --name-only <starting SHA>

Più in generale, la sintassi seguente indica sempre quali file sono stati modificati tra due commit (specificati dai rispettivi SHA o altri nomi):

git diff --name-only <commit1> <commit2>

2
e se vuoi conoscere i file modificati per un determinato commit, fai:git diff --name-only <SHA> <SHA>^
thebugfinder

3
Usare la --name-statusbandiera invece di --name-onlyè utile per ottenere un elenco di file e vedere il loro stato di modifica, come Aggiunto o Modificato.
Thane Plummer,

@Amber dovrebbe menzionare le note di @Thane Plummer che --name-statusmostrano cosa è successo a loro
Zoltán Süle il

64

Per trovare i nomi di tutti i file modificati dall'ultimo commit:

git diff --name-only

Oppure (per ulteriori informazioni, inclusi file non monitorati):

git status

48
  • Per elencare tutti i file modificati tracciati non in scena :

    git diff --name-only
    
  • Per elencare tutti messo in scena i file modificati cingolati:

    git diff --name-only --staged
    
  • Per elencare tutti i file modificati monitorati con fasi e non fasi :

    { git diff --name-only ; git diff --name-only --staged ; } | sort | uniq
    
  • Per elencare tutti i file non tracciati (quelli elencati da git status, quindi non includere alcun file ignorato):

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

Se lo stai usando in uno script di shell e vuoi verificare a livello di codice se questi comandi hanno restituito qualcosa, ti interesserà git diffl' --exit-codeopzione.


16

Quando ho aggiunto / modificato / cancellato molti file (dall'ultimo commit), mi piace guardare quelle modifiche in ordine cronologico.

Per questo uso:

  • Per elencare tutti i file non gestiti:

    git ls-files --other --modified --exclude-standard
    
  • Per ottenere la data dell'ultima modifica per ciascun file:

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

Sebbene ruvim suggerisca nei commenti :

xargs -0 stat -c '%y %n' -- 
  • Per ordinarli dal più vecchio al più recente:

    sort
    

Un alias semplifica l'utilizzo:

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'

Oppure (più breve ed efficiente, grazie a ruvim )

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

Per esempio:

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

Ora posso rivedere le mie modifiche, dalla più vecchia alla più recente.


Perché non usare xargse la chiamata singola di stat? Il full-liner:git ls-files -z --other --modified --exclude-standard | xargs -0 stat -c '%y %n' -- | sort
ruvim

@ruvim Grazie. Ottimo suggerimento Ho modificato la risposta per includere il tuo commento, per una maggiore visibilità.
VonC,

4

Ho bisogno di un elenco di file che hanno cambiato il contenuto tra due commit (solo aggiunti o modificati), quindi ho usato:

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

Le diverse opzioni di filtro diff dalla documentazione git diff :

diff-filter = [(A | C | D | M | R | T | U | X | B) ... [*]]

Seleziona solo i file che vengono aggiunti (A), copiati (C), eliminati (D), modificati (M), rinominati (R), che cambiano il loro tipo (ovvero file normale, link simbolico, sottomodulo, ...) (T), sono Unmerged (U), sono Unknown (X) o hanno avuto il loro abbinamento Broken (B). È possibile utilizzare qualsiasi combinazione di caratteri filtro (incluso nessuno). Quando * (Tutto-o-nessuno) viene aggiunto alla combinazione, tutti i percorsi vengono selezionati se esiste un file che corrisponde ad altri criteri nel confronto; se non esiste alcun file che soddisfi altri criteri, non viene selezionato nulla.

Inoltre, queste lettere maiuscole possono essere ridimensionate per escludere. Ad esempio --diff-filter = ad esclude i percorsi aggiunti ed eliminati.

Se si desidera elencare anche lo stato (ad es. A / M), passare --name-onlya --name-status.


3

L'elenco delle modifiche non messe in scena può essere ottenuto usando git statuse il grepcomando come di seguito. Qualcosa come 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
 ....

Si noti che questo può essere utilizzato solo per modifiche non messe in scena, quindi non è utile per "file che sono stati modificati tra due commit Git"
John Vandenberg

2

Con git showte puoi ottenere un risultato simile. Per guardare il commit (come sembra a git logvista) con l'elenco dei file inclusi in, utilizzare:

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

Dov'è [commit-id_A]il commit iniziale e[commit-id_B] è l'ultimo commit di quello che vuoi mostrare.

Particolare attenzione con il ^simbolo. In caso contrario, le informazioni di commit-id_A non verranno distribuite.


1

Se vuoi controllare i file modificati devi prenderti cura di molte piccole cose come quale sarà meglio usare, come se vuoi controllare quale dei file modificati basta digitare

stato git - mostrerà i file con le modifiche

quindi se vuoi sapere quali modifiche devono essere apportate, puoi verificarle in vari modi,

git diff - mostrerà tutte le modifiche in tutti i file

è valido solo quando viene modificato un solo file

e se si desidera controllare un determinato file, utilizzare

git diff

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.