Recherche de différences entre la version actuelle et la dernière version


670

En utilisant Git, comment pouvez-vous trouver la différence entre la version actuelle et la dernière?

git diff last version:HEAD

1
Si vous utilisez GitHub pour l'emplacement cloud de votre référentiel, c'est très simple: accédez à votre projet et cliquez sur la rubrique "commits" dans le tableau qui affiche votre projet
David Lundquist

1
La signification de «version actuelle et dernière» devrait vraiment être clarifiée dans la question.
faintsignal

Réponses:


1171

Je ne comprends pas vraiment le sens de "dernière version".

Comme le commit précédent est accessible avec HEAD ^, je pense que vous cherchez quelque chose comme:

git diff HEAD^ HEAD

Depuis Git 1.8.5, @est un alias pour HEAD, vous pouvez donc utiliser:

git diff @~..@

Les éléments suivants fonctionneront également:

git show

Si vous voulez connaître la différence entre head et n'importe quel commit, vous pouvez utiliser:

git diff commit_id HEAD

Et cela lancera votre outil de diff visuel (s'il est configuré):

git difftool HEAD^ HEAD

Étant donné que la comparaison avec HEAD est par défaut, vous pouvez l'omettre (comme indiqué par Orient ):

git diff @^
git diff HEAD^
git diff commit_id

Avertissements

  • @ScottF et @Panzercrisis expliquent dans les commentaires que sous Windows le ~caractère doit être utilisé à la place de ^.

Je voulais quelque chose comme la version engagée et la version avant elle ... git diff head head-1
Rajeev

7
Depuis Git 1.8.5, @est un alias pour HEAD. Et puisque ~et ^sont les mêmes lorsque l'on ne revient qu'à un seul commit, je trouve git diff @~..@beaucoup plus facile à taper.
Andrew

80
@Andrew git showest encore plus facile, car @~..@c'est la chose par défaut à afficher.
amalloy

3
git showimprime simplement le message de validation, il ne génère pas de différence des modifications spécifiques, au moins dans Git 2.5.4 (Apple Git-61), ce ne serait donc pas une réponse à la question de l'OP.
user1944491

1
Le problème git showest que si HEADest un commit de fusion, vous n'obtiendrez pas ce que vous attendez car le commit de fusion lui-même peut ne pas avoir de changements lui-même. git diff HEAD^ HEADmontrera les changements réels entre les versions
RubenLaguna

158

En supposant que «version actuelle» est le répertoire de travail (modifications non validées) et «dernière version» est HEAD(dernières modifications validées pour la branche actuelle), faites simplement

git diff HEAD

Le crédit pour ce qui suit va à l'utilisateur Cerran.

Et si vous sautez toujours la zone de transit -alorsque vous vous engagez, vous pouvez simplement utiliser git diff.

Sommaire

  1. git diff affiche les modifications non mises en scène.
  2. git diff --cached montre les changements par étapes.
  3. git diff HEAD affiche toutes les modifications (échelonnées et non échelonnées).

Source: git-diff (1) Page du manuel - Cerran


16
Et si vous sautez toujours la zone de transit -alorsque vous vous engagez, vous pouvez simplement utiliser git diff. <1> git diffaffiche les modifications non mises en scène . <2> git diff --cachedmontre les changements par étapes . <3> git diff HEADaffiche toutes les modifications (échelonnées et non échelonnées). Source: git-diff (1) Page du manuel
Cerran

1
Cela devrait être la réponse acceptée car elle répond à l'intention de la question.
tgoneil

Quel est le nom de "la version actuelle non mise en scène" dans git? Y a-t-il vraiment un nom?
Mathieu CAROFF

118

Comme indiqué sur un commentaire par amalloy , si par "versions actuelles et dernières" vous voulez dire le dernier commit et le commit avant cela, vous pouvez simplement utiliser

git show

5
C'est ce que je cherchais. Très bonne réponse.
CodeManiak

12
Utilisez cette option git show HEAD~1pour afficher la dernière validation, et git show HEAD~2, etc. pour les anciennes validations . Afficher un seul fichier via git show HEAD~2 my_file.
Florian Brucker

60

Différence entre le dernier mais un commit et le dernier commit (plus l'état actuel, le cas échéant):

git diff HEAD~

ou même (plus facile à taper)

git diff @~

@est le synonim HEADde la branche courante et ~signifie "donnez-moi le parent de la révision mentionnée".


J'aime bien git diff HEAD^(plutôt que la HEAD~forme équivalente ). C'est un peu plus facile à retenir pour un "vieux con" comme moi ;-)
sxc731

3
La carotte est un problème dans certains terminaux. Agréable d'avoir l'option
light24bulbs

1
La réponse pourrait être améliorée en expliquant ce ~que @signifient et signifient.
Bob Stein

1
Si nous voulons simplement vérifier ce qui est validé lors de la dernière validation, ne l'utilisez pas (car les changements sales affectent le diff). Une syntaxe plus courte diff HEAD^ HEADdevrait vraiment l' être git diff @^!. Voir git-scm.com/docs/gitrevisions pourr1^!
Johnny Wong

@JohnnyWong Merci pour la clarification. J'ai mentionné "l'état actuel" pour ne pas confondre les lecteurs.
Tomilov Anatoliy

53

Vous pouvez aussi le faire de cette façon:

Comparer avec le commit précédent

git diff --name-status HEAD~1..HEAD

Comparer avec les deux validations actuelles et précédentes

git diff --name-status HEAD~2..HEAD

16

Utilisez simplement le cacheddrapeau si vous avez ajouté, mais ne vous êtes pas encore engagé:

git diff --cached --color

1
C'est exactement ce que je cherchais lorsque j'ai trouvé cette question. Merci!
William Rogers

7

Rapide et simple, en supposant que vous êtes dans le maître:

    git diff (checkout_id):file.txt file.txt

Exemple:

    git diff asdfioei91819280din198:file.txt file.txt

4

Tout d'abord, utilisez " git log" pour répertorier les journaux du référentiel.

Maintenant, sélectionnez les deux ID de validation, relatifs aux deux validations. Vous voulez voir les différences ( exemple - Top commit le plus et certains commit plus ancien (selon votre attente de la version actuelle et une ancienne version) ).

Ensuite, utilisez:

git diff <commit_id1> <commit_id2>

ou

git difftool <commit_id1> <commit_id2>

3

Si la validation supérieure est pointée par HEAD, vous pouvez faire quelque chose comme ceci:

commit1 -> HEAD
commit2 -> HEAD~1
commit3 -> HEAD~2

Différence entre le premier et le deuxième commit:

git diff HEAD~1 HEAD

Différence entre le premier et le troisième commit:

git diff HEAD~2 HEAD

Différence entre le deuxième et le troisième commit:

git diff HEAD~2 HEAD~1

Etc...


2

J'utilise Bitbucket avec l' IDE Eclipse avec le plugin Eclipse EGit installé.

Je compare un fichier de n'importe quelle version de son histoire (comme SVN ).

Menu Explorateur de projets → Fichier → clic droit → ÉquipeAfficher dans l'historique .

Cela apportera l'historique de toutes les modifications sur ce fichier. Maintenant, Ctrlcliquez sur et sélectionnez deux versions → "Comparer les unes aux autres" .


2

Cela fonctionnera également pour les balises (supprimez le 'uniq' ci-dessous et d'autres parties si vous avez besoin de voir toutes les modifications):

 git diff v1.58 HEAD 

Ce qui suit est le même, et cela pourrait être utile pour l'intégration continue (CI) pour les microservices dans un référentiel monolithique:

git diff v1.58 HEAD  --name-only | sort -u | awk 'BEGIN {FS="/"} {print $1}' | uniq
<Folder Name> 

(Crédit - https://dzone.com/articles/build-test-and-deploy-apps-independently-from-a-mo )

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.