J'ai mis en place des branches de suivi à distance dans git, mais je ne semble jamais être en mesure de les fusionner dans la branche locale une fois que je les ai mises à jour avec 'git fetch'.
Par exemple, supposons que j'ai une branche distante appelée «an-other-branch». Je l'ai configuré localement en tant que branche de suivi en utilisant
git branch --track an-other-branch origin/an-other-branch
Jusqu'ici tout va bien. Mais si cette branche est mise à jour (généralement en déplaçant la machine et en m'engageant à partir de cette machine), et que je souhaite la mettre à jour sur la machine d'origine, je rencontre des problèmes avec l'extraction / fusion:
git fetch origin an-other-branch
git merge origin/an-other-branch
Chaque fois que je fais cela, j'obtiens un message «Déjà à jour» et rien ne fusionne.
Cependant, un
git pull origin an-other-branch
le met toujours à jour comme prévu.
Aussi, exécuter git diff
git diff origin/an-other-branch
montre qu'il y a des différences, donc je pense que ma syntaxe est erronée.
Qu'est-ce que je fais mal?
EDIT [2010-04-09]: J'ai vérifié plusieurs fois, et je ne suis certainement pas sur une branche différente. Mon 'git fetch' suivi d'un 'git merge' (comme indiqué ci-dessus) devrait-il faire exactement la même chose qu'un git pull? Je vais avoir un flux de travail montrant les résultats d'un statut git, 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 ).git merge origin/an-other-branch
fusionnerorigin/an-other-branch
dans toutes les branches locales qui sont configurées pour le suivre? comment puis-je fusionner dans une seule succursale locale?git pull
(sans arguments) - quelle branche fusionne-t-elle? Fusionne-t-il la branche de suivi à distance correspondant à la branche actuelle ?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:
faites ceci:
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:
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:
refs/heads/branchB
à l'intérieur de l'autre reporefs/remotes/remoteR/branchB
dans votre reporefs/heads/branchB
dans votre repoLes 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 votrerefs/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éfiniebranch.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
ni
bougerait
refs/remotes/branches/branchB
, et ce dernier ne peut certainement pas bougerrefs/heads/branchB
. Cependant, les deux bougentFETCH_HEAD
. (Vous pouvezcat
n'importe lequel de ces fichiers à l'intérieur.git/
pour voir quand ils changent.) Etgit merge
se référera àFETCH_HEAD
, lors du réglageMERGE_ORIG
, etc.la source
Êtes-vous sûr d'être sur le local
an-other-branch
lorsque vous fusionnez?L' autre explication :
Mais dans votre cas, si cela
git pull
fonctionne, cela signifie simplement que vous n'êtes pas sur la bonne branche.la source
Git pull est en fait un outil combo: il exécute git fetch (obtenir les modifications) et git merge (les fusionner avec votre copie actuelle)
Êtes-vous sûr d'être sur la bonne branche?
la source
ce sont les commandes:
si vous faites cela sur la deuxième ligne:
il essaiera de fusionner le maître local dans votre branche actuelle.
La question, telle que je l'ai comprise, était que vous avez déjà récupéré localement et que vous souhaitez maintenant fusionner votre branche avec la dernière de la même branche.
la source