diff copie de travail actuelle d'un fichier avec la copie validée d'une autre branche

158

J'ai un repo avec un fichier foodans la branche principale. Je suis passé à la branche bar et ai apporté quelques modifications à foo. Comment puis-je maintenant exécuter un git diffentre cette copie (qui n'est pas encore validée) et la copie de la branche principale?

Dogbert
la source

Réponses:

151

Ce qui suit fonctionne pour moi:

git diff master:foo foo

Dans le passé, cela peut avoir été:

git diff foo master:foo

Mark Longair
la source
9
Chaque fois que je vois une de vos réponses concernant git diff, je pense toujours à stackoverflow.com/questions/5256249/git-diff-doesnt-show-enough/…
VonC
@VonC: merci, c'est bien de savoir que cela valait la peine de les dessiner :) Au fait, comprenez-vous la bizarrerie avec laquelle j'ai mis à jour ma réponse?
Mark Longair
2
Avez-vous essayé avec un --pour séparer les paramètres des arguments de chemin? git diff -- master:foo foo
VonC le
1
Sur la version 1.8, git diff -- master:foo foone fonctionne pas - il semble traiter l'argument master:foocomme un nom de fichier inexistant (et l'ignore) au lieu d'un fichier dans une branche. Essayez de changer les 2 derniers arguments - si cela a fonctionné, la comparaison diff devrait être inversée, mais la sortie ne change pas.
Kelvin le
9
Pour moi, c'est le contraire - je peux faire git diff master:foo foomais pas l'inverse. Je ne comprends pas non plus. Avec git 1.7.9.5 / Ubuntu 12.04, je peux au moins faire git diff -R master:foo foopour obtenir le diff que je veux réellement. Quand j'essaye cela avec msysgit 1.9.4 / Windows 7 x64 je reçois fatal: unable to read 0000000000000000000000000000000000000000. Sans -Rj'obtiens le même message d'erreur que vous avec git 1.7.9.5, mais avec 1.9.4 j'obtiens fatal: master:foo: no such path in the working tree.
JMM
100

Vous essayez de comparer votre arbre de travail avec un nom de branche particulier, vous voulez donc ceci:

git diff master -- foo

Qui est de cette forme de git-diff (voir la page de manuel git-diff)

   git diff [--options] <commit> [--] [<path>...]
       This form is to view the changes you have in your working tree
       relative to the named <commit>. You can use HEAD to compare it with
       the latest commit, or a branch name to compare with the tip of a
       different branch.

Pour info, il existe également une option --cached(aka --staged) pour afficher le diff de ce que vous avez mis en scène, plutôt que tout dans votre arbre de travail:

   git diff [--options] --cached [<commit>] [--] [<path>...]
       This form is to view the changes you staged for the next commit
       relative to the named <commit>.
       ...
       --staged is a synonym of --cached.
Jordan Brough
la source
2
Merci. Je ne sais pas pourquoi, mais seule cette réponse a fonctionné pour moi avec git 1.8.1 sous Linux.
srking le
Excellent merci. Je me suis accroché à vouloir inclure le nom de ma branche actuelle dans la commande diff, mais je vois que ce n'est pas nécessaire.
yoyo
Cela a fonctionné pour moi il y a quelques mois, mais ne semble pas l'être maintenant. Actuellement, je suis à la version 2.7.4 de git (Apple Git-66); Je ne sais pas ce que j'avais avant.
hBrent
@hBrent cela fonctionne toujours pour moi sur OSX 10.11 avec git 2.7.3. Voici un exemple de dépôt rapide avec des instructions si cela est utile: github.com/jordan-brough/git-diff-test
Jordan Brough
Merci @JordanBrough.
hBrent le
14

Aussi: git diff master..feature foo

Puisque git diff foo master:foo ne fonctionne pas sur les répertoires pour moi.

ArtBIT
la source
Moi non plus. Est-ce une chose Windows?
Scott Stafford
@ScottStafford Je suis sur Ubuntu, donc non, il ne semble pas que ce soit juste une chose Windows.
ArtBIT
Fonctionne pour moi tant que je donne explicitement les deux noms de branche (Windows) git diff branch1:foo master:foo
Meep
12
git difftool tag/branch filename
Adir
la source
C'est la seule réponse qui a fonctionné pour moi pour la comparaison entre une copie de travail locale d'un fichier et cette version de fichier dans un référentiel distant (pas "origine"). Merci, Adir et Baz
Souris
git difftooln'a pas d' -voption selon les documents git-scm.com/docs/git-difftool . Voulez-vous dire -y?
ks1322
10
git diff mybranch master -- file

devrait aussi fonctionner

Naoise doré
la source
4
Cela ne fonctionne que pour les fichiers validés dans mybranch, pas pour la copie de travail actuelle du fichier.
yoyo
que signifie "-" ci
Pushparaj
Cela permet de comparer dans les deux sens: git diff deployment master -- fileet git diff master deployment -- filefonctionnent comme prévu avec 2 branches quelconques .
viktorkho
0

Pour voir les changements locaux par rapport à votre succursale actuelle

git diff .

Pour voir les modifications locales comparées à toute autre branche existante

git diff <branch-name> .

Pour voir les modifications d'un fichier particulier

git diff <branch-name> -- <file-path>

Assurez-vous de courir git fetchau début.

kta
la source