Git: Jak sprawdzić, czy lokalne repozytorium jest aktualne?

85

Chciałbym wiedzieć, czy moje lokalne repozytorium jest aktualne (a jeśli nie, najlepiej chciałbym zobaczyć zmiany).

Jak mogłem to sprawdzić bez robienia git fetchlub git pull?

Misha Moroshko
źródło

Odpowiedzi:

95

Spróbuj git fetch --dry-run Instrukcja ( git help fetch) mówi:

--dry-run
Show what would be done, without making any changes.
Philip Oakley
źródło
3
Dzięki! Chociaż trudno jest zrozumieć na podstawie danych wyjściowych, które pliki zostały dodane / zmodyfikowane / usunięte.
Misha Moroshko
1
Możesz zobaczyć, jakie tagi są aktualizowane i zakres zatwierdzenia początkowego i końcowego dla różnych gałęzi. Jeśli to nie wystarczy, zrób to jako poprawne pobieranie (a nie ściąganie), które da ci właściwą, oddzielną, lokalną kopię pilota, bez wpływu na pracę własnego oddziału. Pociągnięcie byłoby próbą połączenia tych dwóch, co nie jest tym, czego chcesz. Transfer danych jest taki sam, niezależnie od tego, czy pracujesz na sucho, czy nie.
Philip Oakley
4
dlaczego jest tak, że kiedy biegnę, git fetch --dry-runnic się nie pojawia?
Paramvir Singh Karwal,
3
Raport @ParamvirSinghKarwal Git jest rzadki. Jeśli nie ma nic do powiedzenia, nic nie mówi, jakby nic się nie stało. Może znasz aktualne specyfikacje swojego regularnego pobierania. Może dodać --all?
Philip Oakley,
1
@AaronBeall Jeśli tak jest, najprawdopodobniej oznacza to, że już pobrałeś te zmiany lokalnie (więc nie ma nic do pobrania), ale jeszcze nie scaliłeś ich ze swoją gałęzią. git pulljest w przybliżeniu odpowiednikiem a git fetch && git merge. Jeśli w dowolnym momencie uruchomiłeś pobieranie bez rozszerzenia --dry-run, oznacza to, że już pobrałeś rzeczy lokalnie.
DuckPuppy
34
git remote show origin

Wynik:

HEAD branch: master
  Remote branch:
    master tracked
  Local branch configured for 'git pull':
    master merges with remote master
  Local ref configured for 'git push':
    master pushes to master (local out of date) <-------
Jim Smith
źródło
To zawiera listę gałęzi wszech czasów. Jeśli masz repozytorium z długą historią, dane wyjściowe są dość zagracone.
Paulo Carvalho
git remote show origin | grep "your / branch"
jim smith
27

Pierwsze użycie git remote update, aby zaktualizować pilota. Następnie możesz zrobić jedną z kilku rzeczy, na przykład:

  1. git status -unopowie Ci, czy śledzona gałąź jest przed, z tyłu, czy też się rozeszła. Jeśli nic nie mówi, lokalne i zdalne są takie same. Przykładowy wynik:

W oddziale DEV

Twoja gałąź jest za 'origin / DEV' o 7 zatwierdzeń i może być przewijana do przodu.

(użyj „git pull”, aby zaktualizować swój lokalny oddział)

  1. git show-branch *master pokaże zmiany we wszystkich gałęziach, których nazwy kończą się na „master” (np. master i origin / master).

Jeśli używasz -vz git remote update ( git remote -v update), możesz zobaczyć, które gałęzie zostały zaktualizowane, więc tak naprawdę nie potrzebujesz żadnych dalszych poleceń.

Piyush Agarwal
źródło
2
Dlaczego to jest tak daleko? git remote update ; git status -unorozwiązałem to. git fetch --dry-runnie dawał wyjścia nawet w przypadkach, gdy lokalny był za zdalnym.
Aaron Beall
1
git remote -v updatejest odpowiedzią dla mnie.
Paulo Carvalho
17

możesz użyć, git status -unoaby sprawdzić, czy Twój lokalny oddział jest na bieżąco z oryginalnym.

flowdee
źródło
18
Podaje tylko status lokalny, nie sprawdza ze zdalną gałęzią.
Ishan Liyanage
4
Daje tylko lokalne, ale git remote update ; git status -unozałatwiło sprawę! Nie git fetch --dry-rundawało wyjścia, kiedy się tego spodziewałem (i git pullwyciągnęłoby rzeczy).
Aaron Beall
1
Ta odpowiedź jest błędna i należy ją usunąć. W tej chwili utrwala bardzo powszechny, ale błędny mit o tym, jak działa Git, który jest rozwiewany tylko wtedy, gdy ktoś zdecyduje się przeczytać komentarze do niego.
Prometheus
8

Niezupełnie - ale nie widzę, jak git fetchby to zaszkodziło, ponieważ nie zmieni to żadnego z twoich lokalnych oddziałów.

Niclas Kirschmeier
źródło
Całkowicie się z tym zgadzam. Git pull może uszkadzać, nadpisywać pliki. Ale pobieranie git pobiera tylko metadane, pozwalając poleceniom, takim jak status git, powiedzieć ci, czy twoje lokalne repozytorium jest aktualne, czy nie, bez nadpisywania jakichkolwiek plików. Może nie odpowiadać na literę pytania, ale odpowiada duchowi pytania, dając ci narzędzie, którego chcesz. Git pobiera, a następnie status git powie Ci, gdzie jest twoje lokalne repozytorium w stosunku do pilota bez nadpisywania plików.
merlit64
5

