git diff między sklonowanym i oryginalnym zdalnym repozytorium

170

Sklonowałem repozytorium github i nie wprowadziłem żadnych zmian lokalnie. Repozytorium Github przesunęło się do przodu z zatwierdzeniami w tej samej gałęzi.

  1. Jak znaleźć różnicę między moim lokalnym repozytorium a oryginalnym repozytorium github?
  2. Jak znaleźć różnicę między moją kopią roboczą a oryginalnym repozytorium github?
  3. Jak znaleźć różnicę między moim lokalnym repozytorium a innym repozytorium github tego samego projektu?
Oleg Proudnikov
źródło
1
możliwy duplikat porównania lokalnego oddziału git z oddziałem zdalnym?
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
1
@CiroSantilli 新疆 改造 中心 六四 事件 法轮功: Myślę, że jest wystarczająco inny: drugie pytanie dotyczy dowolnego ogólnego oddziału zdalnego, podczas gdy dotyczy to GitHub plus dotyczy trzech różnych punktów początkowych. Są zdecydowanie podobne, więc Twój link jest z pewnością przydatny.
jvriesem

Odpowiedzi:

161

1) Dodaj zdalne repozytoria, które chcesz porównać:

git remote add foobar git://github.com/user/foobar.git

2) Zaktualizuj lokalną kopię pilota:

git fetch foobar

Pobieranie nie zmieni kopii roboczej.

3) Porównaj dowolną gałąź z lokalnego repozytorium z dowolnym dodanym zdalnym:

git diff master foobar/master
dbyrne
źródło
Czy będę potrzebować git fetch przed diff? Wydaje mi się, że bez tego nie da się odróżnić.
Oleg Proudnikov
W rzeczywistości jest to odpowiedź tylko na pytanie 3 (różnica z innym repozytorium github).
Ruslan Kabalin
5
Nic nie odróżnia „oryginalnego repozytorium github” od jakiegokolwiek innego zdalnego repozytorium. A może coś nie rozumiem?
dbyrne
Kiedy wypróbowałem to z git 2.7.4 "git diff master foobar / master" nie pokazał różnic. Wygląda na to, że porównuje moją lokalną kopię („master”) z repozytorium podanym jako pierwszy argument („master”) i tam porównuje tylko „ścieżkę / plik” „foobar / master”. Ale polecenie "diff foobar / master" działało dla mnie, porównując mojego lokalnego mastera z foobar / master.
user2081279
Zamiast fetch(nr. 2) jako alternatywa: git remote update- zaktualizuje wszystkie twoje oddziały ustawione na śledzenie zdalnych, ale nie będzie łączyć żadnych zmian; lubgit pull
Timo
49

Kolejna odpowiedź na twoje pytania (zakładając, że jesteś na master i już wykonałeś polecenie „git fetch origin”, aby poinformować repozytorium o zdalnych zmianach):

1) Zatwierdzenia w oddziale zdalnym od momentu utworzenia oddziału lokalnego:

git diff HEAD...origin/master

2) Zakładam, że przez "kopię roboczą" masz na myśli swój lokalny oddział z kilkoma lokalnymi zatwierdzeniami, które nie są jeszcze zdalne. Aby zobaczyć różnice w tym, co masz w lokalnym oddziale, ale to nie istnieje w zdalnym oddziale:

git diff origin/master...HEAD

3) Zobacz odpowiedź dbyrne.

Ruslan Kabalin
źródło
Dziękuję za HEAD..origin/masterskładnię! Otrzymywaliśmy błędy z nieistniejącym źródłem / HEAD, a to rozwiązało problem.
Dan Bechard
@ruslan: co to znaczy, że git diff HEAD...origin/masternic nie zwraca, jeśli sklonowałem zdalny katalog, do którego mam uprawnienia do wprowadzania zmian?
Mona Jalal
Wystąpił błąd podczas klonowania za pomocą GUI systemu Windows, dlatego zastanawiam się, czy klon przeszedł całkowicie. Widzę, że foldery znajdują się w moim katalogu, ale chcę się upewnić, że są takie same jak zdalne. Jednak w powłoce git, git diff nic nie zwraca. Nie wiem, czy mój klon się powiódł, czy nie?
Mona Jalal
@MonaJalal oznacza to, że od sklonowania go nie ma żadnych wcześniejszych zmian.
Ruslan Kabalin
21

