Come fare in modo che git log mostri nomi di file come svn log -v


987

Il registro di SVN ha una modalità "-v" che genera nomi di file di file modificati in ogni commit, in questo modo:

jes5199 $ svn log -v
-------------------------------------------------- ----------------------
r1 | jes5199 | 03-01-2007 14:39:41 -0800 (mer, 03 gen 2007) | 1 riga
Percorsi modificati:
   A / AUTORI
   A / COPIA
   A / ChangeLog
   A / EVOLUTION
   A / INSTALL
   A / MacOSX

C'è un modo rapido per ottenere un elenco di file modificati in ogni commit in git?


15
Mi chiedo perché git lognon supporta solo uno -vswitch come tanti si aspettano / vogliono? </gripe>
MarkHu il

Risposte:


1528

Per i nomi di percorso completi dei file modificati:

git log --name-only

Per i nomi dei percorsi completi e lo stato dei file modificati:

git log --name-status

Per nomi abbreviati e un diffstat di file modificati:

git log --stat

Ci sono molte più opzioni, controlla i documenti .


17
Io uso git log --numstat. Vedi git help logper più opzioni.
ma11hew28,

29
git log --name-only --onelineè anche abbastanza spiffy: una linea colorata per il commit e un file per riga. stackoverflow.com/a/14227496/1995714
cp.engr

4
Con git 2.7.3, ho dovuto usarlo git log --name-status --find-renamesper mostrare i file rinominati invece di addizione + cancellazione.
Suzanne Dupéron,

1
Si noti che --statabbrevia i percorsi lunghi; la larghezza è configurabile ma gli istogrammi avvolti sono più difficili da leggere. Altri formati come --numstatstampare sempre percorsi completi.
Beni Cherniavsky-Paskin,

@ ma11hew28 Grazie. --numstatè alla riga 946 di quella pagina man a partire da 2.22.00 git. Sono molte più opzioni di quante la maggior parte delle persone abbia bisogno.
Ripristina Monica - M. Schröder il

139

NOTA: è obsoleto, utilizzare invece git whatchangedgit log

I nuovi utenti sono incoraggiati a usare git-log [1] invece. Il whatchangedcomando è essenzialmente lo stesso di git-log [1] ma per impostazione predefinita mostra l'output diff del formato non elaborato e salta le fusioni.

Il comando viene mantenuto principalmente per motivi storici; le dita di molte persone che hanno imparato Git molto prima di git logessere inventate leggendo la mailing list del kernel Linux sono addestrate a scriverlo.


È possibile utilizzare il comando git whatchanged --statper ottenere un elenco di file modificati in ciascun commit (insieme al messaggio di commit).

Riferimenti


50

git show è anche un ottimo comando.

È un po 'come svn diff, ma puoi passargli una guida di commit e vedere quella diff.


46

Se vuoi ottenere i nomi dei file solo senza il resto del messaggio di commit puoi usare:

git log --name-only --pretty=format: <branch name>

Questo può quindi essere esteso per utilizzare le varie opzioni che contengono il nome del file:

git log --name-status --pretty=format: <branch name>

git log --stat --pretty=format: <branch name>

Una cosa da notare quando si utilizza questo metodo è che ci sono alcune righe vuote nell'output che dovranno essere ignorate. L'utilizzo di questo può essere utile se si desidera visualizzare i file che sono stati modificati su un ramo locale, ma non è stato ancora trasferito su un ramo remoto e non vi è alcuna garanzia che sia stato già inserito l'ultimo dal telecomando. Ad esempio :

git log --name-only --pretty=format: my_local_branch --not origin/master

Mostrerebbe tutti i file che sono stati modificati sul ramo locale, ma non ancora uniti al ramo principale sul telecomando.


1
Nota sugli spazi bianchi negli esempi sopra - è come git log --stat --pretty="format:" $branchName,. Quindi, per esempio git log --stat --pretty="format:" $(git rev-parse --abbrev-ref HEAD),. Mentre ci sono, ecco l'esatto incantesimo che ha finito per essere rilevante per il mio scopo:git log --name-only --pretty="format: " master..$(git rev-parse --abbrev-ref HEAD)
driftcatcher

41

Lo uso quotidianamente per mostrare la cronologia con i file che sono cambiati:

git log --stat --pretty=short --graph

Per farla breve, aggiungi un alias nel tuo .gitconfig facendo:

git config --global alias.ls 'log --stat --pretty=short --graph'

Il mio è molto vicino a quello, git log --pretty = oneline --graph --name-status. Lo trovo più conciso, mostrando solo l'elenco dei file che sono cambiati.
Peter Suwara,

15

Io lo uso questo:

git log --name-status <branch>..<branch> | grep -E '^[A-Z]\b' | sort | uniq

che genera solo un elenco di file e il loro stato (aggiunto, modificato, eliminato):

