Jak porównać lokalną gałąź git ze zdalną gałęzią?

1049

Jak mogę zobaczyć diffpomiędzy oddziałem lokalnym a oddziałem zdalnym?

mrblah
źródło
5
To pytanie zostało zadane ponownie później. Ma ładną odpowiedź: stackoverflow.com/questions/11935633/…
rustybeanstalk
3
przykład: git diff master origin / master (gdzie master to lokalna gałąź master, a origin / master to zdalna gałąź master).
Dung
@klyngbaek, ta odpowiedź w szczególności ;-)
Początkowo próbowałem, git diff HEAD origin/HEADco wydaje się wskazywać na inną gałąź zdalną niż ta, którą zamierzałem. Korzystanie z pełnej nazwy oddziału działa zgodnie z oczekiwaniami.
Deanna

Odpowiedzi:

590

Aby zaktualizować oddziały zdalnego śledzenia, musisz git fetchnajpierw wpisać, a następnie:

git diff <masterbranch_path> <remotebranch_path>

Możesz git branch -awyświetlić listę wszystkich oddziałów (lokalnych i zdalnych), a następnie wybrać nazwę oddziału z listy (wystarczy usunąć remotes/z nazwy oddziału zdalnego.

Przykład: git diff master origin/master(gdzie „master” jest lokalną gałęzią master, a „origin / master” jest zdalnym mianem origin i gałąź master).

meder omuraliev
źródło
23
Może potrzebować pobrania przed ( git fetch)
Houssem Badri,
To po prostu pokazuje wgląd w zmiany w bash, czy jest jakiś sposób, aby otworzyć wszystkie zmiany w IDE, takim jak kod VS?
Harsh Phoujdar
@Harsh Phoujdar Dodaj poniższy kod do pliku .git / .gitconfig [diff] tool = vscode [difftool] prompt = false [difftool "vscode"] cmd = \"C:\\Program Files (x86)\\Microsoft VS Code\\Code.exe\" \"$LOCAL\" \"$REMOTE\" --diff --wait trustExitCode = falseUpewnij się, że ścieżka do pliku code.exe jest poprawna.
Aman
1307
git diff <local branch> <remote>/<remote branch>

Na przykład git diff master origin/masterlubgit diff featureA origin/next

Oczywiście, aby mieć wspomniany oddział zdalnego śledzenia , musisz git fetchnajpierw; i potrzebujesz go, aby mieć aktualne informacje o oddziałach w zdalnym repozytorium.

Jakub Narębski
źródło
98
ściślej: git diff <oddział lokalny> <remote> / <oddział zdalny>
dokładnie
38
Zazwyczaj robię, git diff <remote>/<remote branch> <local branch>aby zobaczyć, co zrobi mój push do zdalnego repo.
Michał Tatarynowicz,
76
Jeszcze krótszy git diff originjest wystarczający, jeśli porównasz go ze swoim odgałęzieniem.
Ludder
12
proszę dodać git fetchna początku, że powoduje to problemy początkującym jak ja
Saif,
1
Hej, prawda git diff <remote>/<remote branch> <local branch>? W przeciwnym razie dodawanie i usuwanie włącza się na moim komputerze (git wersja 2.7.0.windows.2)
Martín Coll
183

Pierwszy typ

git branch -a

aby uzyskać listę dostępnych oddziałów. Na wyjściu możesz zobaczyć coś takiego

* master
  remotes/main/master
  remotes/origin/HEAD -> origin/master
  remotes/origin/master
  remotes/origin/mt
  remotes/upstream/master
  remotes/upstream/mt

Następnie pokaż różnicę

git diff --stat --color remotes/main/master..origin/master
git diff remotes/main/master..origin/master
YSN
źródło
1
nie powinno być ...zamiast ..?
Eliran Malka
9
Zdecydowanie wybrałbym to jako odpowiedź. Postępując zgodnie z Twoimi wskazówkami, mogłem zobaczyć różnice między oddziałem lokalnym a oddziałem zdalnym. Dzięki!
Tass
1
Zazwyczaj robię to, git log origin/my_branch..co będzie traktowane HEADjako lokalny referendarz, co w dużej mierze masz na myśli.
Rudie,
4
+1 za najlepszą odpowiedź według mojej skromnej opinii. Byłoby warte +2, gdybyś wspomniał o „pobieraniu”, aby zsynchronizować „zdalny” obraz sklonowanego źródła. Krok przeglądu statystyk / kolorów jest szczególnie pomocny.
bvj
3
Dzięki za jedną odpowiedź, która ostatecznie wyszła z siedmiu lub ośmiu „odpowiedzi”, które dały niewiele więcej niż fatal: bad revisionlub fatal: ambiguous argument. Chciałem tylko zobaczyć różnicę w tym samym pliku z innej gałęzi, czy to było zbyt wiele? Tak, tak było. :-) git diff remotes/origin/<base branch> <current branch> -- <filename>działa świetnie na git 1.8.3.1
Steve Bonds
143

