Ładne i proste pytanie - czy funkcja „git fetch” jest ścisłym podzbiorem git fetch --tags
?
To git fetch --tags
znaczy, jeśli biegnę , czy kiedykolwiek jest jakiś powód, aby natychmiast biegać od git fetch
razu?
Co z git pull
i git pull --tags
? Ta sama sytuacja?
Odpowiedzi:
Uwaga: począwszy od git 1.9 / 2.0 (Q1 2014) ,
git fetch --tags
pobiera tagi oprócz tego, co jest pobierane przez ten sam wiersz poleceń bez opcji.Zobacz zatwierdzenie c5a84e9 przez Michael Haggerty (mhagger) :
Ponieważ Git 2.5 (Q2 2015)
git pull --tags
jest bardziej niezawodny:Zob. Zatwierdzenie 19d122b przez Paula Tana (
pyokagan
) , 13 maja 2015 r.(Scalony przez Junio C Hamano -
gitster
- w commit cc77b99 , 22 maja 2015 r.)Z Git 2.11+ (IV kwartał 2016)
git fetch
jest szybszy.Zobacz commit 5827a03 (13 października 2016 r.) Autor: Jeff King (
peff
) .(Połączone przez Junio C Hamano -
gitster
- w commit 9fcd144 , 26 paź 2016)Dotyczy to tylko sytuacji, gdy:
Wydaje się, że Git 2.21 (luty 2019 r.) Wprowadził regresję, gdy konfiguracja nie
remote.origin.fetch
jest domyślna ('+refs/heads/*:refs/remotes/origin/*'
)Git 2.24 (IV kwartał 2019 r.) Dodaje kolejną optymalizację.
Zobacz commit b7e2d8b (15 września 2019) autor: Masaya Suzuki (
draftcode
) .(Połączone przez Junio C Hamano -
gitster
- w commit 1d8b0df , 07 paź 2019)źródło
git fetch <remote> <branch>
automatycznego śledzenia znaczników (ponieważ już aktualizuje zdalne śledzenie PRZECIWKO oryginalnym intencjom): public-inbox.org/git/…Uwaga: ta odpowiedź jest ważna tylko dla git v1.8 i starszych.
Większość tego powiedziano w innych odpowiedziach i komentarzach, ale oto zwięzłe wyjaśnienie:
git fetch
pobiera wszystkie nagłówki gałęzi (lub wszystkie określone przez opcję konfiguracji remote.fetch), wszystkie niezbędne dla nich zatwierdzenia i wszystkie znaczniki, które są dostępne z tych gałęzi. W większości przypadków wszystkie tagi są osiągalne w ten sposób.git fetch --tags
pobiera wszystkie tagi, wszystkie niezbędne dla nich zmiany. To będzie nie aktualizować głowy oddział, nawet jeśli są one dostępne z tagami, które były naciągane.Podsumowanie: Jeśli naprawdę chcesz być na bieżąco, używając tylko pobierania, musisz wykonać obie te czynności.
Nie jest też „dwa razy wolniejszy”, chyba że chodzi o pisanie w wierszu poleceń, w którym to przypadku aliasy rozwiązują problem. Składanie dwóch próśb zasadniczo nie wiąże się z narzutami, ponieważ proszą one o inne informacje.
źródło
git remote update
tak naprawdę nie zastępujegit fetch
igit fetch --tags
.git remote update
nie zaktualizuje istniejących tagów, które uległy zmianie, chociaż wprowadzi nowe tagi.git fetch --tags
Aktualizuje tylko istniejące już tagi.Sam odpowiem na to pytanie.
Ustaliłem, że jest różnica. „git fetch --tags” może przynieść wszystkie tagi, ale nie wprowadza żadnych nowych zatwierdzeń!
Okazuje się, że trzeba to zrobić, aby być całkowicie „aktualnym”, tj. Powielić „ściągnięcie git” bez scalenia:
Szkoda, bo dwa razy wolniej. Gdyby tylko „git fetch” miał opcję robienia tego, co zwykle, i wprowadzania wszystkich tagów.
źródło
git remote update myRemoteRepo
”: czy pobrałoby to zdalną treść i tagi?git fetch
cały czas i konsekwentnie niszczy wszelkie nowe zmiany i nowe tagi. Jaką wersję Git używasz?git fetch
nie pobierze tagów, które nie znajdują się w dzienniku zatwierdzeń oddziału. Interfejs jQuery robi to na przykład w tagu wydania. Robimygit checkout -b temp-branch
, robimy nasze wydanie, dodajemy pliki potrzebne do wydania, aktualizujemy wersję itp., Agit commit -m "1.10.x" ; git tag 1.10.x; git push --tags
następnie usuwamy nasz lokalny oddział tymczasowy. Żadna zdalna gałąź nie osiągnie tego znacznika igit fetch
nigdy go nie pobierze.Ogólny problem polega na tym
git fetch
, że zostanie pobrany+refs/heads/*:refs/remotes/$remote/*
. Jeśli którykolwiek z tych zatwierdzeń ma tagi, te tagi również zostaną pobrane. Jeśli jednak tagi nie są dostępne dla żadnego oddziału na pilocie, nie zostaną pobrane.--tags
Opcja przełącza refspec do+refs/tags/*:refs/tags/*
. Państwo mogłoby zapytaćgit fetch
chwycić obie. Jestem prawie pewien, że po prostugit fetch && git fetch -t
użyję następującego polecenia:A jeśli chcesz ustawić to jako domyślne dla tego repozytorium, możesz dodać drugi refspec do domyślnego pobierania:
Spowoduje to dodanie drugiej
fetch =
linii.git/config
do tego pilota.Spędziłem trochę czasu, szukając sposobu, aby sobie z tym poradzić w projekcie. Właśnie to wymyśliłem.
W moim przypadku chciałem te funkcje
refs/*:refs/*
+
przed refspec-u
-p
-f
źródło
--tags
Opcja przełącza refspec na+refs/tags/*:refs/tags/*
”. Chociażman git-fetch
wydaje się, że określa to refspec bez wiodącego+
(refs/tags/*:refs/tags/*
).remote.origin.fetch
domyślnie+refs/heads/*:refs/remotes/origin/*
, tj.+
wersja, prawda? (Oznacza to, że pochodzenie / oddział zostanie nadpisane, bez względu na to, gdzie pochodzenie / oddział znajduje się teraz lokalnie.)git --tags
pobierałem tagi . Zobacz odpowiedź @VonC.W większości sytuacji
git fetch
należy zrobić, co chcesz, czyli „pobrać wszystko ze zdalnego repozytorium i umieścić w lokalnej kopii bez łączenia się z lokalnymi oddziałami”.git fetch --tags
robi dokładnie to, poza tym, że nie otrzymuje niczego oprócz nowych tagów.W tym sensie nie
git fetch --tags
jest w żaden sposób nadzbioremgit fetch
. W rzeczywistości jest dokładnie odwrotnie.git pull
, oczywiście, jest tylko opakowaniem dlagit fetch <thisrefspec>; git merge
. Zaleca się, aby przyzwyczaić się do prowadzenia ręcznegogit fetch
ing igit merge
ing przed dokonaniem skokgit pull
po prostu dlatego, że pomaga zrozumieć, cogit pull
robi w pierwszej kolejności.Biorąc to pod uwagę, związek jest dokładnie taki sam jak z
git fetch
.git pull
jest nadzbioremgit pull --tags
.źródło
git pull
ma nie dostać wszystkie znaczniki, ale tylko tych, osiągalny z obecnych szefów oddziałów. Jednakgit pull --tags
pobiera wszystkie znaczniki i jest pozornie równoważnegit fetch --tags
.działa dobrze, otrzyma tylko nowe tagi i nie otrzyma żadnej innej bazy kodu.
źródło
upstream
jest zwykle nazywanyorigin
. Myślę, żeupstream
to nazwa używana przez GitHub. W każdym razie należy użyć nazwy wyświetlanej przezgit remote
.