Comment répertorier uniquement les noms de fichiers qui ont changé entre deux validations?

1954

J'ai un tas de commits dans le repo. Je veux voir une liste de fichiers modifiés entre deux commits - de SHA1 à SHA2.

Quelle commande dois-je utiliser?

Shawn
la source
3
Pour un commit et son parent: stackoverflow.com/questions/424071/…
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

Réponses:

2667
git diff --name-only SHA1 SHA2

où il vous suffit d'inclure suffisamment de SHA pour identifier les commits. Vous pouvez également faire, par exemple

git diff --name-only HEAD~10 HEAD~5

pour voir les différences entre le dixième dernier commit et le cinquième plus récent (ou plus).

Peter
la source
152
Cela fonctionne également pour git show. git show --name-only SHA1.
August Lilleaas
78
git diff --name-status [TAG|SHA1]montre également quelles opérations ont été effectuées sur les fichiers
reconbot
2
vous pouvez également faire: git diff --name-only HEAD @ {3} HEAD @ {0} pour les validations exactes que vous souhaitez comparer.
b01
7
@AugustLilleaas utilisant réellement show ne montrera que les 2 commits spécifiques, si vous avez des commits entre ces 2, ils seront laissés de côté
chrisan
4
Comme indiqué ci-dessous, git diff --name-statusne semble pas vouloir afficher les fichiers ajoutés. @sschuberth a souligné git show, ce qui ne semble pas fonctionner correctement pour moi: git show --pretty=format: --name-status. Faire juste git show --name-statusdonne un peu plus d'informations, mais toujours agréable et dense ... ce sera ma nouvelle commande goto;)
travc
417
git diff --name-status [SHA1 [SHA2]]

est comme --name-only, sauf que vous obtenez un simple préfixe vous indiquant ce qui est arrivé au fichier (modifié, supprimé, ajouté ...)

git log --name-status --oneline [SHA1..SHA2]

est similaire, mais les validations sont répertoriées après le message de validation, vous pouvez donc voir quand un fichier a été modifié.

  • si vous êtes intéressé par ce qui est arrivé à certains fichiers / dossiers, vous pouvez les ajouter -- <filename> [<filename>...]à la git logversion.

  • si vous voulez voir ce qui s'est passé pour un seul commit, appelez-le SHA1, puis faites
    git log --name-status --oneline [SHA1^..SHA1]

Indicateurs d'état du fichier:
M modifié - Le fichier a été modifié
C copier-éditer - Le fichier a été copié et modifié
R renommer-éditer - Le fichier a été renommé et modifié
A ajouté - Le fichier a été ajouté
D supprimé - Le fichier a été supprimé
U non fusionné - Le fichier présente des conflits après une fusion

artfulrobot
la source
Il se trouve que je dis git diff --name-status et cela a donné le "fichier ajouté".
aartist
1
Pour git log, il doit avoir deux points entre les SHA, comme SHA1..SHA2, et le deuxième SHA n'est pas facultatif, il devrait donc ressembler à ceci: git log --name-status --oneline [SHA1 .. SHA2]
twasbrillig
Existe-t-il un moyen d'exclure certains fichiers / certains types de fichiers?
août
3
L' --relative[=<path>]option peut vous aider, je ne suis pas sûr. Sinon, il y a toujours | erep -v '(.tmp|.foo|.dontwant)$'...
artfulrobot
80

Il semble que personne n'ait mentionné l'interrupteur --stat:

$ git diff --stat HEAD~5 HEAD
 .../java/org/apache/calcite/rex/RexSimplify.java   | 50 +++++++++++++++++-----
 .../apache/calcite/sql/fun/SqlTrimFunction.java    |  2 +-
 .../apache/calcite/sql2rel/SqlToRelConverter.java  | 16 +++++++
 .../org/apache/calcite/util/SaffronProperties.java | 19 ++++----
 .../org/apache/calcite/test/RexProgramTest.java    | 24 +++++++++++
 .../apache/calcite/test/SqlToRelConverterTest.java |  8 ++++
 .../apache/calcite/test/SqlToRelConverterTest.xml  | 15 +++++++
 pom.xml                                            |  2 +-
 .../apache/calcite/adapter/spark/SparkRules.java   |  7 +--
 9 files changed, 117 insertions(+), 26 deletions(-)

Il y a aussi --numstat

$ git diff --numstat HEAD~5 HEAD
40      10      core/src/main/java/org/apache/calcite/rex/RexSimplify.java
1       1       core/src/main/java/org/apache/calcite/sql/fun/SqlTrimFunction.java
16      0       core/src/main/java/org/apache/calcite/sql2rel/SqlToRelConverter.java
8       11      core/src/main/java/org/apache/calcite/util/SaffronProperties.java
24      0       core/src/test/java/org/apache/calcite/test/RexProgramTest.java
8       0       core/src/test/java/org/apache/calcite/test/SqlToRelConverterTest.java
15      0       core/src/test/resources/org/apache/calcite/test/SqlToRelConverterTest.xml
1       1       pom.xml
4       3       spark/src/main/java/org/apache/calcite/adapter/spark/SparkRules.java

