Avoir du mal à comprendre git-extraction

j'ai du mal à comprendre les nuances de git-fetch. Je comprends que faire un fetch , récupère les références à distance dans une branche locale de suivi.

j'ai quelques questions cependant:

  1. est-il possible qu'une direction locale de suivi n'existe pas? Si oui, est-il alors être créé automatiquement?

  2. Ce qui va se passer si je fais un fetch et préciser une branche non suivie comme destination?

  3. la page de manuel de git-fetch spécifie:

    git-fetch <options> <repository> <refspec>
    

Comment pourrais-je utiliser le refspec pour récupérer le contenu de mon Master distant dans sa branche de suivi à distance? Je crois que c'est possible si ma tête actuelle est sur master et je cours

git fetch origin master

cependant, puis-je utiliser le <+?src:dest> refspec pour obtenir la même chose? Je pense que cela m'aidera à mieux comprendre les concepts.

et une autre question:

My .le fichier git/config a la ligne suivante pour la recherche (montrant seulement les lignes pertinentes):

fetch = +refs/heads/*:refs/remotes/origin/*

quelqu'un peut-il expliquer ce que signifie exactement cette ligne?

49
demandé sur eldarerathis 2009-07-01 21:54:56
la source

4 ответов

tout d'abord, il n'y a pas de concept de suivi local branches, seulement suivi à distance branches. Ainsi origin / master est une branche de suivi à distance pour master dans le origin repo.

typiquement vous faites git fetch $ remote qui met à jour toutes vos branches de suivi à distance, et en crée de nouvelles si nécessaire.

cependant, vous pouvez également spécifier un refspec, mais qui ne touchera pas vos branches de suivi à distance, à la place, il récupérera la branche que vous avez spécifiée et la sauvegardera sur FETCH_HEAD, sauf si vous spécifiez une destination. En général, vous ne voulez pas salir avec cette.

enfin,

fetch = +refs/heads/*:refs/remotes/origin/*

cela signifie que si vous le faites

git fetch origin

Il va faire:

git fetch origin +refs/heads/*:refs/remotes/origin/*

qui signifie une télécommande têtes/foobar sera locale remotes/origin/foobar , et le signe + signifie qu'ils vont être mis à jour même si ils ne sont pas rapide vers l'avant.

peut-être que ce que vous pensez en tant que branche de suivi est quelque chose lié à git pull et à la config merge.

56
répondu FelipeC 2009-07-01 23:18:02
la source

felipec ont répondu à la plupart des questions en question dans sa réponse .

quelques pages restantes (la plupart tirées de la page de manuel git fetch ; qui est un peu datée à certains endroits, malheureusement):

  • Si "1519360920 à distance" suivi de la branche (direction les pistes d'une antenne dans certains référentiel distant) n'existe pas, il serait créé.

  • la branche dans laquelle vous allez chercher (le <dst> dans [+]<src>:<dst> ) n'a pas besoin de résider dans remotes/<remote>/ namespace. Par exemple pour les dépôts en miroir ( git clone --mirror ) refspec est de 1 à 1. Dans les vieux jours avant remotes disposition séparée (avant remotes/<remote>/ namespace pour remote-tracking refs) master branche a été récupéré dans la branche appelée origine . Même actuellement les étiquettes sont récupérées directement dans tags/ namespace en mode miroir.

  • si la branche dans laquelle vous vous trouvez (le côté droit de la réfspec <src>:<dst> existe, Git vérifierait si le téléchargement entraînerait une avance rapide, c'est-à-dire si l'état courant dans <dst> est l'ancêtre de l'état dans <src> dans un dépôt à distance donné. Si ce n'est pas le cas, et que vous n'utilisez pas l'option -f / --force pour git-fetch, ou le préfixe refspec avec ' + '(utilisez +<src>:<dst> refspec) fetch refuserait de mettre à jour cette branche.

  • git fetch origin master est équivalent à git fetch origin master: , et non à git fetch origin master:master ; il stocke la valeur récupérée de master branche (de la télécommande origine ) dans FETCH_HEAD , et non dans master branche ou télémesure remotes/origin/master branche. Il peut être suivi de git merge FETCH_HEAD . Généralement pas utilisé directement, mais dans le cadre d'un pull unique sans définir remote-tracking branch: git pull <URL> <branch> .

  • +refs/heads/*:refs/remotes/origin/* comme valeur pour remote.origine.la variable de configuration fetch signifie que chaque branche (réf dans refs/heads/ namespace) dans la zone distante origin est récupérée dans la branche de suivi à distance respectivement nommée dans refs/remotes/origin/ namespace, p.ex. Master branche dans l'origine (c.-à-d. refs/heads/master ref) serait récupérée dans origine/master remote-tracking branch (c.-à-d. refs/remotes/origin/master ref). Le préfixe ' + ' signifie que fetch réussirait même dans le cas non fast-forward, c'est-à-dire lorsque la branche sur la télécommande est rebasée, ou rebound (réinitialisée dans un État quelconque dans le passé) ou autrement modifiée.

Sidenote: vous voudriez probablement utilisez la commande de niveau supérieur git remote pour gérer les dépôts à distance et obtenir des mises à jour.

20
répondu Jakub Narębski 2017-05-23 14:46:44
la source

notez que le mainteneur principal de Git a maintenant (Git 2.1, août 2014) Ajouté cette explication pour git fetch :

(Voir commit fcb14b0 by Junio CA Hamano ( gitster ) :

BRANCHES DE SUIVI À DISTANCE CONFIGURÉES

vous interagissez souvent avec le même dépôt distant en allant chercher régulièrement il. Afin de suivre la progression d'un tel dépôt distant, git fetch vous permet de configurer les variables de configuration remote.<repository>.fetch .

généralement, une telle variable peut ressembler à ceci:

[remote "origin"]
fetch = +refs/heads/*:refs/remotes/origin/*

cette configuration est utilisée de deux façons:

  • quand git fetch est exécuté sans préciser quelles branches et / ou étiquettes à récupérer sur le ligne de commande, par exemple git fetch origin ou git fetch , les valeurs remote.<repository>.fetch sont utilisées comme les refspecs --ils spécifient quels refs aller chercher et quels refs locaux mettre à jour .

    L'exemple ci-dessus récupérera toutes les branches qui existent dans le origin (c.-à-d. toute réf qui correspond au côté gauche de la valeur, refs/heads/* ) et mettra à jour les branches de suivi à distance correspondantes dans la hiérarchie refs/remotes/origin/* .

  • lorsque git fetch est exécuté avec des branches et/ou des étiquettes explicites pour aller chercher sur la ligne de commande, par exemple git fetch origin master , les <refspec> donnés sur la ligne de commande déterminent ce qui doit être récupéré (par exemple master dans l'exemple, qui est un raccourci pour master: , qui à son tour signifie "fetch the ' master 'branch mais je ne dis pas explicitement quelle branche de suivi à distance mettre à jour avec elle à partir de la ligne de commande"), et la commande d'exemple va fetch seulement l ' master succursale.

    Les valeurs remote.<repository>.fetch déterminent quelle branche de suivi à distance, le cas échéant, est mise à jour.

    Lorsqu'elles sont utilisées de cette façon, les valeurs remote.<repository>.fetch n'ont aucun effet pour décider ce que est récupéré (c.-à-d. les valeurs ne sont pas utilisées comme refspecs lorsque la ligne de commande Liste refspecs); elles sont seulement utilisées pour décider les refs qui sont extraites sont stockées en agissant comme un mappage.

4
répondu VonC 2014-08-02 22:00:56
la source

Notez aussi que, avec Git 2.5+ (Q2 2015), git merge FETCH_HEAD peut fusionner plusieurs git fetch .

voir commit d45366e by Junio C Hamano ( gitster ) , 26 mars 2015.

(fusionné par Junio CA Hamano -- gitster -- dans commit bcd1ecd , 19 mai 2015)

" git merge FETCH_HEAD "appris que la précédente" git fetch " pourrait être de créer une Pieuvre de fusion, c'est à dire l'enregistrement de plusieurs branches qui ne sont pas marqués comme "non-pour-fusion";

cela nous permet de perdre une ancienne invocation de style " git merge <msg> HEAD $commits... "dans l'implémentation du script" git pull "; l'ancienne syntaxe de style peut maintenant être dépréciée.

Le git merge doc maintenant mentionner:

quand FETCH_HEAD (et aucune autre commit) est spécifié, les branches enregistrées dans le fichier .git/FETCH_HEAD par l'invocation précédente de git fetch pour fusion sont fusionnées à la branche courante .


Git 2.13 (Q2 2017) retire officiellement l'ancienne syntaxe pour git merge .

Voir commettre b439165 (26 mars 2015) par Junio C. Hamano ( gitster ) .

(fusionné par Junio CA Hamano -- gitster -- dans commit 1fdbfc4 , 30 mars 2017)

merge : drop ' git merge <message> HEAD <commit> 'syntaxe

Cesser de soutenir les " git merge <message> HEAD <commit> syntaxe " qui a est dépréciée depuis octobre 2007, et publie une dépréciation message d'avertissement depuis v2.5.0.

Que signifie le message d'avertissement à l'ancienne " 'git merge <msg> HEAD <commit>' is deprecated. " n'est plus.

2
répondu VonC 2017-04-14 00:40:38
la source

Autres questions sur git git-fetch