Co to jest gałąź śledzenia?

173

Czy ktoś może wyjaśnić „gałąź śledzenia” w odniesieniu do gita?

Oto definicja z git-scm.com :

„Gałąź śledząca” w Git to lokalna gałąź połączona ze zdalnym oddziałem. Kiedy pchasz i ciągniesz tę gałąź, automatycznie popycha i ciągnie do gałęzi zdalnej, z którą jest połączona.

Użyj tego, jeśli zawsze ściągasz z tej samej gałęzi upstream do nowej gałęzi i jeśli nie chcesz jawnie używać "git pull".

Niestety, będąc nowym w git i pochodzącym z SVN, ta definicja nie ma dla mnie absolutnie żadnego sensu.

Czytam „ The Pragmatic Guide to Git ” (tak przy okazji, świetna książka) i wydaje mi się, że sugerują oni, że śledzenie gałęzi jest dobrą rzeczą i że po utworzeniu pierwszego pilota (w tym przypadku pochodzenia) należy skonfiguruj gałąź główną jako gałąź śledzącą, ale niestety nie wyjaśnia, dlaczego gałąź śledząca jest dobra, ani jakie korzyści uzyskasz, konfigurując gałąź główną jako gałąź śledzącą repozytorium pochodzenia .

Czy ktoś może mnie oświecić (po angielsku)?

jerhinesmith
źródło
6
Jedna uwaga terminologiczna: ścieżka słów w Git jest bardzo mocno przeciążona. Niektóre pliki są śledzone, a inne nie ; niektóre nazwy oddziałów nazywane są gałęziami zdalnego śledzenia; i możesz użyć --trackopcji, aby utworzyć gałąź (lokalną), która ma jedną z tych gałęzi zdalnego śledzenia ustawioną jako nadrzędną . Terminologia ewoluowała nieco między 2006 a 2019 rokiem, więc różni ludzie mogą czasami oznaczać coś innego przez każde z tych słów.
torek
Osobiście zalecam używanie wyrażenia nazwy zdalnego śledzenia zamiast gałęzi zdalnego śledzenia , po części dlatego, że słowo gałąź jest również dość przeciążone. Nazwy zdalnego śledzenia to te, które wyglądają origin/master: są w twoim repozytorium, ale są sposobem twojego Gita na zapamiętywanie nazw gałęzi, jak widać w innym repozytorium Git o godz origin. Jeśli następnie użyć słowa upstream , który jest bardziej nowoczesny termin, aby powiedzieć, że twój masterzostał origin/masterustawiony jako Upstream , można uniknąć wszelkich nieporozumień tej terminologii.
torek

Odpowiedzi:

141

Książka ProGit ma bardzo dobre wyjaśnienie :

Oddziały śledzące

Wyrejestrowanie lokalnego oddziału ze zdalnego oddziału automatycznie tworzy tak zwaną gałąź śledzącą. Oddziały śledzące to oddziały lokalne, które są bezpośrednio powiązane z oddziałem zdalnym. Jeśli korzystasz z gałęzi śledzenia i git pushpiszesz, Git automatycznie wie, na który serwer i gałąź należy wypchnąć. Ponadto uruchomienie git pullw jednej z tych gałęzi powoduje pobranie wszystkich zdalnych odwołań, a następnie automatyczne scalenie w odpowiedniej gałęzi zdalnej.

Kiedy klonujesz repozytorium, generalnie automatycznie tworzy ono gałąź główną, która śledzi początek / wzorzec. Dlatego git pushi git pulldziałaj po wyjęciu z pudełka, bez innych argumentów. Możesz jednak skonfigurować inne gałęzie śledzenia, jeśli chcesz - takie, które nie śledzą gałęzi na początku i nie śledzą gałęzi głównej. Prosty przypadek to przykład, który właśnie widziałeś, bieganie git checkout -b [branch] [remotename]/[branch]. Jeśli masz Git w wersji 1.6.2 lub nowszej, możesz również użyć --trackskrótu:

$ git checkout --track origin/serverfix
Branch serverfix set up to track remote branch refs/remotes/origin/serverfix.
Switched to a new branch "serverfix"

Aby skonfigurować oddział lokalny o innej nazwie niż oddział zdalny, możesz łatwo użyć pierwszej wersji z inną nazwą oddziału lokalnego:

$ git checkout -b sf origin/serverfix
Branch sf set up to track remote branch refs/remotes/origin/serverfix.
Switched to a new branch "sf"

Teraz twój lokalny oddział sfbędzie automatycznie naciskał i ściągał z origin/serverfix.

BONUS: dodatkowe git statusinformacje

Dzięki gałęzi śledzenia git statuspowie Ci, jak daleko jesteś w tyle za swoją gałęzią śledzenia - przydatne, aby przypomnieć Ci, że jeszcze nie wprowadziłeś zmian! To wygląda tak:

$ git status
On branch master
Your branch is ahead of 'origin/master' by 1 commit.
  (use "git push" to publish your local commits)

lub

$ git status
On branch dev
Your branch and 'origin/dev' have diverged,
and have 3 and 1 different commits each, respectively.
  (use "git pull" to merge the remote branch into yours)