et --shortstat

$ git diff --shortstat HEAD~5 HEAD
9 files changed, 117 insertions(+), 26 deletions(-)
leeyuiwah
la source
4
La réponse acceptée est correcte, mais c'est super utile et vous donne un peu d'informations supplémentaires. Merci!
kontur
2
D'accord, c'est une réponse plus utile car elle contient les statistiques de diff.
internetross
52

Mais pour voir les fichiers modifiés entre votre branche et son ancêtre commun avec une autre branche (disons origine / maître):

git diff --name-only `git merge-base origin/master HEAD`
Tim James
la source
1
C'était vraiment utile! J'aimerais pouvoir simplement dire git diffstatus masterou similaire, ce qui déclenche ce qui précède.
oma
3
Ou git show --pretty=format: --name-only origin/master...
sschuberth
Vous ne pourrez peut-être pas en faire un alias git, mais vous pouvez certainement le mettre dans votre .bashrc.
Fred
3
Ou encore plus simple: git diff --name-only HEAD...master(notez les trois points). Pour une explication détaillée, voir ici .
ostrokach
1
On dirait que la réponse est généralement correcte! Simple git diff --name-only master..branchne correspond pas à la liste github PR. De cette façon, plus précis. Mais de toute façon, j'ai 173 fichiers changés contre 171 dans github PR. (sans merge-basej'ai 228 vs 171)
x'ES
21

Pour compléter la réponse de @ artfulrobot, si vous souhaitez afficher les fichiers modifiés entre deux branches:

git diff --name-status mybranch..myotherbranch

Faites attention à la priorité. Si vous placez la branche la plus récente en premier, elle affichera les fichiers comme supprimés plutôt que ajoutés.

L'ajout d'un greppeut affiner davantage les choses:

git diff --name-status mybranch..myotherbranch | grep "A\t"

Cela n'affichera alors que les fichiers ajoutés myotherbranch.

Max MacLeod
la source
4
Les regex sont sympas et peuvent en effet presque tout faire. Dans ce cas, cependant, il y a aussi --diff-filterqui donne cette fonctionnalité en natif, ce qui signifie moins de chances de résultats incorrects (par exemple, faux positifs)
Jasper
8

Ajoutez l'alias ci-dessous à votre ~/.bash_profile, puis exécutez source ~/.bash_profile; maintenant, à tout moment, vous devez voir les fichiers mis à jour dans le dernier commit, exécuté, à showfilespartir de votre référentiel git.

alias showfiles='git show --pretty="format:" --name-only'
Zorayr
la source
2
Ou git config --global alias.showfiles 'show --pretty="format:" --name-only'à faire git showfiles.
cgmb
7

Cela montrera les changements dans les fichiers:

git diff --word-diff SHA1 SHA2
Julio Marins
la source
5

Notez également que si vous souhaitez simplement voir les fichiers modifiés entre le dernier commit et celui qui le précède. Cela fonctionne bien:git show --name-only

Parris
la source
3

Utilisez git log --pretty = oneline> C: \ filename.log

qui enregistrera uniquement une ligne (--pretty = en ligne) qui est le nom du fichier modifié. Enregistre également tous les détails dans votre fichier de sortie.

Agni
la source
git log --pretty=onelinene me donne que le SHA et le message de commit en utilisant git 2.10.1
damd
3

Comme l'a dit artfulrobot dans sa réponse:

git diff --name-status [SHA1 [SHA2]]

Mon exemple:

git diff --name-status 78a09k12067c24d8f117886c4723ccf111af4997 
4b95d595812211553070046bf2ebd807c0862cca
M       views/layouts/default.ctp
M       webroot/css/theme.css
A       webroot/img/theme/logo.png
Jaime Montoya
la source
3

Juste pour quelqu'un qui doit se concentrer uniquement sur les fichiers Java, voici ma solution:

 git diff --name-status SHA1 SHA2 | grep '\.java$'
K. Symbole
la source
1

Ce qui suit fonctionne bien pour moi:

$ git show --name-only --format=tformat: SHA1..SHA2

Il peut également être utilisé avec un seul commit:

git show --name-only --format=tformat: SHA1

qui est pratique pour une utilisation dans Jenkins où vous êtes fourni avec une liste de SHA changeSet, et que vous souhaitez les parcourir pour voir quels fichiers ont été modifiés.

Ceci est similaire à quelques réponses ci-dessus, mais en utilisant tformat:plutôt format:qu'enlève l'espace séparateur entre les validations.

store de motoneige
la source
0

Basé sur git diff --name-statusj'ai écrit l' extension git-diffview git qui rend une vue arborescente hiérarchique de ce qui a changé entre deux chemins.

Bernard Opic
la source