Comment voir les changements dans un commit Git?

1549

Quand je le fais, git diff COMMITje vois les changements entre ce commit et HEAD (pour autant que je sache), mais j'aimerais voir les changements qui ont été apportés par ce commit unique.

Je n'ai trouvé aucune option évidente sur diff/ logqui me donnera cette sortie.

laktak
la source
4
doublon possible de raccourci pour diff de git commit avec son parent?
Chris Maes

Réponses:

1975

Pour voir la différence pour un COMMIThachage particulier :

git diff COMMIT~ COMMITvous montrera la différence entre cet COMMITancêtre et le COMMIT. Voir les pages de manuel de git diff pour plus de détails sur la commande et gitrevisions sur la ~notation et ses amis.

Alternativement, git show COMMITfera quelque chose de très similaire. (Les données du commit, y compris ses différences - mais pas pour les commits de fusion.) Voir la page de manuel git show .

Nevik Rehnel
la source
17
Notez que les ^besoins doivent être cités dans les coques Thomson et Bourne (synonyme de |là-bas) et rcses dérivés (opérateur caret) et dans zshavec Extendedglob activé ( notopérateur globbing)
Stephane Chazelas
3
Notez que cela HEAD^implique le premier parent dans le cas où une validation a plusieurs parents (c.-à-d. Fusionner la validation).
Mansour
23
git diff COMMIT~ COMMITfonctionne pour moi, remarquez le tilde au lieu du curseur. J'utilise la version 2.6.1.windows.1 de git sur Windows 10.
Juuso Ohtonen
14
@tradetree: le mot COMMIT est censé être remplacé par le nom d'un commit, par exemple la somme SHA.
Nick Matteo
91
Je pense que git show est plus approprié pour cette question et devrait être la suggestion mentionnée en premier.
pypmannetjies du
497

Comme mentionné dans " Raccourci pour diff de git commit avec son parent? ", Vous pouvez également l'utiliser git diffavec:

git diff COMMIT^!

ou

git diff-tree -p COMMIT

Avec git show, vous auriez besoin (pour vous concentrer uniquement sur diff) de faire:

git show --color --pretty=format:%b $COMMIT

Le COMMITparamètre est un commit-ish :

Un objet commit ou un objet qui peut être déréférencé récursivement à un objet commit. Les éléments suivants sont tous des validations: un objet commit, un objet tag qui pointe vers un objet commit, un objet tag qui pointe vers un objet tag qui pointe vers un objet commit, etc.

Voir gitrevision "SPECIFYING REVISIONS" pour référencer un commit-ish.
Voir aussi " Que signifie tree-ish dans Git? ".

VonC
la source
371

Vous pouvez également essayer cette méthode simple:

git show <COMMIT>
Lakhan
la source
2
Il semble que cela fasse quelque chose de très différent
Variable misérable
3
Il affiche uniquement le message de validation. Pas la différence des changements de code appliqués pour cette validation.
k0pernikus
1
Oui? Enfin dans les dernières versions git ...
Davy
2
Cela devrait être la bonne réponse mise à jour
Scott Skiles
1
Cela devrait être la réponse.
Roel
77

git show affiche les modifications apportées lors de la validation la plus récente.

Équivalent à git show HEAD.

git show HEAD~1 vous ramène 1 commit.

Adam Salma
la source
45

Je fais habituellement:

git diff HEAD~1

Pour afficher les modifications concernant le dernier commit. Si vous avez plus de validations, augmentez simplement le nombre 1 du nombre de validations que vous souhaitez voir.

Alex
la source
34

Obtenez d'abord l'ID de validation à l'aide de,

git log #to list all

Ou

git log -p -1 #last one commit id

Copiez l'ID de validation.

Maintenant, nous utilisons deux méthodes pour répertorier les modifications d'un commit spécifique,

Méthode 1:

git diff commit_id^! #commit id something like this 1c6a6000asad012

