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?

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


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.

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.


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

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


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.

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.