A   sites/api/branding/__init__.py
M   sites/api/branding/wtv/mod.py
...

7

git diff --stat HEAD^!mostra i file modificati e il conteggio delle righe aggiunte / rimosse per l'ultimo commit ( HEAD).

Mi sembra che non ci sia un singolo comando per ottenere un output conciso costituito solo da nomi di file e conteggi di riga aggiunti e rimossi per diversi commit contemporaneamente, quindi ho creato il mio script bash per questo:

#!/bin/bash
for ((i=0; i<=$1; i++))
do
    sha1=`git log -1 --skip=$i --pretty=format:%H`
    echo "HEAD~$i $sha1"
    git diff --stat HEAD~$(($i+1)) HEAD~$i 
done

Da chiamare ad es. ./changed_files 99per ottenere le modifiche in una forma concisa da HEADa HEAD~99. Può essere convogliato ad es. a less.


Non puoi fare git diff --stat HEAD..masterper mostrare la differenza tra HEAD e master o non esisteva quando hai pubblicato la tua risposta nel 2012?
Ferrybig,

1
La domanda di @Ferrybig OP riguarda come "ottenere un elenco di file modificati in ogni commit" , non la differenza tra HEADe master. Queste sono due cose diverse.
nrz,

4

Trovo che il seguente sia il display ideale per elencare quali file sono cambiati per commit in un formato conciso:

git log --pretty=oneline --graph --name-status

3

Un riepilogo delle risposte con output di esempio

Questo utilizza un repository locale con cinque semplici commit.

‣ git log --name-only
commit ed080bc88b7bf0c5125e093a26549f3755f7ae74 (HEAD -> master)
Author: My Name <user@email.com>
Date:   Mon Oct 21 15:46:04 2019 -0700

    mv file4 to file5

file5

commit 5c4e8cfbe3554fe3d7d99b5ae4ba381fa1cdb328
Author: My Name <user@email.com>
Date:   Mon Oct 21 15:36:32 2019 -0700

    foo file1

    really important to foo before the bar

file1

commit 1b6413400b5a6a96d062a7c13109e6325e081c85
Author: My Name <user@email.com>
Date:   Mon Oct 21 15:34:37 2019 -0700

    foobar file2, rm file3

file2
file3

commit e0dd02ce23977c782987a206236da5ab784543cc
Author: My Name <user@email.com>
Date:   Mon Oct 21 15:33:05 2019 -0700

    Add file4

file4

commit b58e85692f711d402bae4ca606d3d2262bb76cf1
Author: My Name <user@email.com>
Date:   Mon Oct 21 15:32:41 2019 -0700

    Added files

file1
file2
file3


‣ git log --name-status
commit ed080bc88b7bf0c5125e093a26549f3755f7ae74 (HEAD -> master)
Author: My Name <user@email.com>
Date:   Mon Oct 21 15:46:04 2019 -0700

    mv file4 to file5

R100    file4   file5

commit 5c4e8cfbe3554fe3d7d99b5ae4ba381fa1cdb328
Author: My Name <user@email.com>
Date:   Mon Oct 21 15:36:32 2019 -0700

    foo file1

    really important to foo before the bar

M       file1

commit 1b6413400b5a6a96d062a7c13109e6325e081c85
Author: My Name <user@email.com>
Date:   Mon Oct 21 15:34:37 2019 -0700

    foobar file2, rm file3

M       file2
D       file3

commit e0dd02ce23977c782987a206236da5ab784543cc
Author: My Name <user@email.com>
Date:   Mon Oct 21 15:33:05 2019 -0700

    Add file4

A       file4

commit b58e85692f711d402bae4ca606d3d2262bb76cf1
Author: My Name <user@email.com>
Date:   Mon Oct 21 15:32:41 2019 -0700

    Added files

A       file1
A       file2
A       file3


‣ git log --stat
commit ed080bc88b7bf0c5125e093a26549f3755f7ae74 (HEAD -> master)
Author: My Name <user@email.com>
Date:   Mon Oct 21 15:46:04 2019 -0700

    mv file4 to file5

 file4 => file5 | 0
 1 file changed, 0 insertions(+), 0 deletions(-)

commit 5c4e8cfbe3554fe3d7d99b5ae4ba381fa1cdb328
Author: My Name <user@email.com>
Date:   Mon Oct 21 15:36:32 2019 -0700

    foo file1

    really important to foo before the bar

 file1 | 3 +++
 1 file changed, 3 insertions(+)

commit 1b6413400b5a6a96d062a7c13109e6325e081c85
Author: My Name <user@email.com>
Date:   Mon Oct 21 15:34:37 2019 -0700

    foobar file2, rm file3

 file2 | 1 +
 file3 | 0
 2 files changed, 1 insertion(+)