Méthode 2:

git show commit_id
For example: git show 1c6a600a
Mohideen bin Mohammed
la source
2
Qu'est-ce que cela ^!signifie ??
Martín Coll
2
^! est l'abréviation de commit ^ .. commit, ce qui signifie qu'il exclura tous les parents et vérifiera la différence dans ce commit
Mohideen bin Mohammed
Je ne suis pas un expert mais j'ai un cas (avec plusieurs branches impliquées) où git log c ^! n'est pas exactement le même que git log c ^ .. c. En fait, c'est beaucoup mieux: git log c ^ .. c listait trop d'entrées alors que git log c ^! a fait la bonne chose, c'est donc ce que je cherchais depuis longtemps
user829755
32
git show <commit_sha>

Cela vous montrera ce qu'il y a dans ce commit. Je pense que vous pouvez faire une plage en mettant simplement un espace entre deux shas de validation.

git show <beginning_sha> <ending_sha>

ce qui est très utile si vous rebasez souvent parce que vos journaux de fonctionnalités seront tous consécutifs.

Iwnnay
la source
25

Depuis la page de manuel de git-diff (1) :

git diff [options] [<commit>] [--] [<path>…]
git diff [options] --cached [<commit>] [--] [<path>…]
git diff [options] <commit> <commit> [--] [<path>…]
git diff [options] <blob> <blob>
git diff [options] [--no-index] [--] <path> <path>

Utilisez le 3ème au milieu:

git diff [options] <parent-commit> <commit>

Également à partir de la même page de manuel, en bas, dans la section Exemples :

$ git diff HEAD^ HEAD      <3>

Comparez la version avant le dernier commit et le dernier commit.

Certes, il est libellé un peu confus, ce serait moins déroutant que

Comparez le commit le plus récent avec le commit précédent.


la source
3
Votre reformulation s'appliquerait à git diff HEAD HEAD^.
Richard
git diff HEAD ^ HEAD n'affiche aucun changement.
user3690202
@ user3690202, ce qui implique qu'il n'y a aucun changement à afficher. Est-ce bien le cas?
Comment ne peut-il y avoir aucun changement à afficher? Si vous voulez voir le dernier commit, à moins qu'il ne s'agisse d'un tout nouveau dépôt, il y aura des changements à afficher?
user3690202
@ user3690202 il est possible de faire un "commit vide" avec Git qui ne contient en fait aucune modification du parent, bien qu'il existe une sauvegarde intégrée qui vérifie et empêche cela, bien qu'elle soit remplaçable avec une option de ligne de commande. Je doute que vous créiez intentionnellement un commit vide, donc une autre possibilité est que vous ayez en quelque sorte une conversion de fin de ligne pré-commit sur (ou d'autres trucs drôles d'espaces blancs) qui incite Git à penser qu'aucun changement n'a réellement été fait. Sur quelle plateforme utilisez-vous Git?
22

Ce qui suit semble faire le travail; Je l'utilise pour montrer ce qui a été apporté par une fusion.

git whatchanged -m -n 1 -p <SHA-1 hash of merge commit>
MichaelMoser
la source
Cela fonctionnerait-il aussi avec git log? (à cause de stackoverflow.com/a/18585297/6309 )
VonC
16

Une autre possibilité:

git log -p COMMIT -1
John_West
la source
1
@GrantMcLean Oui, et c'est déjà dans la réponse la plus élevée, donc je ne le mentionne pas.
John_West
11

Vous pouvez utiliser git diff HEAD HEAD^1pour voir le diff avec le commit parent.

Si vous voulez seulement voir la liste des fichiers, ajoutez l' --statoption.

Irshu
la source
C'est ce que tu veux dire, git diff HEAD ^ 1 HEAD
Shibir Basak
Notez que cela montrera ce que vous avez ajouté comme supprimé, car cela fera une comparaison inverse. La façon dont vous devez lire la diffcommande est: que devrais-je changer dans le fichier pour passer de commit HEADà commit HEAD^1?
brainplot
9
git difftool COMMIT^ <commit hash>

