Eine schöne und einfache Frage - ist die Funktion von "git fetch" eine strikte Teilmenge von git fetch --tags
?
Dh wenn ich renne git fetch --tags
, gibt es jemals einen Grund, sofort git fetch
danach zu rennen ?
Was ist mit git pull
und git pull --tags
? Gleiche Situation?
Antworten:
Hinweis: Ab Git 1.9 / 2.0 (Q1 2014) werden
git fetch --tags
Tags zusätzlich zu dem abgerufen , was von derselben Befehlszeile ohne die Option abgerufen wird.Siehe Commit c5a84e9 von Michael Haggerty (mhagger) :
Seit Git 2.5 (Q2 2015)
git pull --tags
ist robuster:Siehe Commit 19d122b von Paul Tan (
pyokagan
) , 13. Mai 2015.(Zusammengeführt von Junio C Hamano -
gitster
- in Commit cc77b99 , 22. Mai 2015)Mit Git 2.11+ (Q4 2016)
git fetch
geht es schneller.Siehe Commit 5827a03 (13. Oktober 2016) von Jeff King (
peff
) .(Zusammengeführt von Junio C Hamano -
gitster
- in Commit 9fcd144 , 26. Oktober 2016)Dies gilt nur für eine Situation, in der:
Git 2,21 (Februar 2019) scheint eine Regression eingeführt zu haben , wenn die Konfiguration
remote.origin.fetch
ist nicht der Standard ein ('+refs/heads/*:refs/remotes/origin/*'
)Git 2.24 (Q4 2019) fügt eine weitere Optimierung hinzu.
Siehe Commit b7e2d8b (15. September 2019) von Masaya Suzuki (
draftcode
) .(Zusammengeführt von Junio C Hamano -
gitster
- in Commit 1d8b0df , 07. Oktober 2019)quelle
git fetch <remote> <branch>
Tags mit automatischer Verfolgung zu ändern (da Remote-Tracking bereits GEGEN die ursprünglichen Absichten aktualisiert wird): public-inbox.org/git/…Hinweis: Diese Antwort gilt nur für Git v1.8 und älter.
Das meiste davon wurde in den anderen Antworten und Kommentaren gesagt, aber hier ist eine kurze Erklärung:
git fetch
Ruft alle Verzweigungsköpfe (oder alle von der Konfigurationsoption remote.fetch angegebenen), alle für sie erforderlichen Commits und alle Tags ab, die von diesen Zweigen aus erreichbar sind. In den meisten Fällen sind alle Tags auf diese Weise erreichbar.git fetch --tags
Ruft alle Tags ab, alle für sie erforderlichen Commits. Zweigköpfe werden nicht aktualisiert, selbst wenn sie über die abgerufenen Tags erreichbar sind.Zusammenfassung: Wenn Sie wirklich auf dem neuesten Stand sein möchten und nur Fetch verwenden möchten, müssen Sie beides tun.
Es ist auch nicht "doppelt so langsam", es sei denn, Sie meinen in Bezug auf die Eingabe in der Befehlszeile. In diesem Fall lösen Aliase Ihr Problem. Es ist im Wesentlichen kein Aufwand, die beiden Anfragen zu stellen, da sie nach unterschiedlichen Informationen fragen.
quelle
git remote update
kein Ersatz fürgit fetch
und istgit fetch --tags
.git remote update
Aktualisiert keine vorhandenen Tags, die geändert wurden, obwohl neue Tags eingefügt werden. Nurgit fetch --tags
werden bereits vorhandene Tags aktualisiert.Ich werde das selbst beantworten.
Ich habe festgestellt, dass es einen Unterschied gibt. "git fetch --tags" bringt zwar alle Tags ein, aber keine neuen Commits!
Es stellt sich heraus, dass man dies tun muss, um vollständig "auf dem neuesten Stand" zu sein, dh einen "Git Pull" ohne die Zusammenführung zu replizieren:
Das ist eine Schande, weil es doppelt so langsam ist. Wenn nur "git fetch" die Option hätte, das zu tun, was es normalerweise tut, und alle Tags einzubringen.
quelle
git remote update myRemoteRepo
': Würde das entfernte Inhalte und Tags abrufen?git fetch
ganze Zeit und es werden ständig neue Commits und neue Tags entfernt. Welche Version von Git verwenden Sie?git fetch
greift nicht auf Tags zu, die nicht im Festschreibungsprotokoll eines Zweigs enthalten sind. Die jQuery-Benutzeroberfläche führt dies beispielsweise für ein Release-Tag aus. Wir machen einegit checkout -b temp-branch
, machen unsere Veröffentlichung, fügen Dateien hinzu, die für die Veröffentlichung benötigt werden, aktualisieren die Version usw., danngit commit -m "1.10.x" ; git tag 1.10.x; git push --tags
löschen wir unseren lokalen temporären Zweig. Es gibt keinen Remote-Zweig, der dieses Tag erreicht undgit fetch
es niemals herunterladen wird.Das allgemeine Problem hier ist, dass
git fetch
holen wird+refs/heads/*:refs/remotes/$remote/*
. Wenn eines dieser Commits Tags enthält, werden diese Tags ebenfalls abgerufen. Wenn jedoch Tags vorhanden sind, die von keinem Zweig auf der Fernbedienung erreicht werden können, werden sie nicht abgerufen.Die
--tags
Option schaltet die Referenz auf+refs/tags/*:refs/tags/*
. Sie könnten darum bittengit fetch
, sich beide zu schnappen. Ich bin mir ziemlich sicher, dass Sie nurgit fetch && git fetch -t
den folgenden Befehl verwenden würden:Und wenn Sie dies zum Standard für dieses Repo machen möchten, können Sie dem Standardabruf eine zweite Referenz hinzufügen:
Dadurch wird eine zweite
fetch =
Zeile in der.git/config
für diese Fernbedienung hinzugefügt .Ich habe eine Weile nach einer Möglichkeit gesucht, dies für ein Projekt zu handhaben. Das habe ich mir ausgedacht.
In meinem Fall wollte ich diese Funktionen
refs/*:refs/*
+
vor der Referenz-u
-p
-f
quelle
--tags
Option schaltet die Referenz auf+refs/tags/*:refs/tags/*
". Obwohl,man git-fetch
scheint diese refspec ohne die führende+
(refs/tags/*:refs/tags/*
) zu spezifizieren .remote.origin.fetch
Der Standardwert+refs/heads/*:refs/remotes/origin/*
ist die+
Version, nicht wahr? (Das heißt, Ursprung / Zweig wird überschrieben, egal wo Ursprung / Zweig gerade lokal ist.)git --tags
Zeit neben allem anderen bereits Tags abgerufen . Siehe die Antwort von @VonC.In den meisten Situationen
git fetch
sollten Sie das tun, was Sie möchten: "Holen Sie sich etwas Neues aus dem Remote-Repository und fügen Sie es in Ihre lokale Kopie ein, ohne es mit Ihren lokalen Niederlassungen zusammenzuführen".git fetch --tags
macht genau das, außer dass es nichts außer neuen Tags bekommt.In diesem Sinne
git fetch --tags
ist in keiner Weise eine Obermenge vongit fetch
. Es ist genau das Gegenteil.git pull
ist natürlich nichts anderes als ein Wrapper für agit fetch <thisrefspec>; git merge
. Es wird empfohlen , dass Sie manuell zu tun gewöhnengit fetch
ing undgit merge
ing , bevor Sie den Sprung zu machen ,git pull
nur weil es hilft Ihnen zu verstehen , wasgit pull
in erster Linie tut.Davon abgesehen ist die Beziehung genau die gleiche wie bei
git fetch
.git pull
ist die Obermenge vongit pull --tags
.quelle
git pull
sich nicht bekommen alle Tags , sondern nur diejenigen , erreichbar von den aktuellen Zweig Köpfe. Jedochgit pull --tags
holt alle Tags und ist offenbar äquivalentgit fetch --tags
.funktioniert einwandfrei, es werden nur neue Tags und keine andere Codebasis angezeigt.
quelle
upstream
wird normalerweise genanntorigin
. Ich denke,upstream
ist ein Name, der von GitHub verwendet wird. In jedem Fall ist der zu verwendende Name der vongit remote
.