Inną alternatywą jest wyświetlenie statusu zdalnego oddziału, używając git show-branch remote/branchgo jako porównania, które możesz zobaczyć, git show-branch *branchaby zobaczyć gałąź we wszystkich pilotach, a także w repozytorium! sprawdź tę odpowiedź, aby uzyskać więcej informacji https://stackoverflow.com/a/3278427/2711378

Amanuel Nega
źródło
5

Musisz wydać dwa polecenia:

  1. Git Fetch Origin
  2. status git
user3695833
źródło
1
To działa, ale pytanie wyraźnie mówi bez „pobierania”. Istnieje wiele przypadków, w których chcesz wiedzieć, czym różni się lokalne repozytorium od zdalnego repozytorium bez faktycznego pobierania lub scalania zmian.
pedram bashiri
1
@pedrambashiri Jestem naprawdę ciekawy, jak co? O ile wiem, samo pobranie nigdy niczego nie skrzywdzi.
Prometeusz
@Prometheus po pierwsze, chciałem tylko zwrócić uwagę, że gdy pytanie wyraźnie stwierdza `` bez pobierania '', po prostu nie możesz użyć pobierania w swojej odpowiedzi, jeśli nie ma innego sposobu na zrobienie tego lub nie ma prawdziwego powodu, aby to zrobić bez, to wymaga do wyjaśnienia w odpowiedzi. Ale aby odpowiedzieć na twoje pytanie, pobieranie aktualizuje lokalną kopię zdalnego repozytorium. Spójrz na diagram w tym poście blog.osteele.com/2008/05/my-git-workflow
pedram bashiri
4

Musisz uruchomić, git fetchzanim będziesz mógł porównać lokalne repozytorium z plikami na zdalnym serwerze.

To polecenie aktualizuje tylko twoje gałęzie zdalnego śledzenia i nie wpłynie na twoje drzewo robocze, dopóki nie zadzwonisz git mergelub git pull.

Aby zobaczyć różnicę między lokalnym oddziałem a zdalnym oddziałem śledzenia po pobraniu, możesz użyć git diff lub git cherry, jak wyjaśniono tutaj.

Braitsch
źródło
2

Jeśli użyjesz

git fetch --dry-run -v <link/to/remote/git/repo>

otrzymasz informację, czy jest aktualny. W zasadzie wystarczy dodać opcję „gadatliwości” do podanej wcześniej odpowiedzi.

Don Davis
źródło
1

Jest to niemożliwe bez użycia git fetchlub git pull. Skąd możesz wiedzieć, czy repozytorium jest „aktualne”, bez konieczności przechodzenia do repozytorium zdalnego, aby sprawdzić, co w ogóle oznacza „aktualne”?

Jörg W Mittag
źródło
5
Proszę, potwierdź to! Właśnie odpowiedziałeś, co myślisz! Powinieneś być bardziej ostrożny, ponieważ nowicjusze będą z nim walczyć!
Amanuel Nega
4
@AmanuelNega: To tylko podstawowa logika. Jeśli chcesz wiedzieć, czy Twoje lokalne repozytorium jest w tym samym stanie, co zdalne repozytorium, musisz znać stan zdalnego repozytorium. Kropka. Jeśli nie znasz stanu zdalnego repozytorium, nie możesz wiedzieć, czy lokalne repozytorium jest w tym samym stanie. Zwróć uwagę, że zastosowano najwięcej głosów i zaakceptowanych odpowiedzi git pull, których PO wyraźnie zabrania w swoim pytaniu.
Jörg W Mittag
2
Być poinformowanym! git status -unoto działa i można go również użyć, git show-branch *masteraby zobaczyć stan wszystkich gałęzi głównych! Czy nadal mówisz, że to niemożliwe? Możesz zobaczyć status dowolnego oddziału, o ile masz dostęp do pilota!
Amanuel Nega
2
@AmanuelNega: git statusinformuje tylko o statusie lokalnych referencji , nie informuje, czy lokalne referencje są aktualne z zdalnymi referencjami. Ponownie: po prostu logicznie niemożliwe jest poznanie stanu zdalnego repozytorium bez uzyskania stanu zdalnego repozytorium. Kropka. To tylko podstawowe prawa czasoprzestrzeni.
Jörg W Mittag
6
Nie jest to "logicznie" niemożliwe, ponieważ oczywiste jest, że można zadzwonić do kogoś w twojej serwerowni i powiedzieć, "co to jest hash twojego HEAD w gałęzi głównej", oni mogliby ci powiedzieć, a następnie możesz sprawdzić lokalną i zobaczyć, że nie nie mam tego haszyszu. Teraz wiesz, że nie są zsynchronizowane.
James Robinson
1

próbowałem sformatować moją odpowiedź, ale nie udało mi się. Zespół stackoverflow, dlaczego publikowanie odpowiedzi jest takie trudne.

mimo wszystko,

odpowiedź:
git pobiera
status git pochodzenia (zobaczysz wynik typu „Twoja gałąź jest za 'origin / master' przez 9 zatwierdzeń”),
aby zaktualizować do zdalnych zmian: git pull

adarsh
źródło