est également possible si vous avez configuré votre difftool.

Voir ici comment configurer difftool Ou la page de manuel ici

De plus, vous pouvez utiliser git diff-tree --no-commit-id --name-only -r <commit hash>pour voir quels fichiers ont été modifiés / validés dans un hachage de validation

Chand Priyankara
la source
9

J'aime la commande ci-dessous pour comparer un commit spécifique et son dernier commit:

git diff <commit-hash>^-

Exemple:

git diff cd1b3f485^-
starcwl
la source
6

Pour voir l'auteur et l'heure par validation, utilisez git show COMMIT. Ce qui se traduira par quelque chose comme ceci:

commit 13414df70354678b1b9304ebe4b6d204810f867e
Merge: a2a2894 3a1ba8f
Author: You <[email protected]>
Date:   Fri Jul 24 17:46:42 2015 -0700

     Merge remote-tracking branch 'origin/your-feature'

Si vous souhaitez voir quels fichiers ont été modifiés, exécutez ce qui suit avec les valeurs de la ligne de fusion ci-dessus git diff --stat a2a2894 3a1ba8f .

Si vous voulez voir le diff réel, exécutez git --stat a2a2894 3a1ba8f

Nikita G.
la source
Msgstr "Si vous voulez voir la différence réelle, exécutez git --stat a2a2894 3a1ba8f". Je pense que tu veux dire git diff a2a2894 3a1ba8fou bien unknown option: --stat.
Fruit
5

Pour vérifier les modifications complètes:

  git diff <commit_Id_1> <commit_Id_2>

Pour vérifier uniquement les fichiers modifiés / ajoutés / supprimés:

  git diff <commit_Id_1> <commit_Id_2> --name-only

REMARQUE : pour vérifier les différences sans validation entre les deux, vous n'avez pas besoin de mettre les ID de validation.

bit_cracker007
la source
4

J'utilise Git version 2.6.1.windows.1 sur Windows 10, j'ai donc eu besoin d'une légère modification de la réponse de Nevik (tilde au lieu de caret):

git diff COMMIT~ COMMIT

Une autre option consiste à citer le curseur:

git diff "COMMIT^" COMMIT
Juuso Ohtonen
la source
3

Cette commande vous obtiendra le hachage de validation parent Git:

git log -n 2 <commit-hash>

Après ça git diff-tool <commit-hash> <parent-commit-hash>

Exemple:

bonnie@bonnie ~/ $ git log -n 2 7f65b9a9d3820525766fcba285b3c678e889fe3

commit 7f65b9a9d3820525766fcba285b3c678e889fe3b
Author: souparno <[email protected]>
Date:   Mon Jul 25 13:17:07 2016 +0530

CSS changed to maintain the aspect ratio of the channel logos and to fit them properly.

commit c3a61f17e14e2b80cf64b172a45f1b4826ee291f
Author: souparno <[email protected]>
Date:   Mon Jul 25 11:28:09 2016 +0530

The ratio of the height to width of the channel images are maintained.

Après ça

git difftool 7f65b9a9d3820525766fcba285b3c678e889fe3b c3a61f17e14e2b80cf64b172a45f1b4826ee291f
souparno majumder
la source
2

Si vous souhaitez simplement voir les modifications dans le dernier commit, vous le git showrecevrez simplement .

MyrionSC2
la source
1

En cas de vérification du changement de source dans une vue graphique,

$gitk (Mention your commit id here)

par exemple:

$gitk HEAD~1 
user272390
la source
Je ne comprends pas pourquoi cette réponse a été rejetée. Je suis d'accord que la ligne de commande et les choses basées sur du texte sont le chemin à parcourir, mais gitk donne beaucoup d'informations utiles.
ShellFish