2570 votes

Comment lister uniquement les noms des fichiers qui ont changé entre deux commits ?

J'ai un tas de commits dans le référentiel. Je veux voir une liste des fichiers modifiés entre deux commits - de SHA1 a SHA2 .

Quelle commande dois-je utiliser ?

3 votes

Pour un commit et son parent : stackoverflow.com/questions/424071/

1 votes

Vous devriez changer le titre de la question... vous ne voulez pas lister les noms de fichiers qui ont changé... vous voulez lister les noms des fichiers qui ont changé. Notez qu'il est possible de changer le nom des fichiers sans modifier leur contenu.

3434voto

Peter Points 38320
git diff --name-only SHA1 SHA2

où il suffit d'inclure suffisamment de hachage 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 dernier (ou à peu près).

189 votes

Cela fonctionne aussi pour git show. git show --name-only SHA1 .

110 votes

git diff --name-status [TAG|SHA1] montre aussi quelles opérations ont été faites sur les fichiers

2 votes

Vous pouvez aussi faire : git diff --name-only HEAD@{3} HEAD@{0} pour les commits exacts que vous voulez comparer.

571voto

artfulrobot Points 3283
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 commits sont listés après le message de commit, afin que vous puissiez voir quand un fichier a été modifié.

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

  • 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]

Drapeaux d'état des fichiers :

Drapeau

Nom

Signification

M

modifié

Le fichier a été modifié

C

copy-edit

Le fichier a été copié et modifié

R

rename-edit

Le fichier a été renommé et modifié

A

ajouté

Le fichier a été ajouté

D

supprimé

Le fichier a été supprimé

U

non immergé

Le fichier a des conflits après une fusion

0 votes

J'ai dit git diff --name-status et cela a donné le 'fichier ajouté'.

1 votes

Pour git log, il doit y avoir deux points entre les SHA, comme SHA1..SHA2, et le second SHA n'est pas optionnel, donc il devrait ressembler à ceci : git log --name-status --oneline [SHA1..SHA2]

0 votes

Existe-t-il un moyen d'exclure certains fichiers ou certains types de fichiers ?

146voto

leeyuiwah Points 51

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 existe également --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(-)

16 votes

La réponse acceptée est correcte, mais celle-ci est super utile et vous donne une petite information supplémentaire. Merci !

3 votes

Je suis d'accord pour dire que cette réponse est plus utile car elle contient les différentes statistiques.

73voto

Tim James Points 960

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

git diff --name-only `git merge-base origin/master HEAD`

1 votes

C'était vraiment utile ! J'aimerais pouvoir dire simplement git diffstatus master ou similaire, qui déclenche ce qui précède.

3 votes

Ou git show --pretty=format: --name-only origin/master.. .

0 votes

Vous ne pourrez peut-être pas en faire un alias git, mais vous pourrez certainement le mettre dans votre .bashrc.

33voto

Max MacLeod Points 8425

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

git diff --name-status mybranch..myotherbranch

Faites attention à la préséance. Si vous placez la branche la plus récente en premier, les fichiers seront affichés comme supprimés plutôt qu'ajoutés.

Ajout d'un grep peut affiner les choses :

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

Cela ne montrera alors que les fichiers ajoutés dans myotherbranch .

6 votes

Les regex sont agréables et peuvent en effet faire presque tout. Dans ce cas, cependant, il y a aussi --diff-filter qui offre cette fonctionnalité de manière native, ce qui réduit les risques de résultats incorrects (faux positifs, par exemple).

0 votes

Cela ne fonctionnera pas s'il y a "A\t" dans les noms de fichiers. Vous devez grep "^A\t"

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X