Comment faire pour que git log affiche les noms de fichiers comme svn log -v

987

Le journal de SVN a un mode "-v" qui sort les noms de fichiers des fichiers modifiés dans chaque commit, comme ceci:

jes5199 $ svn log -v
-------------------------------------------------- ----------------------
r1 | jes5199 | 2007-01-03 14:39:41 -0800 (mer. 03 janv. 2007) | 1 ligne
Chemins modifiés:
   A / AUTEURS
   A / COPIE
   A / ChangeLog
   A / ÉVOLUTION
   A / INSTALL
   A / MacOSX

Existe-t-il un moyen rapide d'obtenir une liste des fichiers modifiés dans chaque commit dans git?

jes5199
la source
15
Vous vous demandez pourquoi git logne prend pas simplement en charge un -vcommutateur comme beaucoup l'attendent / le veulent? </gripe>
MarkHu

Réponses:

1528

Pour les noms de chemin complets des fichiers modifiés:

git log --name-only

Pour les noms de chemin d'accès complets et l'état des fichiers modifiés:

git log --name-status

Pour les noms de chemin abrégés et une liste de fichiers modifiés:

git log --stat

Il y a beaucoup plus d'options, consultez les documents .

CB Bailey
la source
17
J'utilise git log --numstat. Voir git help logpour plus d'options.
ma11hew28
29
git log --name-only --onelineest assez épatant aussi - une ligne colorée pour le commit, et un fichier par ligne. stackoverflow.com/a/14227496/1995714
cp.engr
4
Avec git 2.7.3, j'ai dû l'utiliser git log --name-status --find-renamespour afficher les fichiers renommés au lieu de l'ajout + la suppression.
Suzanne Dupéron
1
Notez que l' --statabréviation de longs chemins; La largeur est configurable mais les histogrammes enveloppés sont plus difficiles à lire. D'autres formats, comme --numstattoujours imprimer des chemins complets.
Beni Cherniavsky-Paskin
@ ma11hew28 Merci. --numstatest à la ligne 946 de cette page de manuel à partir de git 2.22.00. C'est beaucoup plus d'options que la plupart des gens n'en ont besoin.
Rétablir Monica - M. Schröder
139

REMARQUE: est obsolète, utilisez plutôt git whatchangedgit log

Les nouveaux utilisateurs sont encouragés à utiliser git-log [1] à la place. La whatchangedcommande est essentiellement la même que git-log [1] mais par défaut pour afficher la sortie diff du format brut et pour ignorer les fusions.

La commande est conservée principalement pour des raisons historiques; les doigts de nombreuses personnes qui ont appris le git bien avant git logson invention en lisant la liste de diffusion du noyau Linux sont formés pour le taper.


Vous pouvez utiliser la commande git whatchanged --statpour obtenir une liste des fichiers qui ont changé dans chaque commit (avec le message de commit).

Références

mipadi
la source
50

git show est également une excellente commande.

C'est un peu comme svn diff, mais vous pouvez lui passer un guide de validation et voir cette différence.

ptc
la source
46

Si vous souhaitez obtenir les noms de fichiers uniquement sans le reste du message de validation, vous pouvez utiliser:

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

Cela peut ensuite être étendu pour utiliser les différentes options qui contiennent le nom du fichier:

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

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

Une chose à noter lors de l'utilisation de cette méthode est qu'il y a des lignes vides dans la sortie qui devront être ignorées. Son utilisation peut être utile si vous souhaitez voir les fichiers qui ont été modifiés sur une branche locale, mais qui ne sont pas encore envoyés à une branche distante et il n'y a aucune garantie que la dernière version de la télécommande a déjà été récupérée. Par exemple :

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

Affiche tous les fichiers qui ont été modifiés sur la branche locale, mais qui n'ont pas encore été fusionnés avec la branche principale de la télécommande.

Hazok
la source
1
Remarque sur les espaces dans les exemples ci-dessus - c'est comme git log --stat --pretty="format:" $branchName,. Ainsi, par exemple git log --stat --pretty="format:" $(git rev-parse --abbrev-ref HEAD),. Pendant que j'y suis, voici l'incantation exacte qui a fini par être pertinente pour mon but:git log --name-only --pretty="format: " master..$(git rev-parse --abbrev-ref HEAD)
driftcatcher
41

J'utilise cela quotidiennement pour afficher l'historique des fichiers qui ont changé:

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

Pour faire court, ajoutez un alias dans votre .gitconfigen faisant:

git config --global alias.ls 'log --stat --pretty=short --graph'
xsor
la source
Le mien est très proche de cela, git log --pretty = oneline --graph --name-status. Je le trouve plus concis, montrant simplement la liste des fichiers qui ont changé.
Peter Suwara
15

J'utilise ceci:

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

qui génère une liste de fichiers uniquement et leur état (ajouté, modifié, supprimé):

A   sites/api/branding/__init__.py
M   sites/api/branding/wtv/mod.py
...
Sofia
la source
7

