2014-12-18 16 views
5

Załóżmy, że pracuję nad license.txt w moim lokalnym repozytorium i zmieniam je. Zanim to zrobię, Susan modyfikuje i zatwierdza do zdalnego repozytorium.Skąd się bierze "git fetch"?

Co mogę zrobić, jeśli mam git fetch? Gdzie idą wyniki?

+0

Wyobrażam sobie postój z komunikatem "Niezatwierdzone zmiany w katalogu roboczym" – sjagr

+0

Gdzie sądzisz, że twoje poprzednie zatwierdzenia idą po dokonaniu nowego zatwierdzenia? To jest to samo miejsce, gdzie będą te spodziewane zobowiązania. – DCoder

+0

Zatwierdzenia Susan zostaną dodane do odpowiedniej gałęzi * zdalnego śledzenia * (np. 'Origin/master') w lokalnym repozytorium. – Jubobs

Odpowiedz

4

Nic się nie dzieje z aktualizacjami. git fetch, z braku lepszego słowa, pobiera zatwierdza ze zdalnego repozytorium i umieszcza je w lokalnej kopii bazy danych obiektów. Ponieważ pracujesz nad własną gałęzią, nie ma między nimi żadnej interakcji, dopóki nie zdecydujesz się na jakąś interakcję, np. Przez przekserowanie, selekcjonowanie itp.

Możesz uzyskać dostęp do pobranych zatwierdzeń, sprawdzając ich odpowiedniki gałęzie (np. origin/master).

+0

* Lokalne drzewo * tutaj jest trochę mylące; można go łatwo zinterpretować jako * działające drzewo *. – Jubobs

+2

@Jubobs Widzę, jak to może być trochę mylące. Czy możesz zaproponować lepsze sformułowanie? – Mureinik

+0

Powinieneś napisać, że zatwierdzenia są przechowywane w bazie danych obiektu repo, w odpowiedniej gałęzi zdalnego śledzenia (np. 'Origin/master') – Jubobs

2

git fetch nie zmienia stanu drzewa roboczego. W rzeczywistości nie wymaga działającego drzewa: git fetch może pracować w repozytorium bezczynnym (repozytorium, które nie ma działającego drzewa).

Zatwierdzenie Susan tworzy nowy obiekt w jej repozytorium. Ten obiekt nie jest znany w twoim obszarze roboczym, dopóki nie wykonasz pobierania. W tym momencie obiekt staje się dostępny w twojej przestrzeni. Ponieważ obiekt ten jest identyfikowany przez jego skrót, który jest bardzo dużą liczbą całkowitą, prawie na pewno jest różny od (nie koliduje z) żadnego innego obiektu, który już posiadasz.

Oprócz pobrania nowego zatwierdzenia, git fetch zaktualizuje również wskaźniki oddziału zdalnego. Na przykład, przypuśćmy, że gałąź Susan i master była identyczna przed zatwierdzeniem Susan. Po zatwierdzeniu przez Susan jej oddział ma nowe zatwierdzenie, którego nie ma twój. Po wykonaniu git fetch lokalny wskaźnik gałęzi origin/master zostaje zaktualizowany, aby wskazać, że jego głową jest teraz zatwierdzenie Susan. Jednak lokalny oddział master pozostaje niezmieniony.

W tym momencie możesz uruchomić git checkout (bez żadnych argumentów), a otrzymasz komunikat taki jak branch master is behind origin/master by 1 commit and can be fast-forwarded. Wynika to z porównania master i origin/master.

Teraz można zintegrować ze zmianami Susan na kilka sposobów:

  • git rebase: cherry pick zmian, które są tylko w lokalnej master na szczycie nowych zmian w origin/master (co przepisywania ich historię), i sprawić, że wynik będzie nowy HEAD na lokalnym master). Po tym, master jest ściśle wyprzedza origin/master: jest taki sam jak origin/master, plus twoje zmiany.
  • git merge: zachowaj zmiany w stanie nienaruszonym i wygeneruj nowe zatwierdzenie na master, które je zwija i scala. To zatwierdzenie ma dwóch rodziców: poprzednie zatwierdzenie na master (w tym przypadku zatwierdzenie Susan) i ostatnie zatwierdzenie w serii lokalnych zatwierdzeń, w ich oryginalnej formie. Ponownie, master jest teraz ściśle przed origin/master.
  • : W uznaniu Susan, że popełnisz wszystkie swoje prace, przestarzałe, odrzucasz swoją pracę i przesuwasz szybko swoją lokalną master na zmianę Susan. Teraz master jest identyczny z origin/master.

Pierwsze dwie akcje są łączone z git fetch przy użyciu polecenia git pull. git pull wykonuje git fetch, a następnie git merge lub wykonuje git fetch w wykonaniu git rebase. Zachowanie można konfigurować dla każdej gałęzi i istnieje globalna opcja określająca, w jaki sposób należy skonfigurować nowo utworzone gałęzie. Możesz zmienić to zachowanie, używając git pull --rebase lub git pull --rebase lub git pull --rebase lub git pull --rebase.

Ponieważ zmiana lokalna nie zostanie zatwierdzona, nie będzie można wykonywać tych czynności integracyjnych (przekierowywanie lub scalanie). Git chce, abyś najpierw przekształcił zmiany w zatwierdzenie. Nie ma interakcji między nowo pobranymi obiektami, a Ty wprowadzasz zmiany w swoich lokalnych zmianach.

Nie musisz teraz podejmować żadnych działań. Dzięki git fetch, jesteś informowany o działaniach na wyższym szczeblu, bez konieczności natychmiastowej integracji z nimi. Możesz na przykład wykonać git log origin/master, aby zobaczyć, co jest nowe i jak może wpłynąć na twoją pracę. Ale możesz odłożyć to na później i robić nowe poprawki.

Powiązane problemy