Właśnie zauważyłem coś dziwnego git pull
, czego nie rozumiem.
W piątek pracowałem w lokalnym oddziale. nazwijmy to mybranch
. Przed opuszczeniem biura pchnąłem go do źródła (czyli mojego repozytorium na githubie):git push origin mybranch
.
Wczoraj w domu, ja pull
ściągnąłem moją gałąź do laptopa, trochę zakodowałem, a potem przeniosłem moje zmiany z powrotem na github (pochodzenie).
Teraz znowu jestem w pracy i próbowałem przenieść zmiany z wczoraj na mój komputer roboczy (w weekend nie zmieniłem niczego w lokalnym repozytorium mojego miejsca pracy):
git pull origin mybranch
co spowodowało szybkie scalanie do przodu, co jest w porządku. Wtedy zrobiłem git status
i powiedział:
# On branch mybranch
# Your branch is ahead of 'origin/mybranch' by 6 commits.
#
nothing to commit (working directory clean)
Co? Jak to może być 6 zatwierdzeń do przodu, skoro nawet go nie dotykałem w weekend, a po prostu wyciągałem z początku? Więc uruchomiłemgit diff origin/mybranch
i różnice były dokładnie tymi 6 zmianami, które właśnie wyciągnąłem z pilota.
Mogłem to „naprawić” tylko uruchamiając git fetch origin
:
From [email protected]:me/project
af8be00..88b0738 mybranch -> origin/mybranch
Najwyraźniej w moim lokalnym repozytorium brakowało niektórych obiektów referencyjnych, ale jak to możliwe? Chodzi mi o to, że ciągnięcie już pobiera, a ja nie pracowałem na niczym oprócz tej gałęzi, więc a git fetch origin
igit fetch origin mybranch
powinien mieć ten sam wynik?
Czy powinienem zawsze używać git pull origin
zamiast git pull origin branchname
?
Jestem zmieszany.
źródło
git push
także wydaje się, że rozwiązuje ten problem (raportowanie „wszystkie aktualne”).git config --get-regexp br.*
może ci powiedzieć, czy twoja konfiguracja ma lokalny oddział śledzi inny oddziałgit config branch.master.remote yourGitHubRepo.git
swoje workRepo i sprawdzić (przy następnymgit pull origin
), czy status pozostaje z ostrzeżeniem „z wyprzedzeniem”?git remote show origin
pokazuje mi, że początek wskazuje na moje repozytorium GitHub, więc myślę, że powinno być w porządku?Your branch is ahead
komunikatu ostrzegawczego „ ” po znakugit pull
, musisz najpierw zdefiniować również zdalną nazwę dla gałęzi . Stąd moja sugestia: wpiszgit config branch.master.remote yourGitHubRepo.git
, a następnie spróbuj agit pull
i agit status
i zobacz, czy problem nadal występuje.Odpowiedzi:
git pull
wywołujegit fetch
z odpowiednimi parametrami przed scaleniem jawnie pobranych głowic (lub, jeśli nie ma, zdalnej gałęzi skonfigurowanej do scalania) do bieżącej gałęzi.Składnia:
git fetch <repository> <ref>
gdzie<ref>
to tylko nazwa gałęzi bez dwukropka to pobieranie „jednorazowe”, które nie wykonuje standardowego pobierania wszystkich śledzonych gałęzi określonego pilota, ale zamiast tego pobiera tylko nazwaną gałąź doFETCH_HEAD
.Aktualizacja: dla wersji Git od 1.8.4, jeśli istnieje zdalna gałąź śledzenia, która śledzi ref, który prosiłeś o pobranie, gałąź śledzenia zostanie teraz zaktualizowana przez
fetch
. Ta zmiana została wprowadzona specjalnie w celu uniknięcia zamieszania spowodowanego przez poprzednie zachowanie.Kiedy wykonujesz
git pull <repository> <ref>
,FETCH_HEAD
jest aktualizowany jak powyżej, a następnie scalany z wyewidencjonowanym plikiem,HEAD
ale żadna ze standardowych gałęzi śledzenia dla zdalnego repozytorium nie zostanie zaktualizowana (Git <1.8.4). Oznacza to, że lokalnie wygląda na to, że wyprzedzasz zdalną gałąź, podczas gdy w rzeczywistości jesteś z nią na bieżąco.Osobiście zawsze robię to
git fetch
,git merge <remote>/<branch>
ponieważ widzę ostrzeżenia o wymuszonych aktualizacjach przed scaleniem i mogę wyświetlić podgląd tego, co się scalam. Gdybym użyłgit pull
trochę więcej niż robię, zrobiłbym zwykłygit pull
bez parametrów czasu, polegając nabranch.<branch>.remote
ibranch.<branch>.merge
„postępując właściwie”.źródło
git fetch
pogit pull <repository> <ref>
rozwiązaniu problemu, ponieważ pobieranie zaktualizowałoby standardowe gałęzie śledzenia? Również dzięki za tę odpowiedź, która zaczyna mieć sens :)git fetch
a następniegit merge origin/master master
.Co
git remote -v show
zwraca, jeśli chodzi o pochodzenie?Jeśli źródło wskazuje na github, stan powinien być aktualny i nie wyprzedzać żadnego zdalnego repozytorium. Przynajmniej z Git1.6.5 używam do szybkiego testu.
W każdym razie, aby tego uniknąć, zdefiniuj jawnie zdalne repozytorium gałęzi głównej:
następnie a
git pull origin master
, po którym następuje a,git status
powinny zwrócić stan czysty (nie z wyprzedzeniem).Czemu? ponieważ wzorzec pochodzenia pobierania pobierania (zawarty w wzorcu pochodzenia git pull) nie tylko aktualizowałby
FETCH_HEAD
(jak wyjaśnia w swojej odpowiedzi Charles Bailey ), ale także aktualizowałby „zdalną gałąź główną” w lokalnym repozytorium Git. W takim przypadku twój lokalny master nie wydaje się już być „przed” zdalnym masterem.Mogę to przetestować za pomocą git1.6.5:
Najpierw tworzę workrepo:
Symuluję repozytorium GitHub, tworząc gołe repozytorium (takie, które może otrzymywać push z dowolnego miejsca)
Dodaję modyfikację do mojego działającego repozytorium, którą wciskam do repozytorium github (dodanego jako zdalne)
Tworzę repozytorium domowe, sklonowane z GitHuba, w którym dokonuję kilku modyfikacji, wypychanych do GitHuba:
Następnie klonuję workrepo do pierwszego eksperymentu
W tym repozytorium status git wspomina o masteringu przed „
origin
”:Ale to tylko
origin
nie jest github:Ale jeśli powtórzę sekwencję w repozytorium, które ma początek w githubie (lub w ogóle nie ma źródła, zdefiniowano tylko zdalny „github”), status jest czysty:
Gdybym tylko
origin
wskazywał nagithub
,status
byłby czysty dla git1.6.5.Może to być ostrzeżenie „z wyprzedzeniem” dla wcześniejszego gita, ale tak czy inaczej,
git config branch.master.remote yourGitHubRepo.git
zdefiniowany wyraźnie powinien być w stanie się tym zająć, nawet we wczesnych wersjach Gita.źródło
git remote show origin
.Czy starasz się dodać cały pilot (z wyjątkiem tego,
origin
który jest dostarczany z oryginalnym klonem) za pomocągit remote add NAME URL
? Widziałem ten błąd, kiedy właśnie zostały dodane do konfiguracji git.źródło
git checkout -b mybranch origin/mybranch
. Zgodnie ze stroną podręcznika systemowego git-branch, origin / mybranch jest punktem początkowym, a ponadto podaje --track: "... Użyj tego, jeśli zawsze przeciągasz z tej samej gałęzi upstream do nowej gałęzi i jeśli nie chcesz jawnie używać polecenia „git pull <repository> <refspec>”. To zachowanie jest domyślne, gdy punktem początkowym jest zdalna gałąź. "