Assaf Lavie
źródło
21
Chciałem tylko wyjaśnić: „Wyrejestrowanie lokalnego oddziału ze zdalnego oddziału automatycznie tworzy tak zwaną gałąź śledzącą”. To jest mylące. Bez opcji --track żadna utworzona gałąź nie będzie śledzona.
JohnO,
@JohnO, może zechcesz porozmawiać o tym z gościem od Pro Git. Cała książka jest wynikiem masowej współpracy redakcyjnej IIRC.
Assaf Lavie
2
@ JohnO, zgodnie z: sbf5.com/~cduan/technical/git/git-4.shtml --track jest domyślnie włączony i nie jest konieczny.
Hank Lin
50

Poniżej znajdują się moje osobiste notatki dotyczące gałęzi śledzenia GIT, mam nadzieję, że będą pomocne dla przyszłych odwiedzających:

wprowadź opis obrazu tutaj wprowadź opis obrazu tutaj wprowadź opis obrazu tutaj wprowadź opis obrazu tutaj wprowadź opis obrazu tutaj wprowadź opis obrazu tutaj


Gałęzie śledzące i „pobieranie git”:

wprowadź opis obrazu tutaj wprowadź opis obrazu tutaj wprowadź opis obrazu tutaj

hagrawal
źródło
Dzięki za notatki! Czy możesz podzielić się nimi wszystkimi, jeśli to możliwe? Dzięki;
Aditya
@Aditya: To pytanie dotyczy śledzenia oddziałów i zamieściłem wszystkie moje notatki na ten temat. Jeśli znajdę inne istotne pytanie, w którym mogę zamieścić moje inne notatki z GIT, z przyjemnością to zrobię.
hagrawal
Dzięki! Miałem na myśli umieszczenie ich na swoim blogu czy coś :). Jeszcze raz dziękuję za miłe notatki!
Aditya
@Aditya: Ach, rozumiem. Teraz już wiesz, co masz na myśli. Mam zaległości w mojej witrynie, ale nie stworzyłem jej dla siebie.
hagrawal
43

Książka Pro Git wspomina :

Oddziały śledzące to oddziały lokalne, które są bezpośrednio powiązane z oddziałem zdalnym

Nie dokładnie. Pytanie SO „ Trudno zrozumiećgit-fetch ” obejmuje:

Nie ma takiej koncepcji lokalnych oddziałów śledzących , tylko oddziały zdalnego śledzenia .
Tak samo origin/masterjest ze zdalną gałęzią śledzenia masterw originrepozytorium.

Ale tak naprawdę, po ustanowieniu relacji gałęzi upstream między:

  • lokalny oddział, taki jak master
  • i oddział zdalnego śledzenia, taki jak origin/master

Wtedy można rozważyć masterjako lokalnego oddziału śledzenia : To śledzi zdalnego oddział śledzenia origin/master , które z kolei śledzi gałąź mistrza upstream repo origin .

tekst alternatywny

VonC
źródło
Wyjaśnienie obrazu: Mój komputer ma 2 zatwierdzenia przed początkiem. Stąd te dwa zobowiązania pana. Zdjęcie: progit.org/book/ch3-5.html
idbrii
Czy interpretuję poprawnie: jeśli lokalnie mam piloty ustawione na początek i do góry, to moja lokalna gałąź główna będzie śledzić źródło bezpośrednio i pośrednio? np .: kiedy git statusotrzymam komunikat śledzenia zatwierdzenia w odniesieniu do repozytoriów pochodzenia i upstream? (Settup: sklonowałem czyjeś repozytorium lokalnie, wypchnąłem klon do nowego repozytorium na moim koncie GitHub i lokalnie ustawiłem zdalne źródła i zdalne nadrzędne odpowiednio do mojego repozytorium github i sklonowanego repozytorium).
SherylHohman
3
@SherylHohman Nie: lokalny oddział nie śledzi niczego „bezpośrednio” ani „pośrednio”. Będzie śledzić gałąź zdalnego śledzenia, którą mu przypiszesz. W przypadku rozwidlenia najlepszą praktyką jest śledzenie w górę (oryginalne repozytorium) wspólnych gałęzi (takich jak główne) i śledzenie pochodzenia (zdalne rozwidlenie) dla nowych gałęzi (gałęzi PR lub funkcji): zobacz stackoverflow.com/ a / 21847690/6309
VonC
2
@VonC - Stwierdzenie „Nie ma takiej koncepcji lokalnych oddziałów śledzących, tylko zdalne oddziały śledzenia”. jest interesujące, b / c istnieje taka sprzeczna terminologia wokół gałęzi. To często przywoływane łącze web.archive.org/web/20130419172453/http://www.gitguys.com/ ... rozróżnia „gałęzie śledzenia” i „gałęzie zdalnego śledzenia”. Nazywają origin / master „gałęzią zdalnego śledzenia” - zgadzam się - ale potem nazywają też „master” „gałęzią śledzenia”. Co to jest śledzenie główne? Czy się mylą, czy jest to problem terminologiczny?
Howiecamp
2
@Howiecamp to, co nazywają „gałęzią śledzącą zwaną master”, to po prostu lokalny oddział główny z powiązanym zdalnym punktem początkowym / głównym odgałęzieniem śledzenia, tutaj, aby zapamiętać ostatni SHA1 pobrany ze źródła w odniesieniu do jego zdalnej gałęzi głównej. Jest to więc „skrót” do oznaczania „lokalnego oddziału z odgałęzieniem upstream”
VonC
7

W ten sposób dodałem gałąź śledzenia, aby móc z niej wyciągnąć do nowej gałęzi:

git branch --set-upstream-to origin/Development new-branch
agrublev
źródło