Comment afficher le fichier diff dans git avant de valider

444

Ça m'arrive souvent:

Je travaille sur quelques changements liés en même temps au cours d'une journée ou deux, et quand il est temps de s'engager, je finis par oublier ce qui a changé dans un fichier spécifique. (Ce n'est qu'un dépôt git personnel, donc je suis d'accord avec plus d'une mise à jour dans un commit.)

Existe-t-il un moyen de prévisualiser les modifications entre mon fichier local, qui est sur le point d'être archivé, et le dernier commit pour ce fichier?

Quelque chose comme:

git diff --changed /myfile.txt

Et cela imprimerait quelque chose comme:

line 23
  (last commit): var = 2+2
  (current):     var = myfunction() + 2

line 149
  (last commit): return var
  (current):     return var / 7

De cette façon, je pouvais rapidement voir ce que j'avais fait dans ce fichier depuis son dernier enregistrement.

Sauce McBoss
la source

Réponses:

732

Si vous voulez voir ce que vous n'avez pas git addencore édité:

git diff myfile.txt

ou si vous voulez voir les changements déjà ajoutés

git diff --cached myfile.txt
ambre
la source
20
check out git add -p. Passez en revue chaque modification, approuvez sélectivement les modifications apportées à la scène, annulez à tout moment si vous changez d'avis, et même modifiez en ligne un morceau. Je ne m'en suis jamais git addprivé.
Kyle Baker
2
comment pouvez-vous quitter le fichier?
Kick Buttowski
3
@Kick Essayez d'appuyer surq
wjandrea
aussi, si vous voulez supprimer les préfixes stupides 'a /' et 'b /' dans le résultat diff, vous pouvez définir git config --global diff.noprefix true.
Liang
64
git diff HEAD file

vous montrera les modifications que vous avez ajoutées à votre arbre de travail depuis le dernier commit. Toutes les modifications (par étapes ou non par étapes) seront affichées.

ouah
la source
1
Votre solution fonctionne. Mais je suis un peu confus. HEAD pointe vers le dernier numéro de commit. Ainsi, lorsque nous ajoutons git, l'index du répertoire de travail est mis à jour et non le HEAD. Alors, comment cela montre-t-il la différence.
Mav55
17

Pour vérifier les différences locales:

git diff myfile.txt

ou vous pouvez utiliser un outil de comparaison (au cas où vous souhaiteriez annuler certaines modifications):

git difftool myfile.txt

Pour utiliser git difftoolplus efficacement, installez et utilisez votre outil GUI préféré tel que Meld, DiffMerge ou OpenDiff.

Remarque: Vous pouvez également utiliser .(au lieu du nom de fichier) pour voir les modifications actuelles du répertoire.

Afin de vérifier les changements pour chaque ligne, utilisez: git blamequi affichera quelle ligne a été validée dans quel commit.


Pour afficher le fichier réel avant la validation (où se mastertrouve votre branche), exécutez:

git show master:path/my_file
kenorb
la source
15

Avez-vous essayé l' option -v(ou --verbose) pour git commit? Il ajoute le diff du commit dans l'éditeur de messages.

vhallac
la source
Bonne réponse. Cela peut fournir des informations dans l'éditeur de validation, me permet de valider plus facilement. Existe-t-il un moyen de fermer la zone d'informations Changes not staged for commit:qui peut rendre l'éditeur de commit plus propre.
Radian Jheng
15

Une autre technique à considérer si vous souhaitez comparer un fichier au dernier commit qui est plus pédant:

git diff master myfile.txt

L'avantage de cette technique est que vous pouvez également comparer à l'avant-dernier commit avec:

git diff master^ myfile.txt

Et celui avant ça:

git diff master^^ myfile.txt

Vous pouvez également remplacer «~» pour le caractère caret «^» et «votre nom de branche» par «maître» si vous n'êtes pas sur la branche principale.

anisbet
la source
14

Je pense que c'est le cas d'utilisation parfait justifiant une interface graphique. - Bien que je comprenne parfaitement que cela peut également être réalisé assez bien dans la ligne de commande.

Personnellement, chacun de mes engagements, je le fais depuis le git-gui. Dans lequel je peux faire plusieurs commits atomiques avec des morceaux / lignes séparés s'il est logique de le faire.

Gut Gui permet de visualiser les diffs dans une interface colorée bien formatée, est plutôt léger. On dirait que c'est quelque chose que vous devriez aussi vérifier.

Lakshman Prasad
la source
Je suis d'accord - cela vous permet également d'éditer le message de validation tout en regardant le diff.
François
Bon à savoir, mais j'aimerais m'en tenir à CLI. J'ai utilisé quelques packages qui l'avaient, mais je suis passé à strictement terminal / vim pour mon flux de travail. Merci quand même.
Sauce McBoss
Oui, si vous vous en tenez à l'interface graphique, il y a beaucoup de fonctionnalités intéressantes comme git bisectcelle-ci qui ne sont pas vraiment accessibles.
NoBugs
2
Je suis d'accord - Il existe de nombreuses options pour lesquelles il est beaucoup plus rapide et plus logique d'utiliser la ligne de commande. Cependant, la prévisualisation des modifications n'en fait pas partie.
VitalyB
Il existe également des interfaces utilisateur de texte, qui s'exécutent dans le terminal. Une tig«interface en mode texte pour Git» mérite d'être vérifiée.
smido
11

Sur macOS, accédez au répertoire racine git et entrez git diff *

catanore
la source
4

La meilleure façon que j'ai trouvée, en plus d'utiliser une interface graphique de validation dédiée, est d'utiliser git difftool -d- Cela ouvre votre outil de comparaison en mode de comparaison de répertoires, en comparant HEAD avec le dossier sale actuel.

VitalyB
la source
exactement ce dont j'avais besoin. Merci
Ivan Ferrer Villa
3
git difftool -d HEAD filename.txt

Ceci montre une comparaison utilisant la fenêtre de fente de VI dans le terminal.

Tomachi
la source