Comment obtenir une liste de tous les fichiers qui ont changé entre deux commits Git?

178

En raison de la bureaucratie, je dois obtenir une liste de tous les fichiers modifiés dans mon référentiel pour un rapport (j'ai commencé avec le code source existant).

Que dois-je courir pour obtenir cette liste?

Chen Kinnrot
la source
34
"due à la bureaucratie" xD
ptim

Réponses:

238

Pour les fichiers modifiés entre un SHA donné et votre commit actuel:

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

ou si vous souhaitez inclure des fichiers modifiés mais pas encore validés:

git diff --name-only <starting SHA>

Plus généralement, la syntaxe suivante vous indiquera toujours quels fichiers ont été modifiés entre deux commits (spécifiés par leur SHA ou d'autres noms):

git diff --name-only <commit1> <commit2>
ambre
la source
2
et si vous voulez connaître les fichiers modifiés pour un commit particulier, faites:git diff --name-only <SHA> <SHA>^
thebugfinder
3
Utiliser l' --name-statusindicateur au lieu de --name-onlyest pratique pour obtenir une liste de fichiers et voir leur statut de modification, comme Ajouté ou Modifié.
Thane Plummer
@Amber devrait mentionner les notes de @Thane Plummer qui --name-statusmontrent ce qui leur est arrivé
Zoltán Süle
64

Pour trouver les noms de tous les fichiers modifiés depuis votre dernier commit:

git diff --name-only

Ou (pour un peu plus d'informations, y compris les fichiers non suivis):

git status
Tim Bellis
la source
48
  • Pour répertorier tous les Unstaged chenillés fichiers modifiés:

    git diff --name-only
    
  • Pour répertorier tous les fichiers modifiés suivis par étapes :

    git diff --name-only --staged
    
  • Pour répertorier tous les fichiers modifiés suivis par étapes et non par étapes :

    { git diff --name-only ; git diff --name-only --staged ; } | sort | uniq
    
  • Pour lister tous les fichiers non suivis (ceux répertoriés par git status, donc sans inclure les fichiers ignorés):

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

Si vous l'utilisez dans un script shell et que vous souhaitez vérifier par programme si ces commandes ont renvoyé quelque chose, vous serez intéressé par git diffl' --exit-codeoption de.

Flimm
la source
16

Lorsque j'ai ajouté / modifié / supprimé de nombreux fichiers (depuis le dernier commit), j'aime regarder ces modifications dans l'ordre chronologique.

Pour cela j'utilise:

  • Pour répertorier tous les fichiers non intermédiaires:

    git ls-files --other --modified --exclude-standard
    
  • Pour obtenir la dernière date de modification de chaque fichier:

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

Bien que Ruvim suggère dans les commentaires :

xargs -0 stat -c '%y %n' -- 
  • Pour les trier du plus ancien au plus récent:

    sort
    

Un alias facilite son utilisation:

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'

Ou (plus court et plus efficace, grâce à ruvim )

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

Par exemple:

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

Je peux maintenant revoir mes modifications, des plus anciennes aux plus récentes.

VonC
la source
Pourquoi ne pas utiliser un xargsseul appel stat? Le one-liner complet:git ls-files -z --other --modified --exclude-standard | xargs -0 stat -c '%y %n' -- | sort
ruvim
@ruvim Merci. Très bonne suggestion. J'ai modifié la réponse pour inclure votre commentaire, pour plus de visibilité.
VonC
4

J'ai besoin d'une liste de fichiers qui avaient changé de contenu entre deux commits (seulement ajoutés ou modifiés), j'ai donc utilisé:

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

Les différentes options de filtre de diff de la documentation de git diff :

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

Sélectionnez uniquement les fichiers qui sont ajoutés (A), copiés (C), supprimés (D), modifiés (M), renommés (R), dont le type (c'est-à-dire fichier normal, lien symbolique, sous-module,…) a changé (T), sont non fusionnés (U), sont inconnus (X) ou ont eu leur appariement cassé (B). Toute combinaison de caractères de filtre (y compris aucun) peut être utilisée. Lorsque * (tout ou rien) est ajouté à la combinaison, tous les chemins sont sélectionnés s'il y a un fichier qui correspond à d'autres critères dans la comparaison; s'il n'y a aucun fichier correspondant à d'autres critères, rien n'est sélectionné.

En outre, ces lettres majuscules peuvent être réduites pour exclure. Par exemple, --diff-filter = ad exclut les chemins ajoutés et supprimés.

Si vous souhaitez également afficher l'état (par exemple, A / M), passez --name-onlyà --name-status.

Fourrage
la source
3

La liste des modifications non mises en scène peut être obtenue en utilisant git statuset la grepcommande comme ci-dessous. Quelque chose comme 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
 ....
SuperNova
la source
Notez que cela ne peut être utilisé que pour les modifications non organisées, donc ce n'est pas utile pour les `` fichiers qui ont changé entre deux commits Git ''
John Vandenberg
2

Avec git showvous pouvez obtenir un résultat similaire. Pour regarder le commit (tel qu'il apparaît sur la git logvue) avec la liste des fichiers inclus dans, utilisez:

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

[commit-id_A]est le commit initial et [commit-id_B]est le dernier commit que vous voulez montrer.

Attention particulière avec ^symbole. Si vous ne mettez pas cela, les informations commit-id_A ne seront pas déployées.

Kurapika
la source
1

Si vous voulez vérifier les fichiers modifiés, vous devez vous occuper de nombreuses petites choses comme celle qui sera la meilleure à utiliser, comme si vous voulez vérifier lequel des fichiers a changé, tapez simplement

git status - il affichera les fichiers avec les modifications

puis si vous voulez savoir quelles modifications doivent être apportées, vous pouvez le vérifier de différentes manières,

git diff - affichera toutes les modifications dans tous les fichiers

ce n'est bon que lorsqu'un seul fichier est modifié

et si vous souhaitez vérifier un fichier particulier, utilisez

git diff

Saurabh Pal
la source