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 .


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

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)


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


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

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
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.