Comment faire la différence entre les modifications locales non validées et l'origine

141

Disons que j'ai cloné un référentiel et commencé à modifier des fichiers. Je sais que si j'ai des modifications locales non validées, je peux faire un diff comme suit git diff test.txtet cela me montrera la différence entre la HEAD locale actuelle et les modifications modifiées et non validées dans le fichier. Si je valide ces modifications, je peux les comparer au référentiel d'origine en utilisantgit diff master origin/master

Mais existe-t-il un moyen de différencier les modifications locales avec le référentiel d'origine sur le serveur avant de les valider localement? J'ai essayé diverses permutations de git diff --cached master origin/mastersans succès .

Chaitanya
la source
Je voulais savoir à quel point mon fichier a changé depuis la dernière version validée sur mon local. La réponse à ma question était cette question. Merci!
Souvik Ghosh

Réponses:

133

Étant donné que le référentiel distant a été mis en cache via, git fetchil devrait être possible de comparer avec ces commits. Essayez ce qui suit:

$ git fetch origin
$ git diff origin/master
JJD
la source
5
Ah, excellent. La clé était de laisser le maître de côté. J'avais essayé une combinaison où je faisais une récupération avant, mais quand je l'ai fait, git diff master origin/masterc'était toujours la comparaison avec la version validée (évidente rétrospectivement). Mais en laissant de côté le maître compare maintenant les modifications locales à la version récupérée.
Chaitanya
@Chaitanya Bien, je pourrais vous aider. En fait, je trouve les différents styles que Git utilise un peu irritants: une fois qu'il faut écrire origin masteret ailleurs origin/master. Il y a encore du travail à faire, à mon humble avis.
JJD
Cela ne semble pas fonctionner: git diff origin/masterrenvoie le fatal: ambiguous argument 'origin/master': unknown revision or path not in the working tree.maître existe à l'origine, par exemple git fetch origin masterfonctionne bien,
mikemaccana
42

Je sais que ce n'est pas une réponse à la question exacte posée, mais j'ai trouvé cette question cherchant à différencier un fichier dans une branche et un fichier local non validé et j'ai pensé que je partagerais

Syntaxe:

git diff <commit-ish>:./ -- <path>

Exemples:

git diff origin/master:./ -- README.md
git diff HEAD^:./ -- README.md
git diff stash@{0}:./ -- README.md
git diff 1A2B3C4D:./ -- README.md

(Merci Eric Boehs pour un moyen de ne pas avoir à taper le nom de fichier deux fois)

Nate
la source
J'aime mieux la solution générale que la solution étroite et spécifique ci-dessus. Je partage l'esprit où tu as trouvé ça?
fbicknel
Je n'arrive pas à trouver la documentation sur les détails commit-ishet le séparateur de deux points. La documentation sur git-diff ne semble pas le mentionner. Je l'ai utilisé pendant si longtemps que je ne me souviens plus où je l'ai trouvé pour la première fois. Probablement des exemples d'autres personnes sur d'autres commandes et je viens d'expérimenter git-diff. J'ai bien peur qu'une autre réponsecommit-ish soit la meilleure que je puisse trouver pour le moment.
Nate
3
Une belle addition à ceci est git diff master:./ -- README.md. De cette façon, vous n'avez pas à taper README.mddeux fois et vous pouvez l'ajouter à un alias plus facilement.
Eric Boehs
Merci @EricBoehs, c'est une excellente suggestion.
Nate
1
Cette syntaxe ne fonctionne pas pour moi ... plutôt git diff master: -- README.mdla ./crée une /dev/nullsource plutôt que la branche à distance. Utilisation de la version 2.19.0 de git
rustyDev
21

Pour voir les modifications non par étapes (non ajoutées) des fichiers existants

git diff

Notez que cela ne suit pas les nouveaux fichiers. Pour voir les modifications par étapes et non validées

git diff --cached

pepestar
la source
9

Si vous souhaitez comparer des fichiers visuellement, vous pouvez utiliser:

git difftool

Il démarrera automatiquement votre application de comparaison pour chaque fichier modifié.

PS: Si vous n'avez pas défini d'application diff, vous pouvez le faire comme dans l'exemple ci-dessous (j'utilise Winmerge ):

git config --global merge.tool winmerge
git config --replace --global mergetool.winmerge.cmd "\"C:\Program Files (x86)\WinMerge\WinMergeU.exe\" -e -u -dl \"Base\" -dr \"Mine\" \"$LOCAL\" \"$REMOTE\" \"$MERGED\""
git config --global mergetool.prompt false
Caner
la source
ce changement prend-il effet immédiatement?
Dilip Raghunathan
Je suis juste curieux, comment est-ce lié à la question posée? Git difftool ne comparerait-il pas simplement les changements locaux avec le maître? Cependant, l'OP le souhaite entre les modifications locales et le maître distant.
infocloged le
De loin la solution la plus simple
Chris Johnson