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/config
comme 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/branchB
dans votre repo
- Votre propre agence:
refs/heads/branchB
dans 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/remotes
qu'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/config
dé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 fetch
ajoutera 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 cat
n'importe lequel de ces fichiers à l'intérieur .git/
pour voir quand ils changent.) Et git merge
se référera à FETCH_HEAD
, lors du réglage MERGE_ORIG
, etc.
git fetch origin an-other-branch
stocke 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 ).