git: diff entre le fichier dans le référentiel local et l'origine

190

Je veux trouver les différences entre un fichier que j'ai dans mon dépôt local et ce qui se trouve dans le origin master.

Je sais qu'il y en a git diff, mais je veux juste l'isoler jusqu'à ce fichier en particulier.

Pour simplifier, disons que le fichier est nommé file1.txtet qu'il a un chemin de fichier local = [local_path]et à l'origine, il a filepath = [remote-path].

Quelle serait la commande git que je dois taper?

EDIT: Merci à tous pour votre contribution, il a été très perspicace. Pour ceux qui utilisent Eclipse (ce que je suis et j'aurais dû dire plus tôt), je viens de découvrir que vous pouvez simplement faire un clic droit -> Comparer avec -> Branche, Tag ou Référence -> sélectionner la version appropriée et le tour est joué.

RechercheAlpha
la source
[Chemin-distant] est-il différent de [chemin-local]?
Code-Apprentice
Je viens de remarquer votre modification. N'hésitez pas à le poster comme réponse.
Code-Apprentice
qu'est-ce que vous appelez "maître d'origine"?
la méthode egit eclipse est bonne
user1169587

Réponses:

251

Si [remote-path]et [local-path]sont les mêmes, vous pouvez faire

$ git fetch origin master
$ git diff origin/master -- [local-path]

Remarque 1: La deuxième commande ci-dessus sera comparée à la branche de suivi à distance stockée localement. La commande fetch est requise pour mettre à jour la branche de suivi à distance afin qu'elle soit synchronisée avec le contenu du serveur distant. Alternativement, vous pouvez simplement faire

$ git diff master:<path-or-file-name>

Remarque 2: master peut être remplacé dans les exemples ci-dessus par n'importe quel nom de branche

Code-Apprenti
la source
15
Et peut même omettre le chemin local s'il s'agit du répertoire actuel.
Tony Wall
19
Pour ceux extrêmement noob comme moi, voici un exemple:git diff master:README.md -- README.md
fabriciorissetto
24
En fait, voici un meilleur exemple:git diff origin/master -- README.md
JDiMatteo
Je n'ai pas pu faire à la git fetch masterplace d'occasion git fetch .(origine / master ne fonctionnait pas non plus) Mais le reste fonctionnait bien.
rob
1
@rob Vous êtes le premier à signaler mon erreur. Ça devrait être git fetch **origin**.
Code-Apprentice
114

Pour afficher les différences entre le fichier distant et le fichier local:

git diff remotename/branchname:remote/path/file1.txt local/path/file1.txt

Pour voir les différences dans l'autre sens:

git diff HEAD:local/path/file1.txt remotename/branchname:remote/path/file1.txt

En gros, vous pouvez comparer deux fichiers n'importe où en utilisant cette notation:

git diff ref1:path/to/file1 ref2:path/to/file2

Comme d'habitude, ref1il ref2peut s'agir de noms de branche, de nom distant / nom de branche, de SHA de validation, etc.

Janos
la source
17

Pour comparer un référentiel local avec un référentiel distant, utilisez simplement la syntaxe ci-dessous:

git diff @{upstream}
Ratna Halder
la source
2

Pour cela, j'ai écrit un script bash:

#set -x 
branchname=`git branch | grep -F '*' |  awk '{print $2}'`
echo $branchname
git fetch origin ${branchname}
for file in `git status | awk '{if ($1 == "modified:") print $2;}'`
do
echo "PLEASE CHECK OUT GIT DIFF FOR "$file 
git difftool  FETCH_HEAD $file ;
done

Dans le script ci-dessus, je récupère la branche principale distante (pas nécessairement sa branche principale ANY) FETCH_HEAD, puis je fais une liste de mon fichier modifié uniquement et je compare les fichiers modifiés à git difftool.

Il y en a beaucoup difftoolpris en charge par git, j'ai configuré Meld Diff Viewerpour une bonne comparaison GUI.
À partir du script ci-dessus, j'ai une connaissance préalable des changements effectués par d'autres équipes dans le même fichier, avant de suivre les étapes git untrack-->staged-->commitqui m'aident à éviter de résoudre les conflits de fusion inutiles avec l'équipe distante ou de créer une nouvelle branche locale et de comparer et de fusionner sur la branche principale.

adg
la source
1

J'ai essayé quelques solutions, mais j'ai une solution simple comme celle-ci (vous êtes dans le dossier local):

#!/bin/bash
git fetch

var_local=`cat .git/refs/heads/master`
var_remote=`git log origin/master -1 | head -n1 | cut -d" " -f2`

if [ "$var_remote" = "$var_local" ]; then
    echo "Strings are equal." #1
else
    echo "Strings are not equal." #0 if you want
fi

Ensuite, vous avez comparé le dernier numéro de commit de git local et de git distant ...

animati
la source
0

La réponse complète à la question d'origine qui parlait d'un possible chemin différent sur local et distant est ci-dessous

  1. git fetch origin
  2. git diff master -- [local-path] origin/master -- [remote-path]

En supposant que le chemin local est docs / file1.txt et que le chemin distant est docs2 / file1.txt, utilisez git diff master -- docs/file1.txt origin/master -- docs2/file1.txt

Ceci est adapté de la page d'aide GitHub ici et de la réponse Code-Apprentice ci - dessus

ng10
la source