git diff --stat HEAD^!affiche les fichiers modifiés et le nombre de lignes ajoutées / supprimées pour le dernier commit ( HEAD).

Il me semble qu'il n'y a pas de commande unique pour obtenir une sortie concise composée uniquement de noms de fichiers et de nombres de lignes ajoutés et supprimés pour plusieurs validations à la fois, j'ai donc créé mon propre script bash pour cela:

#!/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

Pour être appelé par exemple. ./changed_files 99pour obtenir les modifications sous une forme concise de HEADà HEAD~99. Peut être canalisé par exemple. à less.

nrz
la source
Ne pouvez-vous pas faire git diff --stat HEAD..masterpour montrer la différence entre HEAD et master, ou cela n'existait-il pas lorsque vous avez publié votre réponse en 2012?
Ferrybig
1
La question de @Ferrybig OP est de savoir comment "obtenir une liste des fichiers modifiés dans chaque commit" , pas de la différence entre HEADet master. Ce sont deux choses différentes.
nrz
4

Je trouve que ce qui suit est l'affichage idéal pour répertorier les fichiers modifiés par validation dans un format concis:

git log --pretty=oneline --graph --name-status
Peter Suwara
la source
3

Un résumé des réponses avec un exemple de sortie

Il s'agit d'un référentiel local avec cinq validations simples.

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

    mv file4 to file5

file5

commit 5c4e8cfbe3554fe3d7d99b5ae4ba381fa1cdb328
Author: My Name <[email protected]>
Date:   Mon Oct 21 15:36:32 2019 -0700

    foo file1

    really important to foo before the bar

file1

commit 1b6413400b5a6a96d062a7c13109e6325e081c85
Author: My Name <[email protected]>
Date:   Mon Oct 21 15:34:37 2019 -0700

    foobar file2, rm file3

file2
file3

commit e0dd02ce23977c782987a206236da5ab784543cc
Author: My Name <[email protected]>
Date:   Mon Oct 21 15:33:05 2019 -0700

    Add file4

file4

commit b58e85692f711d402bae4ca606d3d2262bb76cf1
Author: My Name <[email protected]>
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 <[email protected]>
Date:   Mon Oct 21 15:46:04 2019 -0700

    mv file4 to file5

R100    file4   file5

commit 5c4e8cfbe3554fe3d7d99b5ae4ba381fa1cdb328
Author: My Name <[email protected]>
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 <[email protected]>
Date:   Mon Oct 21 15:34:37 2019 -0700

    foobar file2, rm file3

M       file2
D       file3

commit e0dd02ce23977c782987a206236da5ab784543cc
Author: My Name <[email protected]>
Date:   Mon Oct 21 15:33:05 2019 -0700

    Add file4

A       file4

commit b58e85692f711d402bae4ca606d3d2262bb76cf1
Author: My Name <[email protected]>
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 <[email protected]>
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 <[email protected]>
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 <[email protected]>
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 <[email protected]>
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 <[email protected]>
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 <[email protected]>
| 
|     mv file4 to file5
| 
|  file4 => file5 | 0
|  1 file changed, 0 insertions(+), 0 deletions(-)
| 
* commit 5c4e8cfbe3554fe3d7d99b5ae4ba381fa1cdb328
| Author: My Name <[email protected]>
| 
|     foo file1
| 
|  file1 | 3 +++
|  1 file changed, 3 insertions(+)
| 
* commit 1b6413400b5a6a96d062a7c13109e6325e081c85
| Author: My Name <[email protected]>
| 
|     foobar file2, rm file3
| 
|  file2 | 1 +
|  file3 | 0
|  2 files changed, 1 insertion(+)
| 
* commit e0dd02ce23977c782987a206236da5ab784543cc
| Author: My Name <[email protected]>
| 
|     Add file4
| 
|  file4 | 0
|  1 file changed, 0 insertions(+), 0 deletions(-)
| 
* commit b58e85692f711d402bae4ca606d3d2262bb76cf1
  Author: My Name <[email protected]>

      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 <[email protected]>
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


Crédits à @ CB-Bailey @ Peter-Suwara @Gaurav @ Omer-Dagan @xsor @Hazok @nrz @ptc

JamesThomasMoon1979
la source
0

Une autre commande utile serait git diff-tree <hash>où le hachage peut également être une plage de hachage (indiquée par une <old>..<new>notation). Un exemple de sortie:

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

Les champs sont:

mode source, mode dest, hachage source, hachage dest, état, nom de fichier

Les statuts sont ceux que vous attendez: D (supprimé), A (ajouté), M (modifié) etc. Voir la page de manuel pour une description complète.

Omer Dagan
la source
0

Je les utilise généralement pour obtenir les journaux:

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

$ git log --name-status --grep="<text from Commit message>"
Gaurav
la source
1
Je ne connaissais pas ces options, mais ce message serait plus utile s'il expliquait qu'il filtre le journal. Pendant un instant, j'ai pensé que c'était un moyen de changer la façon dont les auteurs sont répertoriés dans la sortie.
Stein