git: diff między plikiem w lokalnym repozytorium i źródle

189

Chcę znaleźć różnice między plikiem, który mam w moim lokalnym repozytorium, a tym, co jest w pliku origin master .

Wiem, że tak git diff, ale chcę go tylko odizolować do tego konkretnego pliku.

Dla uproszczenia załóżmy, że plik ma nazwę file1.txti ma lokalną ścieżkę do pliku =, [local_path]aw źródle ma ścieżkę do pliku = [remote-path].

Jakie byłoby polecenie git, które muszę wpisać?

EDYCJA: Dziękuję wszystkim za wkład, który był bardzo wnikliwy. Dla tych, którzy używają Eclipse (którym jestem i powinienem był wcześniej powiedzieć) właśnie dowiedziałem się, że możesz po prostu kliknąć prawym przyciskiem myszy -> Porównaj z -> Oddział, Tag lub Odniesienie -> wybierz odpowiednią wersję i gotowe.

Szukam Alfa
źródło
Czy [ścieżka zdalna] różni się od [ścieżka lokalna]?
Czeladnik
Właśnie zauważyłem twoją edycję. Opublikuj go jako odpowiedź.
Code-Apprentice
co nazywacie „mistrzem pochodzenia”?
metoda ecitse egit jest dobra
użytkownik1169587

Odpowiedzi:

250

Jeśli [remote-path]i [local-path]są takie same, możesz to zrobić

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

Uwaga 1: Drugie polecenie powyżej porówna się z lokalnie przechowywaną gałęzią zdalnego śledzenia. Polecenie fetch jest wymagane do zaktualizowania gałęzi zdalnego śledzenia, aby była zsynchronizowana z zawartością zdalnego serwera. Możesz też po prostu zrobić

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

Uwaga 2: master w powyższych przykładach można zastąpić dowolną nazwą oddziału

Uczeń kodowy
źródło
15
I może nawet pominąć ścieżkę lokalną, jeśli jest to katalog bieżący.
Tony Wall
19
Dla tych niezwykle noobowych jak ja, oto przykład:git diff master:README.md -- README.md
fabriciorissetto
24
Oto lepszy przykład:git diff origin/master -- README.md
JDiMatteo,
Nie mogłem git fetch masterzamiast tego użyć git fetch .(pochodzenie / master też nie działało) Ale reszta działała dobrze.
rob
1
@rob Jesteś pierwszym, który zwrócił uwagę na mój błąd. Powinno być git fetch **origin**.
Czeladnik
114

Aby wyświetlić różnice między plikiem zdalnym a plikiem lokalnym:

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

Aby zobaczyć różnice w innym kierunku:

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

Zasadniczo możesz różnicować dowolne dwa pliki w dowolnym miejscu za pomocą tej notacji:

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

Jak zwykle ref1i ref2mogą to być nazwy gałęzi, nazwa zdalna / nazwa gałęzi, zatwierdzanie SHA itp.

janos
źródło
17

Aby porównać lokalne repozytorium ze zdalnym, po prostu użyj poniższej składni:

git diff @{upstream}
Ratna Halder
źródło
2

W tym celu napisałem skrypt 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

W powyższym skrypcie pobieram zdalną gałąź główną (niekoniecznie gałąź DOWOLNĄ) do FETCH_HEAD, a następnie tworzę listę tylko mojego zmodyfikowanego pliku i porównuję zmodyfikowane pliki git difftool.

Istnieje wiele difftoolobsługiwanych przez git, skonfigurowałem Meld Diff Viewerdla dobrego porównania GUI.
Z powyższego skryptu mam wcześniejszą wiedzę o zmianach wprowadzonych przez inne zespoły w tym samym pliku, zanim przejdę do etapów git, untrack-->staged-->commitktóre pomogą mi uniknąć niepotrzebnego rozwiązania konfliktu scalania ze zdalnym zespołem lub utworzenia nowego oddziału lokalnego i porównania i scalenia w głównym oddziale.

adg
źródło
1

Wypróbowałem kilka rozwiązań, ale myślę, że jest to łatwy sposób (jesteś w folderze lokalnym):

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

Następnie porównałeś numer ostatniego gita lokalnego i zdalnego gita ...

animati
źródło
0

Pełna odpowiedź na pierwotne pytanie, które mówiło o możliwej innej ścieżce lokalnej i zdalnej, znajduje się poniżej

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

Zakładając, że ścieżka lokalna to docs / plik1.txt, a ścieżka zdalna to docs2 / plik1.txt, użyj git diff master -- docs/file1.txt origin/master -- docs2/file1.txt

Jest to dostosowane ze strony pomocy GitHub tutaj i powyższej odpowiedzi Code-Apprentice

ng10
źródło