Jeśli jesteś w danym oddziale i chcesz porównać go z odgałęzieniem, które śledzisz, użyj

git diff @{upstream}

jeśli twój upstream nie jest ustawiony (zwykle tak, dziękuję Arijoon w komentarzach)

git diff @{push}

Dzięki tej odpowiedzi dokumentacja git do określania wersji ma:

<branchname>@{upstream}Na przykład master@{upstream}, @{u}
przyrostek @{upstream}do BRANCHNAME (krótka forma <branchname>@{u}) odnosi się do gałęzi że gałęzi określonej przez branchnamejest opierać się na górnej części (skonfigurowane branch.<name>.remotei branch.<name>.merge). Brakuje branchnamedomyślnie bieżącej.

Andrew Grimm
źródło
10
Bardzo dobra odpowiedź, po prostu brakuje mi części. Zmień linię na git diff @ @{upstream}. Dodatkową zaletą @jest to HEAD, gdzie jesteś teraz, więc porównujesz HEADz tym, co śledzi twoja gałąź. Możesz użyć @{push}zamiast upstream, aby uzyskać różnicę między gałęzią, do której chcesz przepchnąć
Arijoon
3
najlepsza odpowiedź, nie wymaga pobierania pilota. potrzebuje więcej pozytywnych opinii!
jcomeau_ictx
3
W ryba shell mam wynik: fatal: ambiguous argument '@upstream': unknown revision or path not in the working tree. git diff @\{upstream\}Zamiast tego musiałem użyć . 😥
Landon Kuhn
git fetchNajpierw musisz , bo to nic nie robi, nie pokazuje wyników; przetestowano, usuwając plik z początku repozytorium i uruchomiono to polecenie lokalnie. .. działa tylko po pobraniu.
Ponadto, ponieważ podana odpowiedź obejmuje wszelkie zmiany lokalne. czasami jest to pożądane, innym razem nie.
Deanna
44

Rozumiem znacznie lepiej wyniki:

git diff <remote-tracking branch> <local branch>

pokazuje mi to, co zostanie usunięte i co zostanie dodane, jeśli popchnę lokalny oddział. Oczywiście jest tak samo, tylko odwrotnie, ale dla mnie jest bardziej czytelny i bardziej komfortowo patrzę na to, co się wydarzy.

Manfer
źródło
Otrzymuję dokładnie ten sam wynik z: git diff <oddział lokalny> <oddział zdalnego śledzenia> lub git diff <oddział zdalnego śledzenia> <oddział lokalny>
user2928048
32

Łatwa droga:

git fetch
git log -p HEAD..FETCH_HEAD

Spowoduje to najpierw pobranie zmian z domyślnego pilota (pochodzenia). Zostanie on utworzony automatycznie po sklonowaniu repozytorium. Możesz być także wyraźne: git fetch origin master.

