Une question agréable et simple - la fonction de "git fetch" est-elle un sous-ensemble strict de git fetch --tags
?
C'est-à-dire si je cours git fetch --tags
, y a-t-il jamais une raison de courir git fetch
immédiatement après?
Et pour git pull
et git pull --tags
? Même situation?
Réponses:
Remarque: à partir de git 1.9 / 2.0 (Q1 2014) ,
git fetch --tags
récupère les balises en plus de celles récupérées par la même ligne de commande sans l'option.Voir commit c5a84e9 par Michael Haggerty (mhagger) :
Depuis Git 2.5 (Q2 2015)
git pull --tags
est plus robuste:Voir commit 19d122b par Paul Tan (
pyokagan
) , 13 mai 2015.(Fusionné par Junio C Hamano -
gitster
- dans commit cc77b99 , 22 mai 2015)Avec Git 2.11+ (Q4 2016)
git fetch
c'est plus rapide.Voir commit 5827a03 (13 octobre 2016) de Jeff King (
peff
) .(Fusionné par Junio C Hamano -
gitster
- dans commit 9fcd144 , 26 oct.2016 )Cela ne s'applique que dans une situation où:
Git 2.21 (février 2019) semble avoir introduit une régression lorsque la configuration
remote.origin.fetch
n'est pas celle par défaut ('+refs/heads/*:refs/remotes/origin/*'
)Git 2.24 (Q4 2019) ajoute une autre optimisation.
Voir commit b7e2d8b (15 sept. 2019) par Masaya Suzuki (
draftcode
) .(Fusionné par Junio C Hamano -
gitster
- en commit 1d8b0df , 07 oct.2019 )la source
git fetch <remote> <branch>
balises de suivi automatique (car il met déjà à jour les suivis à distance CONTRE les intentions originales): public-inbox.org/git/…Remarque: cette réponse n'est valable que pour git v1.8 et versions antérieures.
La plupart de cela a été dit dans les autres réponses et commentaires, mais voici une explication concise:
git fetch
récupère toutes les têtes de branche (ou toutes spécifiées par l'option de configuration remote.fetch), toutes les validations nécessaires pour elles et toutes les balises accessibles depuis ces branches. Dans la plupart des cas, toutes les balises sont accessibles de cette manière.git fetch --tags
récupère toutes les balises, toutes les validations nécessaires. Il ne mettra pas à jour les têtes de branche, même si elles sont accessibles à partir des balises récupérées.Résumé: Si vous voulez vraiment être totalement à jour, en utilisant uniquement la récupération, vous devez faire les deux.
Ce n'est pas non plus "deux fois plus lent" sauf si vous voulez dire en termes de saisie sur la ligne de commande, auquel cas les alias résolvent votre problème. Il n'y a essentiellement pas de frais généraux pour faire les deux demandes, car ils demandent des informations différentes.
la source
git remote update
n'est pas réellement un substitut pourgit fetch
etgit fetch --tags
.git remote update
ne mettra pas à jour les balises existantes qui ont changé, bien qu'il en introduise de nouvelles. Seulgit fetch --tags
mettra à jour les balises déjà existantes.Je vais y répondre moi-même.
J'ai déterminé qu'il y a une différence. "git fetch --tags" peut apporter toutes les balises, mais il n'apporte pas de nouveaux commits!
Il s'avère que cela doit être fait pour être totalement "à jour", c'est-à-dire répliqué un "git pull" sans la fusion:
C'est dommage, car c'est deux fois plus lent. Si seulement "git fetch" avait une option pour faire ce qu'il fait normalement et apporter toutes les balises.
la source
git remote update myRemoteRepo
': cela récupérerait-il le contenu et les balises distants ?git fetch
tout le temps et cela réduit systématiquement tous les nouveaux commits et tous les nouveaux tags. Quelle version de Git utilisez-vous?git fetch
ne récupérera pas les balises qui ne figurent pas dans le journal de validation d'une branche. jQuery UI le fait par exemple sur une balise de version. Nous faisons ungit checkout -b temp-branch
, faisons notre version, ajoutons les fichiers nécessaires pour la version, la version de mise à jour, etc.,git commit -m "1.10.x" ; git tag 1.10.x; git push --tags
puis nous supprimons notre branche temporaire locale. Aucune branche distante n'atteint cette balise etgit fetch
ne la téléchargera jamais.Le problème général ici est qu'il
git fetch
va chercher+refs/heads/*:refs/remotes/$remote/*
. Si l'un de ces validations a des balises, ces balises seront également récupérées. Cependant, s'il existe des balises inaccessibles par aucune branche de la télécommande, elles ne seront pas récupérées.L'
--tags
option bascule la refspec sur+refs/tags/*:refs/tags/*
. Vous pourriez demandergit fetch
de saisir les deux. Je suis à peu près sûr de faire un quegit fetch && git fetch -t
vous utiliseriez la commande suivante:Et si vous vouliez en faire la valeur par défaut pour ce dépôt, vous pouvez ajouter une seconde refspec à la récupération par défaut:
Cela ajoutera une deuxième
fetch =
ligne dans le.git/config
pour cette télécommande.J'ai passé un certain temps à chercher le moyen de gérer cela pour un projet. C'est ce que j'ai trouvé.
Dans mon cas, je voulais ces fonctionnalités
refs/*:refs/*
+
avant la refspec-u
-p
-f
la source
--tags
option bascule la refspec sur+refs/tags/*:refs/tags/*
". Bienman git-fetch
que,, semble spécifier que refspec sans le leader+
(refs/tags/*:refs/tags/*
).remote.origin.fetch
par défaut+refs/heads/*:refs/remotes/origin/*
, c'est- à -dire la+
version, n'est-ce pas? (Cela signifie que l'origine / la branche sera remplacée, peu importe où l'origine / la branche se trouve actuellement localement.)git --tags
récupéraient déjà des balises en plus de tout le reste. Voir la réponse de @VonC.Dans la plupart des situations,
git fetch
vous devez faire ce que vous voulez, c'est-à-dire «obtenir quelque chose de nouveau à partir du référentiel distant et le mettre dans votre copie locale sans fusionner avec vos succursales locales».git fetch --tags
fait exactement cela, sauf qu'il n'obtient rien sauf de nouvelles balises.En ce sens,
git fetch --tags
n’est en aucun cas un surensemble degit fetch
. C'est en fait exactement le contraire.git pull
, bien sûr, n'est rien d'autre qu'un emballage pour ungit fetch <thisrefspec>; git merge
. Il est recommandé que vous vous habituez à faire manuelgit fetch
ING etgit merge
ing avant de faire le sautgit pull
simplement parce qu'il vous aide à comprendre ce quigit pull
est fait en premier lieu.Cela étant dit, la relation est exactement la même qu'avec
git fetch
.git pull
est le surensemble degit pull --tags
.la source
git pull
ne pas obtenir toutes les étiquettes , mais seulement ceux accessibles depuis les têtes de branche en cours. Cependant,git pull --tags
récupère toutes les balises et est apparemment équivalent àgit fetch --tags
.fonctionne très bien, il n'obtiendra que de nouvelles balises et n'obtiendra aucune autre base de code.
la source
upstream
est normalement appeléorigin
. Je pense queupstream
c'est un nom utilisé par GitHub. Dans tous les cas, le nom à utiliser est celui indiqué pargit remote
.