Skonfigurowałem kilka gałęzi zdalnego śledzenia w git, ale wydaje mi się, że nigdy nie jestem w stanie scalić ich z lokalnym oddziałem po zaktualizowaniu ich za pomocą „git fetch”.
Na przykład załóżmy, że mam zdalną gałąź o nazwie „an-other-branch”. Skonfigurowałem to lokalnie jako gałąź śledzenia przy użyciu
git branch --track an-other-branch origin/an-other-branch
Na razie w porządku. Ale jeśli ta gałąź zostanie zaktualizowana (zwykle przez przeniesienie maszyny i zatwierdzenie z tej maszyny), a chcę ją zaktualizować na oryginalnej maszynie, mam problem z pobieraniem / scalaniem:
git fetch origin an-other-branch
git merge origin/an-other-branch
Za każdym razem, gdy to robię, otrzymuję komunikat „Już aktualny” i nic się nie łączy.
Jednak plik
git pull origin an-other-branch
zawsze aktualizuje go zgodnie z oczekiwaniami.
Uruchomienie git diff
git diff origin/an-other-branch
pokazuje, że istnieją różnice, więc wydaje mi się, że mam błędną składnię.
Co ja robię źle?
EDYCJA [2010-04-09]: Sprawdziłem kilka razy i na pewno nie jestem na innej gałęzi. Czy moje „pobieranie git”, po którym następuje „git merge” (jak pokazano powyżej), powinno zrobić dokładnie to samo, co polecenie git pull? Otrzymam przepływ pracy pokazujący wyniki statusu gita itp.
git fetch origin an-other-branch
przechowuje pobraną wskazówkęFETCH_HEAD
, ale nieorigin/an-other-branch
(tj. Zwykła „gałąź zdalnego śledzenia”). Można by to zrobićgit fetch origin an-other-branch && git merge FETCH_HEAD
, ale robienie tego tak, jak mówi @Gareth, jest lepsze (lub po prostu użyj git pull ).git merge origin/an-other-branch
łączyćorigin/an-other-branch
do wszystkich lokalnych oddziałów, które są ustawione, aby ją śledzić? jak mogę połączyć się tylko z jednym lokalnym oddziałem?git pull
(bez argumentów) - którą gałąź łączy? Czy łączy gałąź zdalnego śledzenia odpowiadającą bieżącej gałęzi?Wybór tylko jednej gałęzi:
fetch
/merge
vs.pull
Ludzie często radzą ci oddzielić „pobieranie” od „scalania”. Zamiast tego mówią:
Zrób to:
Nie wspominają o tym, że takie polecenie pobierania faktycznie pobierze wszystkie gałęzie ze zdalnego repozytorium, co nie jest tym, co robi to polecenie pull. Jeśli masz tysiące oddziałów w zdalnym repozytorium, ale nie chcesz widzieć ich wszystkich, możesz uruchomić to niejasne polecenie:
Oczywiście jest to absurdalnie trudne do zapamiętania, więc jeśli naprawdę chcesz uniknąć pobierania wszystkich gałęzi, lepiej zmienić swoje,
.git/config
jak opisano w ProGit.Co?
Najlepsze wyjaśnienie tego wszystkiego znajduje się w rozdziale 9-5 programu ProGit, Git Internals - The Refspec ( lub przez github ). To niezwykle trudne do znalezienia w Google.
Najpierw musimy wyjaśnić pewną terminologię. W przypadku śledzenia oddziałów zdalnych istnieją zazwyczaj 3 różne gałęzie, o których należy pamiętać:
refs/heads/branchB
wewnątrz drugiego repozytoriumrefs/remotes/remoteR/branchB
w Twoim repozytoriumrefs/heads/branchB
wewnątrz swojej repoGałęzie zdalnego śledzenia (in
refs/remotes
) są tylko do odczytu. Nie modyfikujesz ich bezpośrednio. Modyfikujesz własną gałąź, a następnie wypychasz ją do odpowiedniej gałęzi w zdalnym repozytorium. Wynik nie jest odzwierciedlany w twoim,refs/remotes
dopóki nie nastąpi odpowiednie wyciągnięcie lub pobranie. To rozróżnienie było dla mnie trudne do zrozumienia na podstawie stron podręcznika git, głównie dlatego, że lokalna gałąź (refs/heads/branchB
) "śledzi" gałąź zdalnego śledzenia podczas.git/config
definiowaniabranch.branchB.remote = remoteR
.Pomyśl o „referencjach” jak o wskaźnikach C ++. Fizycznie są to pliki zawierające skróty SHA, ale w zasadzie są tylko wskaźnikami do drzewa zatwierdzeń.
git fetch
doda wiele węzłów do twojego drzewa zatwierdzeń, ale to, jak git decyduje, które wskaźniki przenieść, jest nieco skomplikowane.Jak wspomniano w innej odpowiedzi , też nie
ani
ruszyłby się
refs/remotes/branches/branchB
, a ten drugi z pewnością nie może się poruszyćrefs/heads/branchB
. Jednak obaj się ruszająFETCH_HEAD
. (Możnacat
każdy z tych plików wewnątrz.git/
, aby zobaczyć, kiedy się zmieniają.) Igit merge
będzie odnosić się doFETCH_HEAD
, natomiast ustawienieMERGE_ORIG
, etc.źródło
Czy na pewno jesteś w lokalnej sieci
an-other-branch
podczas łączenia?Inne wyjaśnienie :
Ale w twoim przypadku, jeśli
git pull
działa, oznacza to po prostu, że nie jesteś na właściwej gałęzi.źródło
Git pull jest w rzeczywistości narzędziem combo: uruchamia git fetch (pobieranie zmian) i git merge (scalanie ich z bieżącą kopią)
Czy na pewno jesteś we właściwej gałęzi?
źródło
oto polecenia:
jeśli zrobisz to w drugiej linii:
spróbuje połączyć lokalny master z twoją bieżącą gałęzią.
Pytanie, jak to zrozumiałem, czy zostało już pobrane lokalnie i chcesz teraz połączyć swój oddział z najnowszym z tego samego oddziału.
źródło