Następnie git log służy do porównania twojej aktualnej gałęzi z tą właśnie pobraną. (Opcja -p(generuj łatkę) pokazuje różnice ).

Brent Faust
źródło
14

Tak to robię.

#To update your local.
git fetch --all

to pobierze wszystko ze zdalnego, więc kiedy sprawdzisz różnicę, porówna różnicę ze zdalną gałęzią.

#to list all branches
git branch -a

powyższe polecenie wyświetli wszystkie gałęzie.

#to go to the branch you want to check difference
git checkout <branch_name>
#to check on which branch you are in, use
git branch
    (or)
git status

Teraz możesz sprawdzić różnicę w następujący sposób.

git diff origin/<branch_name>

spowoduje to porównanie twojego oddziału lokalnego ze zdalnym

Sahith Vibudhi
źródło
2
git fetch - wszystko pobierze wszystko ze WSZYSTKICH pilotów. git fetch powinno wystarczyć, jeśli używasz domyślnego zdalnego źródła.
Christophe Keller
Niesamowite, że po 8 latach otrzymujemy kompletną odpowiedź, która właściwie wyjaśnia kroki. Możemy zrobić --help, aby uzyskać polecenia. SO polega na ich zrozumieniu.
gdbj
11

Niech twoja działająca gałąź jest programistyczna i chcesz rozróżnić lokalną gałąź programistyczną i zdalną gałąź programistyczną, w takim przypadku składnia powinna być podobna git diff remotes/origin/development..development
lub

git fetch origin git diff origin/development

Ratna Halder
źródło
11

tl; dr :git diff <local branch> <remote branch>

Kiedy używam gita na powłoce, lubię najpierw orientować się, rozglądając się. Oto polecenie pokazujące wszystkie gałęzie

$ git branch -a  # (or git branch --all) 
* my-branch
  master
  remotes/origin/some-branch
  remotes/origin/HEAD -> origin/master
  remotes/origin/my-branch
  remotes/origin/some-other-branch
  remotes/origin/master

Tutaj mam dwie lokalne oddziały ( my-brancha master) i 4 (Remote some-branch, some-other-branch, master, i my-branch).

Również gwiazdka obok my-branchoznacza, że ​​aktualnie jestem w tej gałęzi (można to również wiedzieć za pomocą polecenia git status, które wyświetli:) On branch my-branch..

Uwaga: odległe gałęzie w powłoce git bash są pokazane na czerwono, a lokalne na zielono.

Jeśli chcesz tylko wyświetlić zdalne gałęzie :

$ git branch -r # (or git branch --remotes)
  origin/some-branch
  origin/HEAD -> origin/master
  origin/my-branch
  origin/some-other-branch
  origin/master

Aby pokazać tylko lokalne oddziały, możesz chcieć użyć, git branch -lale to zupełnie inne polecenie. Aby pokazać lokalne oddziały, użyj git branchbez opcji

$ git branch
* my-branch 
  master

Aby dokończyć przegląd podstawowych opcji gałęzi, jest to, --listże w przeciwieństwie do tego, czego można się spodziewać, jest zezwolenie na filtrowanie . Użyj go z takim wzorem:

$ git branch --list 'my*'
* my-branch

Można również połączyć --listz opcjami -ai -rale upewnij się, aby dostosować swój wzorzec odpowiednio ( pamiętaj: zdalnych oddziałów zacząć „pilotów” ). Przykład:

# this will show all branches (local & remote) that start with my
$ git branch --list 'my*' -a
* my-branch

# better: the pattern includes the remote
$ git branch --list '*my*' -a
* my-branch
  remotes/origin/my-branch

Dokumenty: https://git-scm.com/docs/git-branch

Teraz możesz porównać dowolne dwie gałęzie ze wszystkich dostępnych (możesz również porównać dwóch mieszkańców lub dwa piloty).

