J’ai installé des twigs de suivi à distance dans git, mais je ne semble jamais pouvoir les fusionner dans la twig locale une fois que je les ai mises à jour avec «git fetch».
Par exemple, supposons que j’ai une twig distante appelée «une autre twig». Je mets ça en local comme une twig de suivi en utilisant
git branch --track an-other-branch origin/an-other-branch
Jusqu’ici tout va bien. Mais si cette twig est mise à jour (généralement en déplaçant la machine et en validant depuis cette machine), et que je souhaite la mettre à jour sur la machine d’origine, je rencontre des problèmes avec fetch / merge:
git fetch origin an-other-branch git merge origin/an-other-branch
Chaque fois que je le fais, je reçois un message «Déjà à jour» et rien ne se fusionne.
Cependant, un
git pull origin an-other-branch
le met toujours à jour comme prévu.
Aussi, en cours d’exécution git diff
git diff origin/an-other-branch
montre qu’il y a des différences, donc je pense que ma syntaxe est incorrecte.
Qu’est-ce que je fais mal?
EDIT [2010-04-09]: J’ai vérifié plusieurs fois et je ne suis pas sur une autre twig. Est-ce que mon “git fetch” suivi d’un “git merge” (comme indiqué ci-dessus) fait exactement la même chose qu’un git pull? Je vais avoir un stream de travail montrant les résultats d’un statut git, etc.
Vous ne récupérez pas une twig, vous récupérez une télécommande entière:
git fetch origin git merge origin/an-other-branch
fetch
/ merge
vs pull
Les gens vous conseillent souvent de séparer “chercher” de “fusionner”. Ils disent au lieu de cela:
git pull remoteR branchB
fais ceci:
git fetch remoteR git merge remoteR branchB
Ce qu’ils ne mentionnent pas, c’est qu’une telle commande va récupérer toutes les twigs du repo distant, ce qui n’est pas ce que fait la commande pull. Si vous avez des milliers de twigs dans le repo 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 twigs, il est préférable de modifier votre .git/config
comme décrit dans ProGit.
La meilleure explication de tout cela se trouve au chapitre 9-5 de ProGit, Git Internals – The Refspec ( ou via github ). C’est incroyablement difficile à trouver via Google.
Premièrement, nous devons clarifier certains termes. Pour le suivi des succursales à distance, il existe généralement trois twigs différentes:
refs/heads/branchB
dans l’autre repo refs/remotes/remoteR/branchB
dans votre repo refs/heads/branchB
dans votre repo Les twigs de suivi à distance (dans les refs/remotes
) sont en lecture seule. Vous ne les modifiez pas directement. Vous modifiez votre propre twig, puis vous poussez sur la twig correspondante au repo distant. Le résultat ne se reflète pas dans vos refs/remotes
avant une traction ou une extraction appropriée. Cette distinction était difficile à comprendre pour les pages de manuel de git, principalement parce que la twig locale ( refs/heads/branchB
) est censée “suivre” la twig de suivi à distance lorsque .git/config
définit branch.branchB.remote = remoteR
.
Pensez à ‘refs’ en tant que pointeurs C ++. Physiquement, ce sont des fichiers contenant des condensés SHA, mais fondamentalement, ils ne sont que des pointeurs dans l’arbre de validation. git fetch
va append de nombreux nœuds à votre arbre de validation, mais la façon dont git décide quels pointeurs déplacer est un peu compliquée.
Comme mentionné dans une autre réponse , ni
git pull remoteR branchB
ni
git fetch remoteR branchB
déplacerait refs/remotes/twigs/branchB
, et ce dernier ne peut certainement pas déplacer les refs/heads/branchB
. Cependant, les deux déplacent FETCH_HEAD
. (Vous pouvez .git/
n’importe lequel de ces fichiers dans .git/
pour voir quand ils changent.) Et git merge
fera référence à FETCH_HEAD
, tout en définissant MERGE_ORIG
, etc.
Etes-vous sûr d’être sur la an-other-branch
locale quand vous fusionnez?
git fetch origin an-other-branch git checkout an-other-branch git merge origin/an-other-branch
L’ autre explication :
Toutes les modifications de la twig que vous essayez de fusionner ont déjà été fusionnées dans la twig sur laquelle vous vous trouvez.
Plus précisément, cela signifie que la twig que vous essayez de fusionner est un parent de votre succursale actuelle.Si vous êtes en avance sur le repo à distance par un commit, c’est le repo à distance qui est obsolète, pas vous.
Mais dans votre cas, si git pull
fonctionne, cela signifie simplement que vous n’êtes pas sur la bonne twig.
Git pull est en fait un outil combo: il lance git fetch (obtenir les modifications) et git merge (en les fusionnant avec votre copie actuelle)
Êtes-vous sûr d’être sur la bonne twig?
Voici les commandes:
git fetch origin git merge origin/somebranch somebranch
Si vous le faites sur la deuxième ligne:
git merge origin somebranch
il va essayer de fusionner le maître local dans votre twig actuelle.
La question, telle que je l’ai comprise, était que vous étiez déjà allé localement et que vous vouliez maintenant fusionner votre twig avec la dernière de la même twig.