Korzystając z Git, jak znaleźć zmiany między lokalnym a zdalnym


152

Oto dwa różne pytania, ale myślę, że są ze sobą powiązane.

  1. Podczas korzystania z Git, jak znaleźć zmiany, które wprowadziłem lokalnie, ale nie zostały jeszcze przesłane do zdalnej gałęzi? Szukam czegoś podobnego do komendy Mercurial hg outgoing.

  2. Podczas korzystania z Git, jak znaleźć zmiany w zdalnej gałęzi przed wykonaniem ściągnięcia? Szukam czegoś podobnego do komendy Mercurial hg incoming.

Po drugie: czy istnieje sposób, aby sprawdzić, co jest dostępne, a następnie wybrać najlepsze zmiany, które chcę wprowadzić?


11
Patrząc na odpowiedzi, wydaje się, że istnieje pewne zamieszanie co do tego, co hg incomingi hg outgoingfaktycznie robimy. Najbliższy odpowiednik Gita, który znalazłem, to --dry-runopcja. Po prostu, git pull --dry-runa zobaczysz listę wszystkich rzeczy, które muszą się wydarzyć.
Roman Starkov

Odpowiedzi:


97

Git nie może wysyłać tego rodzaju informacji przez sieć, jak Hg. Ale możesz uruchomić git fetch(co jest bardziej podobne hg pullniż hg fetch), aby pobrać nowe zatwierdzenia ze zdalnych serwerów.

Tak więc, jeśli masz wywoływaną gałąź masteri zdalną origin, po uruchomieniu git fetchpowinieneś mieć również gałąź o nazwie origin/master. Następnie możesz uzyskać git logwszystkie zatwierdzenia, które mastermuszą być nadzbiorem origin/master, wykonując czynności git log master..origin/master. Odwróć te dwa, aby uzyskać przeciwieństwo.

Mój przyjaciel, David Dollar, stworzył kilka skryptów powłoki git do symulacji hg incoming/outgoing. Możesz je znaleźć pod adresem http://github.com/ddollar/git-utils .


113

Począwszy od Git 1.7.0 istnieje specjalna składnia, która pozwala na ogólne odwoływanie się do gałęzi upstream: @{u}lub @{upstream}.

Aby naśladować hg incoming:

git log ..@{u}

Aby naśladować hg outgoing:

git log @{u}..

Używam następujących incomingi outgoingaliasów, aby ułatwić korzystanie z powyższego:

git config --global alias.incoming '!git remote update -p; git log ..@{u}'
git config --global alias.outgoing 'log @{u}..'

git log .. @ {u} daje mi te błędy. (Mam repozytorium pochodzenia i nadrzędne w mojej konfiguracji git). błąd: Nie znaleziono gałęzi upstream dla „” error: Nie znaleziono gałęzi upstream dla „..” błąd: Nie znaleziono gałęzi upstream dla „..” fatal: ambiguous argument „.. @ {u}”: nieznana wersja lub ścieżka nie w drzewo robocze. Użyj znaku „-”, aby oddzielić ścieżki od wersji
Henrik

6
Otrzymasz te błędy, jeśli twój lokalny oddział nie jest skonfigurowany z nadrzędnym. Aby naprawić, biegnij git branch --set-upstream foo origin/foo.
Richard Hansen

git log @{u}..wymienia każdą zmianę w repozytorium dla mnie. Nie ma mowy, żeby jeszcze nie istniały.
Roman Starkov

@romkyns: Możliwe, że twój lokalny oddział ma nieprawidłową gałąź zdalną skonfigurowaną jako nadrzędna. Upewnij się, że git rev-parse --symbolic-full-name @{u}drukuje odpowiednie zdalne odniesienie. Ponadto, git log @{u}..przedstawiono przesyła potwierdzenie, które nie są dostępne od górnej gałęzi, które mogą zawierać przesyła potwierdzenie, które są już na zdalnym repozytorium (jeśli są one osiągalne za pomocą innego odnośnik). Stanie się to zaraz po scaleniu w już wypchniętej gałęzi.
Richard Hansen

