Zacząłem grać z Git i spotkałem się z terminami „upstream” i „downstream”. Widziałem je wcześniej, ale nigdy nie zrozumiałem ich w pełni. Co oznaczają te terminy w kontekście SCM ( narzędzia do zarządzania konfiguracją oprogramowania ) i kodu źródłowego?
901
Odpowiedzi:
Pod względem kontroli źródła, jesteś „ za ” przy kopiowaniu (klon, kasę, etc) z repozytorium. Informacje płynęły do Ciebie „poniżej”.
Kiedy wprowadzasz zmiany, zwykle chcesz odesłać je z powrotem „w górę ”, aby trafiły do tego repozytorium, aby wszyscy pobierający z tego samego źródła pracowali z tymi samymi zmianami. Jest to głównie kwestia społeczna dotycząca tego, jak każdy może koordynować swoją pracę, a nie techniczny wymóg kontroli źródła. Chcesz wprowadzić zmiany do głównego projektu, aby nie śledzić rozbieżnych linii rozwoju.
Czasami przeczytasz o menedżerach pakietów lub wydaniach (ludzie, nie narzędzie) mówiące o przesyłaniu zmian do „upstream”. Zazwyczaj oznacza to, że musieli dostosować oryginalne źródła, aby mogli stworzyć pakiet dla swojego systemu. Nie chcą ciągle wprowadzać tych zmian, więc jeśli wyślą je „w górę” do oryginalnego źródła, nie powinni mieć do czynienia z tym samym problemem w następnej wersji.
źródło
-u
jakgit push --set-upstream origin master
jeśli nie jest to wymóg techniczny ? Możemypush -u origin
lub niepush origin
, więc jest to wymóg techniczny. Ale jaka jest różnica?Kiedy czytasz na
git tag
stronie podręcznika :, oznacza to po prostu, że nie ma absolutnego repozytorium upstream ani repozytorium downstream.
Te pojęcia są zawsze względne między dwoma repozytoriami i zależą od przepływu danych:
Jeśli „twojeRepo” zadeklarowało „inneRepo” jako zdalne, to :
Zwróć uwagę na „od” i „dla”: nie jesteś tylko „downstream”, jesteś „downstream z / for ”, stąd względny aspekt.
Twórczość DVCS (Distributed Version Control System) polega na tym, że nie masz pojęcia, czym właściwie jest downstream, oprócz własnego repozytorium w stosunku do zadeklarowanych repozytoriów zdalnych.
Gruntownie:
Jeśli chodzi o „ przepływ danych ”, Twoje repozytorium znajduje się na dole („downstream”) przepływu pochodzącego z repozytoriów upstream („pull from”) i wraca do (tego samego lub innych) repozytoriów upstream („push to” ).
Możesz zobaczyć ilustrację na
git-rebase
stronie podręcznika z akapitem „ODZYSKIWANIE Z REBASE UPSTREAM”:Oznacza to, że wyciągasz z repozytorium „upstream”, w którym miał miejsce rebase , a ty (repozytorium „downstream”) utkniesz z konsekwencją (wiele duplikatów zatwierdzeń, ponieważ gałąź rebased upstream odtworzyła zatwierdzenia tej samej gałęzi, którą ty lokalnie).
Jest to złe, ponieważ dla jednego repozytorium „upstream” może istnieć wiele repozytoriów downstream (tj. Repozytoria ściągające z repozytorium upstream, z rebased gałąź), z których wszystkie potencjalnie mają do czynienia z duplikatami commits.
Ponownie, z analogią „przepływu danych” w DVCS, jedno złe polecenie „w górę” może mieć „ efekt tętnienia ” w dół.
Uwaga: nie ogranicza się to do danych.
Dotyczy to również parametrów , ponieważ polecenia git (takie jak „porcelanowe”) często wywołują wewnętrznie inne polecenia git („hydrauliczne”). Zobacz
rev-parse
stronę podręcznika :źródło
Śledzenie w górę (w powiązaniu z)
Termin „ upstream” ma również pewne jednoznaczne znaczenie, jeśli chodzi o zestaw narzędzi GIT, szczególnie w odniesieniu do śledzenia
Na przykład :
origin
(twoje rozwidlone repo na github) iupstream
(repo na github, z którego rozwidliłeś się). To tylko wymienne nazwy, tylko adres URL „git @ ...” je identyfikuje.Powiedzmy, że chcesz ustawić źródło / gałąź zdalnej gałęzi jako gałąź śledzenia dla lokalnej gałęzi głównej, którą sprawdziłeś. Wystarczy wydać:
Upstream and Push (Gotcha)
spójrz na
git-config(1)
stronę podręcznikaźródło
git branch --help
na 2018 r .:As this option had confusing syntax, it is no longer supported. Please use --track or --set-upstream-to instead.
To trochę nieformalna terminologia.
Jeśli chodzi o Git, każde inne repozytorium jest tylko zdalne.
Ogólnie rzecz biorąc, w górę rzeki jest miejsce, z którego sklonowałeś (pochodzenie). Downstream to każdy projekt, który integruje twoją pracę z innymi pracami.
Warunki nie są ograniczone do repozytoriów Git.
Na przykład Ubuntu jest pochodną Debiana, więc Debian jest wcześniejszy dla Ubuntu.
źródło
Upstream nazywany szkodliwym
Istnieje, niestety, inne zastosowanie „upstream”, do którego inne odpowiedzi tutaj nie docierają, a mianowicie odniesienie się do relacji między rodzicami a dziećmi w ramach repo. Scott Chacon w książce Pro Git jest na to szczególnie podatny, a wyniki są niefortunne. Nie naśladuj tego sposobu mówienia.
Na przykład, mówi o fuzji powodującej szybkie przewijanie do przodu, że tak się dzieje, ponieważ
Chce powiedzieć, że zatwierdzenie B jest jedynym dzieckiem jedynego dziecka ... jedynego dziecka popełnienia A, więc aby połączyć B w A, wystarczy przesunąć odnośnik A, aby wskazał zatwierdzenie B. Dlaczego ten kierunek należy nazwać „upstream”, a nie „downstream”, lub dlaczego geometria takiego czysto prostego wykresu powinna być opisana jako „bezpośrednio upstream”, jest całkowicie niejasna i prawdopodobnie dowolna. (Strona man dla
git-merge
o wiele lepiej wyjaśnia wyjaśnienie tego związku, gdy mówi, że „obecny szef oddziału jest przodkiem nazwanego zatwierdzenia.” To jest coś, co Chacon powinien powiedzieć.)Rzeczywiście, sam Chacon wydaje się używać później słowa „downstream”, co znaczy dokładnie to samo, kiedy mówi o przepisaniu wszystkich potomnych zatwierdzeń usuniętego zatwierdzenia:
Zasadniczo wydaje się, że nie ma żadnego jasnego pojęcia, co rozumie przez „upstream” i „downstream”, odnosząc się do historii zmian w czasie. Takie użycie jest zatem nieformalne i nie należy do niego zachęcać, ponieważ jest po prostu mylące.
Jest zupełnie jasne, że każde zatwierdzenie (oprócz jednego) ma co najmniej jednego rodzica, a zatem rodzice rodziców są przodkami; a w przeciwnym kierunku, zobowiązania mają dzieci i potomków. Jest to przyjęta terminologia i jednoznacznie opisuje kierunkowość wykresu, więc jest to sposób na rozmowę, gdy chcesz opisać, w jaki sposób zatwierdzenia odnoszą się do siebie w ramach geometrii wykresu repo. W tej sytuacji nie używaj luźno „upstream” lub „downstream”.
[Dodatkowa uwaga: zastanawiałem się nad związkiem między pierwszym cytowanym
git-merge
przeze mnie zdaniem Chacon a stroną podręcznika użytkownika i przychodzi mi do głowy, że to pierwsze może wynikać z nieporozumienia drugiego. Strona man opisuje dalej sytuację, w której użycie „upstream” jest uzasadnione: szybkie przewijanie często ma miejsce, gdy „śledzisz repozytorium upstream, nie dokonałeś żadnych lokalnych zmian, a teraz chcesz zaktualizować do nowszej weryfikacja wstępna. ” Być może więc Chacon użył „upstream”, ponieważ zobaczył to tutaj na stronie podręcznika. Ale na stronie podręcznika znajduje się zdalne repozytorium; w przytoczonym przykładzie Chakona szybkiego przewijania nie ma zdalnego repozytorium, tylko kilka lokalnie utworzonych gałęzi.]źródło
<branch>
.git-rebase
dokumentacji, ponieważ byłem całkowicie zdezorientowany, dlaczego sędzia zatwierdzający miałby nazywać się tam „w górę” (w rzeczywistości wątpiłem w siebie, ponieważ nie znałem tej terminologii wcześniej). Dzięki @outis i @matt za uporządkowanie sprawy!