git: diff tra file nel repository locale e origine


190

Voglio trovare le differenze tra un file che ho nel mio repository locale rispetto a quello che è nel file origin master.

So che esiste git diff, tuttavia voglio solo isolarlo fino a questo particolare file.

Per semplicità diciamo che il file è chiamato file1.txte ha un file locale path = [local_path]e nell'origine ha filepath = [remote-path].

Quale sarebbe il comando git che devo digitare?

EDIT: Grazie a tutti per il vostro contributo è stato molto perspicace. Per quelli che stanno usando Eclipse (che io sono e avrei dovuto dichiarare prima) ho appena scoperto che puoi semplicemente fare clic con il pulsante destro del mouse -> Confronta con -> Branch, Tag o Reference -> selezionare la versione appropriata e il gioco è fatto.


[Percorso remoto] è diverso da [percorso locale]?
Apprendista di codice

Ho appena notato la tua modifica. Sentiti libero di pubblicarlo come risposta.
Apprendista di codice

come si chiama "origin master"?

il metodo eclipse egit è buono
user1169587

Risposte:


251

Se [remote-path]e [local-path]sono gli stessi, puoi farlo

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

Nota 1: il secondo comando sopra verrà confrontato con il ramo di tracciamento remoto memorizzato localmente. Il comando fetch è necessario per aggiornare il ramo di tracciamento remoto in modo che sia sincronizzato con i contenuti del server remoto. In alternativa, puoi semplicemente farlo

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

Nota 2: master può essere sostituito negli esempi precedenti con qualsiasi nome di ramo


15
E può anche omettere il percorso locale se questa è la directory corrente.
Tony Wall,

19
Per quelli estremamente rumorosi come me, ecco un esempio:git diff master:README.md -- README.md
fabriciorissetto,

24
In realtà, ecco un esempio migliore:git diff origin/master -- README.md
JDiMatteo

Non ho potuto fare git fetch masterinvece usato git fetch .(origin / master non ha funzionato neanche) Ma il resto ha funzionato bene.
rapina il

1
@rob Sei il primo a sottolineare il mio errore. Dovrebbe essere git fetch **origin**.
Apprendista di codice

114

Per visualizzare le differenze che vanno dal file remoto al file locale:

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

Per visualizzare le differenze nell'altra direzione:

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

Fondamentalmente puoi diffondere due file qualsiasi ovunque usando questa notazione:

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

Come al solito, ref1e ref2potrebbero essere nomi di filiali, nome remoto / nome filiale, commit SHA, ecc.


17

Per confrontare un repository locale con uno remoto, è sufficiente utilizzare la sintassi seguente:

git diff @{upstream}

2

Per questo ho scritto uno 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

Nello script sopra, prendo il ramo principale remoto (non necessario il suo ramo master QUALSIASI ramo) FETCH_HEAD, quindi faccio un elenco del mio file modificato e confronta i file modificati con git difftool.

Ci sono molti difftoolsupportati da Git, ho configurato Meld Diff Viewerper un buon confronto con la GUI.
Dallo script di cui sopra, ho una conoscenza preliminare delle modifiche apportate da altri team nello stesso file, prima di seguire le fasi git untrack-->staged-->commitche mi aiutano a evitare inutili risoluzioni unire conflitti con il team remoto o creare un nuovo ramo locale e confrontare e unire il ramo principale.


1

Ho provato un paio di soluzioni, ma in modo semplice (sei nella cartella locale):

#!/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

Quindi hai confrontato il numero dell'ultimo commit di git locale e git remoto ....


0

Di seguito è riportata la risposta completa alla domanda originale che parlava di un possibile percorso diverso su locale e remoto

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

Supponendo che il percorso locale sia docs / file1.txt e il percorso remoto sia docs2 / file1.txt, utilizzare git diff master -- docs/file1.txt origin/master -- docs2/file1.txt

Questo è adattato dalla pagina di aiuto di GitHub qui e dalla risposta di Code-Apprentice sopra

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.