commit e0dd02ce23977c782987a206236da5ab784543cc
Author: My Name <user@email.com>
Date:   Mon Oct 21 15:33:05 2019 -0700

    Add file4

 file4 | 0
 1 file changed, 0 insertions(+), 0 deletions(-)

commit b58e85692f711d402bae4ca606d3d2262bb76cf1
Author: My Name <user@email.com>
Date:   Mon Oct 21 15:32:41 2019 -0700

    Added files

 file1 | 0
 file2 | 0
 file3 | 0
 3 files changed, 0 insertions(+), 0 deletions(-)


‣ git log --name-only --oneline
ed080bc (HEAD -> master) mv file4 to file5
file5
5c4e8cf foo file1
file1
1b64134 foobar file2, rm file3
file2
file3
e0dd02c Add file4
file4
b58e856 Added files
file1
file2
file3


‣ git log --pretty=oneline --graph --name-status
* ed080bc88b7bf0c5125e093a26549f3755f7ae74 (HEAD -> master) mv file4 to file5
| R100  file4   file5
* 5c4e8cfbe3554fe3d7d99b5ae4ba381fa1cdb328 foo file1
| M     file1
* 1b6413400b5a6a96d062a7c13109e6325e081c85 foobar file2, rm file3
| M     file2
| D     file3
* e0dd02ce23977c782987a206236da5ab784543cc Add file4
| A     file4
* b58e85692f711d402bae4ca606d3d2262bb76cf1 Added files
  A     file1
  A     file2
  A     file3


‣ git diff-tree HEAD
ed080bc88b7bf0c5125e093a26549f3755f7ae74
:100644 000000 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 0000000000000000000000000000000000000000 D  file4
:000000 100644 0000000000000000000000000000000000000000 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 A  file5


‣ git log --stat --pretty=short --graph
* commit ed080bc88b7bf0c5125e093a26549f3755f7ae74 (HEAD -> master)
| Author: My Name <user@email.com>
| 
|     mv file4 to file5
| 
|  file4 => file5 | 0
|  1 file changed, 0 insertions(+), 0 deletions(-)
| 
* commit 5c4e8cfbe3554fe3d7d99b5ae4ba381fa1cdb328
| Author: My Name <user@email.com>
| 
|     foo file1
| 
|  file1 | 3 +++
|  1 file changed, 3 insertions(+)
| 
* commit 1b6413400b5a6a96d062a7c13109e6325e081c85
| Author: My Name <user@email.com>
| 
|     foobar file2, rm file3
| 
|  file2 | 1 +
|  file3 | 0
|  2 files changed, 1 insertion(+)
| 
* commit e0dd02ce23977c782987a206236da5ab784543cc
| Author: My Name <user@email.com>
| 
|     Add file4
| 
|  file4 | 0
|  1 file changed, 0 insertions(+), 0 deletions(-)
| 
* commit b58e85692f711d402bae4ca606d3d2262bb76cf1
  Author: My Name <user@email.com>

      Added files

   file1 | 0
   file2 | 0
   file3 | 0
   3 files changed, 0 insertions(+), 0 deletions(-)


‣ git log --name-only --pretty=format:
file5

file1

file2
file3

file4

file1
file2
file3


‣ git log --name-status --pretty=format:
R100    file4   file5

M       file1

M       file2
D       file3

A       file4

A       file1
A       file2
A       file3


‣ git diff --stat 'HEAD^!'
 file4 => file5 | 0
 1 file changed, 0 insertions(+), 0 deletions(-)


‣ git show
commit ed080bc88b7bf0c5125e093a26549f3755f7ae74 (HEAD -> master)
Author: My Name <user@email.com>
Date:   Mon Oct 21 15:46:04 2019 -0700

    mv file4 to file5

diff --git a/file4 b/file5
similarity index 100%
rename from file4
rename to file5


Crediti a @ CB-Bailey @ Peter-Suwara @Gaurav @ Omer-Dagan @xsor @Hazok @nrz @ptc


0

Un altro comando utile sarebbe git diff-tree <hash>dove l'hash può essere anche un intervallo di hash (indicato dalla <old>..<new>notazione). Un esempio di output:

$ git diff-tree  HEAD
:040000 040000 8e09a be406 M myfile

I campi sono:

modalità sorgente, modalità dest, hash sorgente, hash dest, stato, nome file

Gli stati sono quelli che ti aspetteresti: D (eliminato), A (aggiunto), M (modificato) ecc. Vedi la pagina man per la descrizione completa.


0

In genere li uso per ottenere i registri:

$ git log --name-status --author='<Name of author>' --grep="<text from Commit message>"

$ git log --name-status --grep="<text from Commit message>"

1
Non sapevo di queste opzioni, ma questo post sarebbe più utile se spiegasse che filtra il registro. Per un momento, ho pensato che fosse un modo per cambiare il modo in cui gli autori sono elencati nell'output.
Stein,
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.