Trudno zrozumieć git-fetch
Ciężko mi zrozumieć niuanse git-fetch. Rozumiem, że robiąc fetch
, pobiera zdalne refy do lokalnej gałęzi śledzącej.
Czy możliwe jest, że lokalny oddział śledzenia nie istnieje? Jeśli tak, to czy zostanie on utworzony automatycznie?
Co się stanie, jeśli wykonam
fetch
I podam jako miejsce docelowe gałąź bez śledzenia?-
Strona man dla git-fetch określa:
git-fetch <options> <repository> <refspec>
Jak używać refspec do pobierania zawartości z mojego zdalnego Mastera do jego zdalnej gałęzi śledzenia? Wierzę, że może to być możliwe, jeśli moja obecna głowa jest na Mistrzu i biegnę
git fetch origin master
Jednak Czy mogę użyć <+?src:dest>
refspec, aby osiągnąć to samo? Myślę, że to pomoże mi lepiej zrozumieć pojęcia.
I jeszcze jedno pytanie:
Mój .plik Git / config ma następującą linię do pobrania (pokazującą tylko istotne linie):fetch = +refs/heads/*:refs/remotes/origin/*
Czy ktoś może wyjaśnić, co dokładnie oznacza ta linia? 4 answers
Po pierwsze, nie ma takiej koncepcji lokalnego śledzenia gałęzi, tylko zdalnego śledzenia gałęzi. Tak więc origin/master jest zdalną gałęzią śledzącą dla master w repo origin.
Zazwyczaj wykonujesz git fetch $remote , który aktualizuje wszystkie zdalne gałęzie śledzenia i tworzy nowe, jeśli zajdzie taka potrzeba.
Możesz jednak również określić refspec, ale nie dotknie on twoich zdalnych gałęzi śledzenia, zamiast tego pobierze gałąź, którą podałeś i zapisz ją w FETCH_HEAD, chyba że podasz miejsce docelowe. Ogólnie rzecz biorąc, nie chcesz z tym zadzierać.
Wreszcie,
fetch = +refs/heads/*:refs/remotes/origin/*
To znaczy, że jeśli to zrobisz
git fetch origin
Rzeczywiście będzie:
git fetch origin +refs/heads/*:refs/remotes/origin/*
Co oznacza, że zdalny heads/foobar będzie lokalny remotes/origin/foobar , A znak plusa oznacza, że będą one aktualizowane nawet jeśli nie są przewijane do przodu.
Być może to, co uważasz za gałąź śledzącą, jest związane z git pull i konfiguracja merge.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-01 19:18:02
Felipec odpowiedział na większość pytań w swojej odpowiedzi .
Kilka pozostałych (większość zaczerpnięta z Git fetch strony Man; która jest niestety trochę przestarzała w niektórych miejscach):
Jeśli remote-tracking branch (branch, który śledzi jakąś gałąź w jakimś zdalnym repozytorium) nie istnieje, zostanie utworzona.
Gałąź, do której pobierasz (
<dst>
w[+]<src>:<dst>
) nie musi znajdować się wremotes/<remote>/
przestrzeń nazw. Na przykład dla repozytoriów mirroringowych (git clone --mirror
) refspec wynosi 1 do 1. W dawnych czasach przed oddzielnym układem pilotów (przedremotes/<remote>/
przestrzenią nazw dla zdalnego śledzenia refów) Master branch był pobierany do gałęzi o nazwie origin. Nawet obecnie tagi są pobierane bezpośrednio dotags/
przestrzeni nazw w sposób odzwierciedlający.Jeśli gałąź do której pobierasz (prawa strona refspec
<src>:<dst>
istnieje, Git sprawdzi czy pobieranie spowoduje szybkie przewinięcie do przodu, tzn. jeśli bieżący stan w<dst>
jest przodkiem stanu w<src>
w danym zdalnym repozytorium. Jeśli nie, a ty nie używasz-f
/--force
opcja git-fetch lub prefiks refspec z '+' (użyj+<src>:<dst>
refspec) fetch odmówi aktualizacji tej gałęzi.git fetch origin master
jest odpowiednikiemgit fetch origin master:
, a niegit fetch origin master:master
; przechowuje pobraną wartość master branch (zdalnego origin ) W FETCH_HEAD , a nie w master branch lub remote-trackingremotes/origin/master
branch. Po nim może następowaćgit merge FETCH_HEAD
. Zazwyczaj nie jest używany bezpośrednio, ale jako część jednorazowego ściągania bez ustawiania gałęzi zdalnego śledzenia:git pull <URL> <branch>
.+refs/heads/*:refs/remotes/origin/*
jako wartość dla remote.pochodzenie.fetch zmienna konfiguracyjna oznacza, że każda gałąź (ref wrefs/heads/
przestrzeni nazw) w zdalnym origin jest pobierana do odpowiednio nazwanej gałęzi zdalnego śledzenia wrefs/remotes/origin/
przestrzeni nazw, np. master gałąź w origin (tzn.refs/heads/master
ref) będzie pobierana do origin / master remote-tracking branch (czylirefs/remotes/origin/master
ref). Przedrostek " + " oznacza, że fetch zakończy się sukcesem nawet w przypadku, gdy branch on remote zostanie ponownie skompresowany, lub przewinięty (zresetowany do jakiegoś stanu w przeszłości) lub w inny sposób zmieniony.
Sidenote: prawdopodobnie chciałbyś użyć wyższego poziomu polecenia git remote do zarządzania zdalnymi repozytoriami i uzyskiwania aktualizacji.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:46:44
Zauważ, że główny opiekun Git dodał teraz (Git 2.1, sierpień 2014) to wyjaśnienie dla git fetch
:
(Zobacz commit fcb14b0 by Junio C Hamano (gitster
):
SKONFIGUROWANE GAŁĘZIE ZDALNEGO ŚLEDZENIA
Często wchodzi się w interakcję z tym samym zdalnym repozytorium, regularnie i wielokrotnie pobierając z niego. W celu śledzenia postępu prac takiego zdalnego repozytorium,
git fetch
pozwala na konfigurację konfiguracjiremote.<repository>.fetch
zmienne.Typowo taka zmienna może wyglądać tak:
[remote "origin"]
fetch = +refs/heads/*:refs/remotes/origin/*
Ta konfiguracja jest używana na dwa sposoby:
Gdy
git fetch
jest uruchamiane bez określenia, jakie gałęzie i/lub znaczniki należy pobrać w wierszu poleceń, np.git fetch origin
lubgit fetch
,remote.<repository>.fetch
wartości są używane jako refspecs - - - określają, które refs pobrać i które lokalne refs zaktualizować.
Powyższy przykład pobierze wszystkie gałęzie, które istnieją worigin
(tj. dowolny ref to odpowiada lewej stronie wartości,refs/heads/*
) i aktualizuje odpowiednie gałęzie zdalnego śledzenia w hierarchiirefs/remotes/origin/*
.Kiedy
git fetch
jest uruchamiane z jawnymi gałęziami i / lub znacznikami do pobrania z linii poleceń, np.git fetch origin master
,<refspec>
S podane w linii poleceń określają, co ma być pobrane (np.master
W przykładzie, który jest krótką ręką dlamaster:
, co z kolei oznacza "fetch the'master
' branch, ale nie mówię wprost, jaką gałąź do zdalnego śledzenia aktualizacja z linii poleceń"), a przykładowe polecenie pobierze tylko gałąź 'master
'.
Wartościremote.<repository>.fetch
określają, która gałąź zdalnego śledzenia, jeśli istnieje, jest aktualizowana.
Gdy są używane w ten sposób, wartościremote.<repository>.fetch
nie mają żadnego wpływu na decyzję co zostanie pobrane (tzn. wartości nie są używane jako refspecs, gdy wiersz poleceń wyświetla refspecs); są one używane tylko do decydowania gdzie refs, które są pobierane są przechowywane przez działanie jako refspecs. mapowanie.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-08-02 18:00:56
Zauważ również, że z Git 2.5+ (Q2 2015), git merge FETCH_HEAD
Może połączyć wiele Gita fetch ' ów.
Zobacz commit d45366e by Junio C Hamano (gitster
), 26 Mar 2015.
(dodany przez Junio C Hamano -- gitster
-- in commit bcd1ecd , 19 maja 2015)
"
git merge FETCH_HEAD
" okazało się, że poprzednie"git fetch
"może być tworzeniem połączenia ośmiornicy, tzn. nagrywaniem wielu gałęzi, które nie są oznaczone jako "not-for-merge";
to pozwala nam stracić wywołanie starego stylu "git merge <msg> HEAD $commits...
"w implementacji skryptu"git pull
"; składnia starego stylu może być teraz przestarzała.
The git merge
doc teraz wspomnij:
Kiedy
FETCH_HEAD
(i żaden inny commit) jest określony, gałęzie zapisane w pliku.git/FETCH_HEAD
przez poprzednie wywołaniegit fetch
do scalania są scalane do bieżącej gałęzi .
Git 2.13 (Q2 2017) oficjalnie wycofuje starą składnię dla
git merge
.Zobacz też commit b439165 (26 Mar 2015) by Junio C Hamano (
gitster
).(dodany przez Junio C Hamano --
gitster
-- in commit 1fdbfc4, 30 Mar 2017)
merge
: drop 'git merge <message> HEAD <commit>
' składniaPrzestań wspierać składnię "
git merge <message> HEAD <commit>
", która ma został wycofany od października 2007 r. i wysyła komunikat ostrzegawczy o wycofaniu od wersji 2.5.0.
Oznacza to, że komunikat ostrzegawczy w starym stylu" 'git merge <msg> HEAD <commit>' is deprecated.
" już nie istnieje.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-13 21:40:38