Sélection d'une seule branche: fetch/ merge vs. pull
Les gens vous conseillent souvent de séparer "récupération" de "fusion". Ils disent au lieu de ceci:
git pull remoteR branchB
faites ceci:
git fetch remoteR
git merge remoteR branchB
Ce qu'ils ne mentionnent pas, c'est qu'une telle commande d'extraction récupérera en fait toutes les branches du dépôt distant, ce qui n'est pas ce que fait cette commande d'extraction. Si vous avez des milliers de branches dans le référentiel distant, mais que vous ne voulez pas les voir toutes, vous pouvez exécuter cette commande obscure:
git fetch remoteR refs/heads/branchB:refs/remotes/remoteR/branchB
git branch -a # to verify
git branch -t branchB remoteR/branchB
Bien sûr, c'est ridiculement difficile à retenir, donc si vous voulez vraiment éviter de récupérer toutes les branches, il est préférable de modifier votre .git/configcomme décrit dans ProGit.
Hein?
La meilleure explication de tout cela se trouve dans le chapitre 9-5 de ProGit, Git Internals - The Refspec ( ou via github ). C'est incroyablement difficile à trouver via Google.
Premièrement, nous devons clarifier une certaine terminologie. Pour le suivi des branches distantes, il y a généralement 3 branches différentes à connaître:
- La branche sur le repo distant:
refs/heads/branchBà l'intérieur de l'autre repo
- Votre agence de suivi à distance :
refs/remotes/remoteR/branchBdans votre repo
- Votre propre agence:
refs/heads/branchBdans votre repo
Les branches de suivi à distance (in refs/remotes) sont en lecture seule. Vous ne les modifiez pas directement. Vous modifiez votre propre branche, puis vous poussez vers la branche correspondante dans le dépôt distant. Le résultat n'est reflété dans votre refs/remotesqu'après une extraction ou une récupération appropriée. Cette distinction était difficile pour moi à comprendre à partir des pages de manuel de git, principalement parce que la branche locale ( refs/heads/branchB) est censée "suivre" la branche de suivi à distance lorsqu'elle est .git/configdéfinie branch.branchB.remote = remoteR.
Considérez les «refs» comme des pointeurs C ++. Physiquement, ce sont des fichiers contenant des résumés SHA, mais en gros, ce ne sont que des pointeurs vers l'arborescence de commit. git fetchajoutera de nombreux nœuds à votre arbre de validation, mais comment git décide quels pointeurs déplacer est un peu compliqué.
Comme mentionné dans une autre réponse , ni
git pull remoteR branchB
ni
git fetch remoteR branchB
bougerait refs/remotes/branches/branchB, et ce dernier ne peut certainement pas bouger refs/heads/branchB. Cependant, les deux bougent FETCH_HEAD. (Vous pouvez catn'importe lequel de ces fichiers à l'intérieur .git/pour voir quand ils changent.) Et git mergese référera à FETCH_HEAD, lors du réglage MERGE_ORIG, etc.
git fetch origin an-other-branchstocke la pointe récupérée dansFETCH_HEAD, mais pasorigin/an-other-branch(c'est-à-dire la «branche de suivi à distance» habituelle). Donc, on pourrait fairegit fetch origin an-other-branch && git merge FETCH_HEAD, mais le faire comme @Gareth le dit est mieux (ou simplement utiliser git pull ).