Wersja TL; DR: gałąź zdalnego śledzenia origin/master
kiedyś istniała, ale teraz jej nie ma, więc lokalna gałąź source
śledzi coś, co nie istnieje, co jest w najlepszym przypadku podejrzane - oznacza to, że inna funkcja Git nie jest w stanie nic dla Ciebie zrobić - i Git ostrzega Cię przed tym. Dobrze sobie radziłeś bez funkcji „śledzenia nadrzędnego” działającej zgodnie z przeznaczeniem, więc od Ciebie zależy, czy cokolwiek zmienisz.
Aby zapoznać się z innymi ustawieniami nadrzędnymi, zobacz Dlaczego muszę używać polecenia „git push --set-upstream origin <branch>”?
To ostrzeżenie to nowa rzecz w Git, pojawiająca się jako pierwsza w Git 1.8.5. Uwagi do wydania zawierają tylko jeden krótki punkt na ten temat:
- „git branch -v -v” (i „git status”) nie rozróżnia gałęzi, która nie jest oparta na żadnej innej gałęzi, gałęzi, która jest zsynchronizowana z gałęzią upstream i gałęzi skonfigurowanej z odgałęzieniem upstream gałąź, która już nie istnieje.
Aby opisać, co to znaczy, musisz najpierw wiedzieć o „zdalnych zdalnych lokalizacjach”, „zdalnych gałęziach śledzenia” oraz o tym, jak Git obsługuje „śledzenie nadrzędnych”. ( Gałęzie zdalnego śledzenia to strasznie wadliwy termin - zamiast tego zacząłem używać nazw zdalnego śledzenia , co moim zdaniem jest niewielkim ulepszeniem. Poniżej jednak użyję „gałęzi zdalnego śledzenia”, aby zachować spójność z dokumentacją Gita. )
Każdy „remote” to po prostu nazwa, jak origin
i octopress
w tym przypadku. Ich celem jest rejestrowanie takich rzeczy, jak pełne adresy URL miejsc, z których korzystasz git fetch
lub git pull
aktualizacje. Gdy używasz 1, Git przechodzi do tego pilota (używając zapisanego adresu URL) i przynosi odpowiedni zestaw aktualizacji. Rejestruje również aktualizacje przy użyciu „gałęzi zdalnego śledzenia”.git fetch remote,
„Gałąź zdalnego śledzenia” (lub nazwa zdalnego śledzenia) to po prostu zapis nazwy gałęzi, tak jak ostatnio widziano na „zdalnym”. Każdy pilot jest sam w sobie repozytorium Git, więc ma gałęzie. Gałęzie na zdalnym „źródle” są zapisywane w lokalnym repozytorium pod remotes/origin/
. Tekst, który pokazał mówi, że tam jest oddział nazwany source
na origin
, a gałęzie nazwie 2.1
, linklog
i tak dalej na octopress
.
(„Normalna” lub „lokalna” gałąź to oczywiście tylko nazwa gałęzi, którą utworzyłeś we własnym repozytorium).
Na koniec możesz skonfigurować gałąź (lokalną), aby „śledzić” „gałąź zdalnego śledzenia”. Gdy gałąź lokalna L
jest ustawiona na śledzenie gałęzi ze zdalnym śledzeniem R
, Git wywoła R
jej „upstream” i powie ci, czy jesteś „przed” i / lub „za” nadrzędnym (pod względem zatwierdzeń). To normalne (nawet godne polecenia), że lokalny oddział i gałęzie zdalnego śledzenia używają tej samej nazwy (z wyjątkiem zdalnej części prefiksu), jak source
i origin/source
, ale nie jest to w rzeczywistości konieczne.
W tym przypadku tak się nie dzieje. Masz oddział lokalny, który source
śledzi oddział ze zdalnym śledzeniem origin/master
.
Nie musisz znać dokładnej mechaniki, jak Git konfiguruje lokalną gałąź do śledzenia zdalnego, ale są one istotne poniżej, więc pokażę, jak to działa. Zaczynamy od lokalnej nazwy oddziału, source
. Istnieją dwa wpisy konfiguracji używające tej nazwy, pisane branch.source.remote
i branch.source.merge
. Z danych wyjściowych, które pokazałeś, jasno wynika, że oba są ustawione, więc po uruchomieniu podanych poleceń zobaczysz następujące informacje:
$ git config --get branch.source.remote
origin
$ git config --get branch.source.merge
refs/heads/master
Kładzenie to razem, 2 to mówi Git że oddział source
śledzi „zdalnego śledzenia oddział” origin/master
.
Ale teraz spójrz na wynik programu git branch -a
, który pokazuje wszystkie nazwy gałęzi śledzenia lokalnego i zdalnego w twoim repozytorium. Nazwy zdalnego śledzenia są wymienione pod remotes/
... i nie maremotes/origin/master
. Prawdopodobnie był kiedyś, ale teraz go nie ma.
Git informuje Cię, że możesz usunąć informacje o śledzeniu za pomocą --unset-upstream
. Spowoduje to usunięcie zarówno branch.source.origin
i branch.source.merge
, jak i zatrzymanie ostrzeżenia.
Wydaje się dość prawdopodobne, że to, czego chcesz, to jednak przejście od śledzenia origin/master
do śledzenia czegoś innego: prawdopodobnie origin/source
, ale może jedna z octopress/
nazw.
Można to zrobić z git branch --set-upstream-to
, 3 , np:
$ git branch --set-upstream-to=origin/source
(zakładając, że nadal znajdujesz się w „źródle” gałęzi, a to origin/source
jest żądane źródło - nie ma sposobu, abym mógł stwierdzić, który z nich, jeśli w ogóle, chcesz.
(Zobacz także: Jak zmienić istniejącą ścieżkę gałęzi Git na gałąź zdalną? )
Myślę, że sposób, w jaki tu trafiłeś, jest taki, że kiedy pierwszy raz zrobiłeś coś git clone
, z czego sklonowałeś, miało gałąź master
. Miałeś również gałąź master
, która była ustawiona na śledzenie origin/master
(jest to normalna, standardowa konfiguracja dla gita). Oznaczało to, że miałeś branch.master.remote
i branch.master.merge
ustawiłeś, na origin
i refs/heads/master
. Ale potem twój origin
pilot zmienił nazwę z master
na source
. Wydaje mi się, że zmieniłeś również lokalną nazwę z master
na source
. Zmieniło to nazwy twoich ustawień, od branch.master.remote
do branch.source.remote
i od branch.master.merge
do branch.source.merge
... ale pozostawiło stare wartości , więc branch.source.merge
teraz było błędne.
W tym momencie zepsuło się połączenie „upstream”, ale w wersjach Gita starszych niż 1.8.5 Git nigdy nie zauważył zepsutego ustawienia. Teraz, gdy masz 1.8.5, wskazuje to na to.
To obejmuje większość pytań, ale nie dotyczy pytania „czy muszę to naprawić”. Jest prawdopodobne, że od lat zajmujesz się załamaniem, robiąc (np .). Jeśli będziesz to robić dalej, problem będzie nadal działać - więc nie, nie musisz tego naprawiać. Jeśli chcesz, możesz użyć do usunięcia upstream i zatrzymania skarg, ale nie oznaczaj lokalnego oddziału jako posiadającego w ogóle żadnego upstream.git pull remote branch
git pull origin source
--unset-upstream
source
Celem posiadania upstream jest uczynienie różnych operacji wygodniejszymi. Na przykład, git fetch
po którym następuje git merge
generalnie „zrobi to, co należy”, jeśli pierwszeństwo jest ustawione poprawnie, a git status
po nim git fetch
powie Ci, czy twoje repozytorium pasuje do tego głównego dla tej gałęzi.
Jeśli chcesz wygody, zresetuj upstream.
1git pull
zastosowań git fetch
, a od Git 1.8.4, to (wreszcie!) Aktualizuje również „zdalnego śledzenia oddział” informacji. W starszych wersjach Git, aktualizacje nie nagrane na zdalne śledzenie oddziałów z git pull
tylko z git fetch
. Ponieważ Twój Git musi być w wersji co najmniej 1.8.5, nie stanowi to dla Ciebie problemu.
2 Cóż, to plus linia konfiguracji, którą celowo ignoruję, a która znajduje się pod remote.origin.fetch
. Git musi zmapować nazwę „merge”, aby dowiedzieć się, że pełna nazwa lokalna zdalnego oddziału to refs/remotes/origin/master
. Jednak mapowanie prawie zawsze działa właśnie w ten sposób, więc można przewidzieć, że tak master
się stanie origin/master
.
3 Lub za pomocą git config
. Jeśli chcesz tylko ustawić nadrzędny kanał origin/source
na jedyną część, która musi się zmienić, to branch.source.merge
i git config branch.source.merge refs/heads/source
zrobiłbyś to. Ale --set-upstream-to
mówi, co chcesz zrobić, zamiast zmuszać cię do robienia tego ręcznie, więc to jest „lepszy sposób”.
Odpowiedź Tarka jest prawdopodobnie idealna, ale chciałem tylko, aby w rekordzie wspomniano o innym przypadku, który jest inny niż ten opisany w pierwotnym pytaniu, ale może pojawić się ten sam błąd (może pomóc innym z podobnym problemem):
Utworzyłem puste (nowe) repozytorium
git init --bare
na jednym z moich serwerów. Następniegit clone
umieściłem go w lokalnym obszarze roboczym na moim komputerze.Po zatwierdzeniu pojedynczej wersji w lokalnym repozytorium otrzymałem ten błąd po wywołaniu
git status
.Idąc za odpowiedzią Torka, rozumiem, że stało się tak, że pierwsze zatwierdzenie repozytorium lokalnego katalogu roboczego utworzyło gałąź „master”. Ale na zdalnym repozytorium (na serwerze) nigdy nic nie było, więc nie było nawet gałęzi „master” (zdalne / źródło / master).
Po uruchomieniu
git push origin master
z lokalnego repozytorium zdalne repozytorium miało wreszcie gałąź główną. To powstrzymało pojawianie się błędu.Podsumowując - można otrzymać taki błąd dla nowego zdalnego repozytorium z zerową liczbą zatwierdzeń, ponieważ nie ma ono żadnej gałęzi, w tym „master”.
źródło
On branch source Your branch is based on 'origin/master', but the upstream is gone. (use "git branch --unset-upstream" to fixup)
i chociaż subiektywny, jest bardziej prawdopodobne, że jest to spowodowane sklonowaniem pustego repozytorium, tak świetnego, że można tu znaleźć alternatywną odpowiedź.To może rozwiązać twój problem.
po wprowadzeniu zmian możesz to zatwierdzić, a następnie
mam nadzieję, że to działa dla Ciebie.
dzięki
źródło
Dla mnie
.git/refs/origin/master
się skorumpował.Wykonałem następujące czynności, które rozwiązały problem.
źródło
Właściwie torek powiedział ci już, jak używać narzędzi znacznie lepiej, niż ja byłbym w stanie zrobić. Jednak w tym przypadku myślę, że ważne jest, aby zwrócić uwagę na coś szczególnego, jeśli będziesz postępować zgodnie z wytycznymi na http://octopress.org/docs/deploying/github/ . Mianowicie, będziesz mieć wiele repozytoriów github w swojej konfiguracji. Przede wszystkim ten, w którym cały kod źródłowy Twojej witryny internetowej znajduje się powiedzmy w katalogu
$WEBSITE
, a następnie ten, w którym znajdują się tylko statyczne pliki generowane$WEBSITE/_deploy
. Zabawne w instalacji jest to, że.gitignore
w$WEBSITE
katalogu znajduje się plik, dzięki czemu ta konfiguracja faktycznie działa.Wystarczające wprowadzenie. W takim przypadku błąd może również pochodzić z repozytorium w
_deploy
.W
.git/config
normalnie będziesz musiał znaleźć coś takiego:Ale w twoim przypadku master oddziału nie ma pilota.
Które możesz rozwiązać poprzez:
Więc wszystko jest tak, jak powiedział ci torek, ale może być ważne, aby zwrócić uwagę, że to bardzo dobrze może dotyczyć
_deploy
katalogu, a nie katalogu głównego twojej witryny.PS: Może warto byłoby użyć powłoki takiej jak
zsh
zgit
wtyczką, aby w przyszłości nie zostać ugryzionym przez tę rzecz. Natychmiast pokaże, że_deploy
dotyczy innego repozytorium.źródło
Miałem to pytanie dwukrotnie i zawsze było to spowodowane uszkodzeniem pliku pamięci podręcznej git w moim lokalnym oddziale. Naprawiłem to, zapisując brakujący skrót zatwierdzenia w tym pliku. Otrzymałem właściwy hash commita z serwera i uruchomiłem lokalnie następujące polecenie:
źródło
Problem: Twoja gałąź jest oparta na `` źródle / wzorcu '', ale upstream zniknął.
Rozwiązanie: git branch --unset-upstream
źródło
usuń swój lokalny oddział, wykonując następujące polecenie
możesz też zrobić
który w zasadzie wymusza usunięcie (nawet jeśli lokalny nie jest scalony ze źródłem)
źródło