Tutaj porównuję lokalny ze zdalnym my-branch, są one zsynchronizowane, więc nie otrzymuję żadnych danych wyjściowych:

$ git diff my-branch remotes/origin/my-branch

Uwaga: musisz podać pełne nazwy oddziałów bez znaków cudzysłowu.

Mogę również porównać lokalny my-branchdo zdalnego master. Tutaj otrzymuję dane wyjściowe, ponieważ pilot my-branchnie został scalony z gałęzią master.

$ git diff my-branch remotes/origin/master
diff --git a/src/controllers/call.controller.js b/src/controllers/call.controller.js
index fd79b98..df3d798 100644
--- a/src/controllers/call.controller.js
+++ b/src/controllers/call.controller.js
@@ -261,7 +261,7 @@ function callController() {
   /*
    *  Function: doCall
[ . . . ]
użytkownik2314737
źródło
11

Jeśli chcesz zobaczyć różnicę jak tylko nazwy plików zmienił wtedy użyć:

git diff --name-status <remote-branch> <local-branch>,

inny to pokaże wszystkie różnice między dwoma oddziałami:

git diff <remote-branch> <local-branch>

Sarvesh Kesharwani
źródło
9

Oto krótka odpowiedź, jeśli porównujesz swoją obecną gałąź i coś, co chcesz git pull.

git fetch
git diff FETCH_HEAD

Pierwsze polecenie ustali, która gałąź zdalna odpowiada twojej gałęzi. Artefakt tego obliczenia w FETCH_HEADreferencji. Następnie drugie polecenie używa tego porównania do porównania z obecnym oddziałem.

William Entriken
źródło
6

Wiem, że jest już kilka odpowiedzi na to pytanie, ale podczas próby większości z nich wystąpił dziwny błąd.

W moim przypadku mam drugi zdalny nazywa herokuto nieorigin a ponieważ nie był zsynchronizowany Dostałem ten błąd, gdy próbuje uruchomić git diff master heroku/master:

fatal: ambiguous argument 'heroku/master': unknown revision or path not in the working tree.

lub to, gdy wypróbowujesz inne podejście git diff master..heroku/master:

fatal: bad revision 'master..heroku/master'

Rozwiązanie wyraźnie wspomniało o zdalnej nazwie git fetchprzed uruchomieniem git diff, w moim przypadku:

$ git fetch heroku
$ git diff master heroku/master

Mam nadzieję, że pomaga innym z tym samym problemem.

fagiani
źródło
4
git difftool <commit> .

Spowoduje to porównanie żądanego zatwierdzenia z lokalnymi plikami. Nie zapomnij kropki na końcu (dla lokalnych).

Na przykład, aby porównać pliki lokalne z niektórymi zmianami:

git difftool 1db1ef2490733c1877ad0fb5e8536d2935566341.

(i nie potrzebujesz git fetch, chyba że konieczne jest porównanie z nowymi zatwierdzeniami)

Izik
źródło
Myślę, że jest to interesujące, ponieważ jest to porównanie, które mogę wykonać przed zatwierdzeniem i wypchnięciem. Niestety w systemie Windows vimdiff za wyświetlanie jest brzydki; czy jest jakiś sposób na użycie czegoś lepszego, na przykład notepad ++?
Stefano Scarpanti
3

Przykład

git diff 'master' 'testlocalBranch'

Jeśli korzystasz z edytora, takiego jak webstorm, możesz kliknąć prawym przyciskiem myszy plik wybierz Porównaj z gałęzią i wpisz / wybierz swoją gałąź.

wprowadź opis zdjęcia tutaj

wprowadź opis zdjęcia tutaj

Kurkula
źródło
2
Co to dodaje do ponad 7,5-letniej akceptowanej odpowiedzi z ponad 170 głosami pozytywnymi?
Mark Rotteveel,
To jest dla użytkownika mrblah lub podobnych użytkowników, którzy dodali komentarz do zaakceptowanej odpowiedzi. Składnia różni się od przykładu, a przykład pomaga bardziej z punktu widzenia początkującego.
Kurkula,
2
W takim przypadku powinno być w komentarzu do tej odpowiedzi.
rachit
1

W VS 2019 po prostu wykonaj FETCH Nie ściągaj kodu.

Oto co zrobiłem. Dodano poniżej w pliku .gitconfig, dzięki czemu mogę korzystać z Beyond Compare

File location: C:\Users\[username]\.gitconfig

Dodano poniżej

[diff]
    tool = bc
[difftool "bc"]
    path = c:/Program Files/Beyond Compare 4/bcomp.exe

Otwórz wiersz polecenia i przejdź do katalogu roboczego. Podałem poniżej, aby porównać lokalny oddział DEV ze zdalnym oddziałem DEV

git difftool dev origin/dev --dir-diff

Otworzy się Beyond Compare i otworzą katalogi, które mają różne pliki. Jeśli żadne zmiany Beyond Compare nie zostaną uruchomione.

Ziggler
źródło
0

Zastanawiam się, czy w mojej głównej gałęzi nastąpiła jakaś zmiana ...

  1. Po pierwsze, musisz zmienić swój oddział (jeśli już jesteś w tej gałęzi, nie musisz tego robić!)

Git Checkout Master

  1. Możesz zobaczyć, który plik został zmodyfikowany w gałęzi master za pomocą tego polecenia

status git

  1. Wymień gałęzie

gałąź git -a


  • piloty master / origin / master
  1. Znajdź różnice

git diff origin / master

Ali Atakan
źródło
0

Ustawiać

git config alias.udiff 'diff @{u}'

Różnicowanie HEAD z HEAD @ {upstream}

git fetch  # Do this if you want to compare with the network state of upstream; if the current local state is enough, you can skip this
git udiff

Różnicowanie za pomocą arbitralnego oddziału zdalnego

To odpowiada na pytanie w twoim nagłówku („jego pilot”); jeśli chcesz odróżnić się od „zdalnego” (który nie jest skonfigurowany jako odgałęzienie dla gałęzi), musisz skierować go bezpośrednio. Możesz zobaczyć wszystkie zdalne gałęzie z następującymi elementami:

git branch -r

Możesz zobaczyć wszystkie skonfigurowane piloty w następujący sposób:

git remote show

Możesz zobaczyć konfigurację gałęzi / śledzenia dla jednego pilota (np. Pochodzenia) w następujący sposób:

git remote show origin

Po określeniu odpowiedniej gałęzi początkowej, po prostu zrób normalną różnicę :)

git diff [MY_LOCAL] MY_REMOTE_BRANCH

DylanYoung
źródło
0

To jest dość proste. Możesz użyć:git diff remote/my_topic_branch my_topic_branch

Gdzie my_topic_branchjest twoja gałąź tematyczna.

Elisha Senoo
źródło
0

Załóżmy, że skonfigurowałeś już swoje originzdalne repozytorium. Następnie,

git diff <local branch> <origin>/<remote branch name>

Tirtha
źródło
0

próbować:

git diff origin HEAD

Zakładając, że chcesz odróżnić bieżące oddziały lokalne HEADod źródła. I zakładając, że jesteś w lokalnym oddziale. :)

Sourabh Pandit
źródło
-3

Jeśli używasz TortoiseGit (zapewnia GUI dla Git), możesz kliknąć prawym przyciskiem myszy folder repozytorium Git, a następnie kliknąć Git Sync.

Możesz wybrać swoje oddziały do ​​porównania, jeśli nie zostaną wybrane. Następnie możesz zobaczyć zatwierdzenie różnic. Możesz także kliknąć prawym przyciskiem myszy dowolny zatwierdzenie, Compare with previous revisionaby wyświetlić różnice obok siebie.tortoise git sync, aby porównać oddział zdalny i lokalny

Halil İbrahim Oymacı
źródło