@RichardHansen Obawiam się, że jestem zbyt noobem, by wiedzieć, co byłoby odpowiednie dla zdalnego odniesienia, jednak było to świeżo sklonowane repozytorium, na którym zrobiłem tylko checkout <somebranch>i merge <otherbranch>. W tym momencie zrobiłem log @{u}..i zobaczyłem każdą wymienioną zmianę.
Roman Starkov

42

Nie jest to pełna odpowiedź, ale git fetch ściągnie zdalne repozytorium i nie dokona scalenia. Możesz wtedy zrobić

git diff master origin / master


1
Pracował dla mnie (ale na odwrót) -git diff origin/master master
Nick Grealy

34
  1. Użyj „git log origin..HEAD”

  2. Użyj polecenia „git fetch”, a następnie „git log HEAD..origin”. Możesz wybierać poszczególne zatwierdzenia, korzystając z wymienionych identyfikatorów zatwierdzeń.

Powyższe zakłada oczywiście, że „pochodzenie” to nazwa twojej gałęzi zdalnego śledzenia (tak jest, jeśli użyłeś clone z domyślnymi opcjami).


3
(A jeśli nie
śledzisz

4
„Origin” to nie nazwa gałęzi zdalnego śledzenia, to nazwa zdalnego. I samo określenie zdalnej nazwy nie działa, musisz określić gałąź zdalnego śledzenia, która byłaby pochodzenia / wzorca.
robinst

22

Jest też to, aby porównać wszystkie gałęzie:

git log --branches --not --remotes=origin

Oto, co mówi o tym strona podręcznika git log:

Pokazuje wszystkie zatwierdzenia, które są w którymkolwiek z lokalnych oddziałów, ale nie w żadnej z gałęzi zdalnego śledzenia pochodzenia (to, co masz w tym miejscu, nie ma).

Powyższe dotyczy outgoing. Po incomingprostu zamień:

git log --remotes=origin --not --branches

8

chciałbym zrobić

$ git fetch --dry-run

dla hg incomingi

$ git push --dry-run

dla hg outgoing.


Przepraszam, przeoczyłem, że zostało to już powiedziane jako komentarz do PO.
chris

1

git-out to skrypt, który hg outgoingdość dokładnie emuluje . Analizuje dane wyjściowe „push -n”, więc generuje dokładne dane wyjściowe, jeśli trzeba określić dodatkowe argumenty do przekazania.


0

git przychodzące

$ git fetch && git log ..origin/master --stat
OR
$ git fetch && git log ..origin/master --patch

git wychodzący

$ git fetch && git log origin/master.. --stat
OR
$ git fetch && git log origin/master.. --patch

0

Kiedy w „git log” i odpowiedziach @ {u} pojawiły się początkowo błędy „nieznanej wersji”, wypróbowałem sugestię Chrisa / Romkynsa git push --dry-run.

Otrzymasz wynik, taki jak „5905..4878 master-> master”. 5905 to najnowsze zatwierdzenie, które ma pilot i zatwierdza (włącznie) 4878 zostanie zastosowane do pilota.

Następnie możesz użyć 5905..4878 jako argumentów do kilku innych poleceń git, aby uzyskać więcej szczegółów:

git diff 5905..4878 # Gives full code changes in diff style

git log --online 5905..4878 # Displays each commit's comment

-1

Kiedy wykonujesz pobieranie git, cała zawartość, w tym gałęzie, tagi (referencje) są tymczasowo przechowywane w .git / FETCH_HEAD, których zawartość można wyświetlić za pomocą polecenia: git log FETCH_HEAD Jeśli nie używasz przyrostka -a z git fetch to domyślnie , Zawartość FETCH_HEAD zostanie nadpisana przez nową zawartość. Z tej zawartości możesz przeglądać i zdecydować, do której gałęzi chcesz je scalić, jeśli to zrobisz, lub możesz po prostu wybierać, jeśli chcesz tylko kilka zatwierdzeń z tego, co zostało przyniesione przez fetch.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.