TL; DR: git branch --set-upstream-to origin/solaris
Odpowiedź na pytanie, które zadałeś - które przeredaguję trochę jako „czy muszę ustawić nadrzędny kanał” - brzmi: nie, w ogóle nie musisz ustawiać nadrzędnego.
Jeśli jednak nie masz programu nadrzędnego dla bieżącej gałęzi, Git zmieni swoje zachowanie na git push
, a także na inne polecenia.
Cała historia wypychania tutaj jest długa i nudna i sięga do historii sprzed wersji Git 1.5. Aby go bardzo skrócić, git push
został źle wdrożony. 1 Począwszy od wersji 2.0 Git, Git ma teraz pokrętło konfiguracji zapisane push.default
domyślnie na simple
. W przypadku kilku wersji Gita przed i po 2.0, za każdym razem, gdy byłeś uruchamiany git push
, Git wyrzucał dużo hałasu, próbując przekonać Cię do ustawienia push.default
tylko po to, aby się git push
zamknąć.
Nie wspominasz, z której wersji Gita korzystasz, ani czy skonfigurowałeś push.default
, więc musimy zgadnąć. Domyślam się, że używasz wersji Git 2-punktowy coś, a które zostały ustawione push.default
, aby simple
dostać to, żeby się zamknął. Dokładnie to, którą wersję Gita masz i co jeśli cokolwiek push.default
ustawiłeś, ma znaczenie ze względu na tę długą i nudną historię, ale ostatecznie fakt, że otrzymujesz kolejną skargę od Gita, wskazuje, że Twój Git jest skonfigurowany tak, aby uniknąć jednego z błędów z przeszłości.
Co to jest upstream?
Upstream to po prostu inna nazwa oddziału, zwykle zdalnego śledzenia gałąź, wiąże się z regularnym (lokalnych) oddział.
Każda gałąź ma opcję posiadania jednego (1) zestawu upstream. Oznacza to, że każda gałąź albo ma upstream, albo nie ma upstream. Żadna gałąź nie może mieć więcej niż jednego upstream.
Upstream powinien , ale nie musi, być prawidłową gałęzią (czy to zdalne śledzenie, czy lokalne ). Oznacza to, że jeśli bieżąca gałąź B ma upstream U , powinna działać. Jeśli to nie zadziała - jeśli narzeka, że U nie istnieje - to większość Gita działa tak, jakby nadrzędny strumień w ogóle nie był ustawiony. Kilka poleceń, takich jak , pokaże ustawienia nadrzędne, ale oznaczy je jako „nie ma”.origin/B
master
git rev-parse U
git branch -vv
Po co jest upstream?
Jeśli twój push.default
jest ustawiony na simple
lub upstream
, ustawienie nadrzędne sprawi git push
, że użyte bez dodatkowych argumentów po prostu zadziała.
To wszystko - po to wszystko git push
. Ale to dość znaczące, ponieważ git push
jest to jedno z miejsc, w których zwykła literówka powoduje poważne bóle głowy.
Jeśli twój push.default
jest ustawiony na nothing
, matching
lub current
, ustawienie nadrzędnego strumienia nic nie robi git push
.
(Wszystko to przy założeniu, że Twoja wersja Git to co najmniej 2.0).
Upstream wpływa git fetch
Jeśli uruchomisz git fetch
bez dodatkowych argumentów, Git ustali, z którego pilota pobrać, konsultując się z nadrzędnym gałąź bieżącej gałęzi. Jeśli upstream jest gałęzią ze zdalnym śledzeniem, Git pobiera z tego zdalnego. (Jeśli upstream nie jest ustawiony lub jest gałęzią lokalną, Git próbuje pobrać origin
).
Upstream dotyka git merge
i git rebase
zbyt
Jeśli uruchomisz git merge
lub git rebase
bez dodatkowych argumentów, Git użyje upstream z bieżącej gałęzi. Więc skraca użycie tych dwóch poleceń.
Upstream wpływa git pull
I tak nigdy nie powinieneś 2 używać git pull
, ale jeśli to zrobisz, użyj git pull
ustawienia nadrzędnego, aby dowiedzieć się, z którego pilota pobrać, a następnie z którą gałąź połączyć lub ponownie bazować. Oznacza to, że git pull
robi to samo, co - ponieważ git fetch
faktycznie działa git fetch
- a następnie robi to samo, co git merge
lub git rebase
, ponieważ faktycznie działa git merge
lub git rebase
.
(Zwykle powinieneś po prostu wykonać te dwa kroki ręcznie, przynajmniej do czasu, gdy znasz Git na tyle dobrze, że gdy któryś z nich zawiedzie, co w końcu się uda, rozpoznasz, co poszło nie tak i będziesz wiedział, co z tym zrobić.)
Upstream wpływa git status
To może być właściwie najważniejsze. Gdy już masz zestaw nadrzędny, git status
możesz zgłosić różnicę między bieżącą gałęzią a jej nadrzędną pod względem zatwierdzeń.
Jeśli, jak to jest w normalnym przypadku, znajdujesz się w gałęzi B
z jej upstream ustawioną na i uruchomisz , natychmiast zobaczysz, czy masz zatwierdzenia, które możesz wcisnąć i / lub zatwierdzenia, na których możesz scalić lub zmienić bazę.origin/B
git status
Dzieje się tak, ponieważ git status
działa:
git rev-list --count @{u}..HEAD
: Ile commity masz na B
które są nie na ?origin/B
git rev-list --count HEAD..@{u}
: Ile commity masz na które są nie na ?origin/B
B
Utworzenie upstream daje ci wszystkie te rzeczy.
Jak to się master
stało, że ma już zestaw upstream?
Kiedy pierwszy raz klonujesz z jakiegoś pilota, użyj:
$ git clone git://some.host/path/to/repo.git
lub podobnie, ostatnim krokiem, jaki robi Git, jest zasadniczo git checkout master
. Spowoduje to sprawdzenie twojego lokalnego oddziału - master
tylko ty nie masz lokalnego oddziału master
.
Z drugiej strony, nie ma zdalnego śledzenia oddział nazwany origin/master
, ponieważ po prostu go klonować.
Git domyśla się, że musiało to mieć na myśli: „zrób mi nowy lokal, master
który wskazuje na to samo zatwierdzenie co zdalne śledzenie origin/master
, a kiedy już to robisz, ustaw górny strumień na master
to origin/master
”.
Dzieje się tak w przypadku każdej gałęzi git checkout
, której jeszcze nie masz. Git tworzy gałąź i sprawia, że „śledzi” (jako upstream) odpowiednią gałąź zdalnego śledzenia.
Ale to nie działa dla nowych oddziałów, czyli oddziałów bez zdalnego śledzenia oddział jeszcze .
Jeśli utworzysz nowy oddział:
$ git checkout -b solaris
na razie nie ma origin/solaris
. Lokalny solaris
nie może śledzić gałęzi zdalnego śledzenia, origin/solaris
ponieważ nie istnieje.
Kiedy po raz pierwszy pchasz nową gałąź:
$ git push origin solaris
który tworzy solaris
w origin
, a tym samym tworzy również origin/solaris
we własnym repozytorium Git. Ale jest za późno: masz już lokalną sieć, solaris
która nie ma upstream . 3
Czy Git nie powinien po prostu ustawić tego teraz jako nadrzędny automatycznie?
Prawdopodobnie. Zobacz „źle zaimplementowany” i przypis 1. Trudno to teraz zmienić : istnieją miliony 4 skryptów, które używają Git, a niektóre mogą zależeć od jego obecnego zachowania. Zmiana zachowania wymaga nowej głównej wersji, nag-ware wymusi ustawienie jakiegoś pola konfiguracyjnego i tak dalej. Krótko mówiąc, Git jest ofiarą własnego sukcesu: wszelkie błędy, które zawiera, można dziś naprawić tylko wtedy, gdy zmiana jest albo w większości niewidoczna, wyraźnie - znacznie lepsza, albo następuje powoli w czasie.
Faktem jest, że nie dzieje się tak dzisiaj, chyba że używasz --set-upstream
lub -u
podczas git push
. To właśnie mówi wiadomość.
Nie musisz tego robić w ten sposób. Cóż, jak zauważyliśmy powyżej, w ogóle nie musisz tego robić, ale powiedzmy, że chcesz upstream. Już utworzony oddział solaris
na origin
dzięki wcześniejszym naciśnięciu, jak i swoich git branch
pokazów wyjściowych, które już mają origin/solaris
w lokalnym repozytorium.
Po prostu nie masz tego ustawionego jako upstream dla solaris
.
Aby ustawić to teraz, a nie podczas pierwszego naciśnięcia, użyj git branch --set-upstream-to
. Polecenie --set-upstream-to
podrzędne przyjmuje nazwę dowolnej istniejącej gałęzi, na przykład origin/solaris
, i ustawia bieżącą gałąź w górę do tej innej gałęzi.
To wszystko - to wszystko, co robi - ale ma to wszystkie konsekwencje wymienione powyżej. Oznacza to, że możesz po prostu biegać git fetch
, następnie rozglądać się, a następnie biegać git merge
lub git rebase
odpowiednio, a następnie tworzyć nowe zatwierdzenia i biec git push
, bez dodatkowego zamieszania.
1 Prawdę mówiąc, nie było wtedy jasne, czy początkowa implementacja była podatna na błędy. Stało się to jasne dopiero wtedy, gdy każdy nowy użytkownik za każdym razem popełniał te same błędy. Jest teraz „mniej biedny”, co nie znaczy, że jest „wspaniały”.
2 „Nigdy” jest trochę mocne, ale uważam, że nowicjusze Git dużo lepiej rozumieją rzeczy, kiedy oddzielam kroki, zwłaszcza gdy mogę im pokazać, co git fetch
faktycznie zrobiło, i wtedy mogą zobaczyć, co zrobią git merge
lub git rebase
zrobią dalej.
3 Jeśli uruchomisz swoją pierwszą git push
jako — git push -u origin solaris
tj., Jeśli dodasz -u
flagę — Git ustawi origin/solaris
jako nadrzędny dla twojej bieżącej gałęzi, jeśli (i tylko jeśli) push się powiedzie. Więc powinieneś zaopatrywać -u
się przy pierwszym pchnięciu. W rzeczywistości możesz go podać przy dowolnym późniejszym naciśnięciu i w tym momencie ustawi lub zmieni górny strumień. Ale myślę, że git branch --set-upstream-to
jest łatwiej, jeśli zapomniałeś.
4 Mierzone metodą Austina Powersa / Dr Evila, mówiąc po prostu „jeden MILLLL-YUN”.