Ten przykład może komuś pomóc:

Uwaga „ origin” to mój alias dla zdalnego „Co jest na Githubie„
Uwaga ” mybranch„ to mój alias dla mojej gałęzi „co jest lokalne”, który synchronizuję z github -
nazwa twojej gałęzi to „master”, jeśli nie została utworzona jeden. Jednak używam innej nazwy, mybranchaby pokazać, gdzie jest używany parametr nazwy gałęzi.


Czym dokładnie są moje zdalne repozytoria na Github?

$ git remote -v
origin  https://github.com/flipmcf/Playground.git (fetch)
origin  https://github.com/flipmcf/Playground.git (push)

Dodaj „inne repozytorium github tego samego kodu” - nazywamy to widelcem:

$ git remote add someOtherRepo https://github.com/otherUser/Playground.git

$git remote -v
origin  https://github.com/flipmcf/Playground.git (fetch)
origin  https://github.com/flipmcf/Playground.git (push)
someOtherRepo https://github.com/otherUser/Playground.git (push)
someOtherRepo https://github.com/otherUser/Playground.git (fetch)

upewnij się, że nasze lokalne repozytorium jest aktualne:

$ git fetch

Zmień niektóre rzeczy lokalnie. powiedzmy plik ./foo/bar.py

$ git status
# On branch mybranch
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#   modified:   foo/bar.py

Przejrzyj moje niezatwierdzone zmiany

$ git diff mybranch
diff --git a/playground/foo/bar.py b/playground/foo/bar.py
index b4fb1be..516323b 100655
--- a/playground/foo/bar.py
+++ b/playground/foo/bar.py
@@ -1,27 +1,29 @@
- This line is wrong
+ This line is fixed now - yea!
+ And I added this line too.

Zatwierdź lokalnie.

$ git commit foo/bar.py -m"I changed stuff"
[myfork 9f31ff7] I changed stuff
1 files changed, 2 insertions(+), 1 deletions(-)

Teraz jestem inny niż mój pilot (na github)

$ git status
# On branch mybranch
# Your branch is ahead of 'origin/mybranch' by 1 commit.
#
nothing to commit (working directory clean)

Porównaj to z pilotem - twoim widelcem: (często się to robi z git diff master origin )

$ git diff mybranch origin
diff --git a/playground/foo/bar.py b/playground/foo/bar.py
index 516323b..b4fb1be 100655
--- a/playground/foo/bar.py
+++ b/playground/foo/bar.py
@@ -1,27 +1,29 @@
- This line is wrong
+ This line is fixed now - yea!
+ And I added this line too.

(naciśnij przycisk git, aby zastosować je do pilota)

Czym różni się moja zdalna gałąź od zdalnej gałęzi głównej?

$ git diff origin/mybranch origin/master

Czym moje lokalne rzeczy różnią się od zdalnej gałęzi głównej?

$ git diff origin/master

Czym moje rzeczy różnią się od forka innej osoby, głównej gałęzi tego samego repozytorium?

$git diff mybranch someOtherRepo/master
FlipMcF
źródło
5
Zanim zrobimy „git diff”, myślę, że konieczne jest wykonanie „git fetch”, aby upewnić się, że nasza lokalna kopia pilota jest aktualna.
Don,
1
Przeczytałem może 20 postów na temat porównywania zdalnego i lokalnego. Właśnie to odkryłem: najpierw WYMAGANE jest pobieranie git. git jest naprawdę kodem asemblera RCS. Jezus. Dzięki za potwierdzenie, Don!
Terence Parr,
właśnie dodałem git fetchdo tej odpowiedzi.
FlipMcF,
1
Hummm ... Nie podoba mi się, jak użyłem „myfork” jako nazwy mojej gałęzi. To mogłoby kogoś zmylić (jak ja, który właśnie wrócił po tę odpowiedź)
FlipMcF
Edytowano - przejrzystość i odpowiedź na pytanie
``