git pull error: erreur: la référence distante est à mais attendue

227

Message complet:

error: Ref refs/remotes/origin/user is at 3636498c2ea7735fdcedc9af5ab3c8689e6abe77 but expected a21359c6cc2097c85775cde6a40105f4bd7100ec
From github.com:{github project url}
 ! a21359c..6273ffc  user -> origin/user  (unable to update local ref)
Sanjeev Kumar Dangi
la source
3
Apparemment, quelqu'un a réécrit l'histoire du référentiel par git push --force. Essayez de courir git pull --force.
xaizek
1
Donne la même erreur avec git push --force
Sanjeev Kumar Dangi
5
Répondre à cette question a résolu cette erreur - stackoverflow.com/questions/3046436/…
Sanjeev Kumar Dangi

Réponses:

225

Si vous exécutez git sous un système de fichiers qui ne respecte pas la casse (Windows ou OS X), cela se produira s'il y a deux branches avec le même nom mais des majuscules différentes, par exemple user_model_changeset User_model_changescomme les deux branches distantes correspondront à la même référence de suivi .

Supprimez la mauvaise branche distante (vous ne devriez pas avoir de branches qui ne diffèrent que par la casse), puis git remote prune origintout devrait fonctionner

krijesta
la source
Merci de répondre. Ce n'était pas le problème avec cette erreur. J'ai déjà trouvé la solution à ce problème et publié en commentaire sous la question.
Sanjeev Kumar Dangi
2
Aide également pour Mac OS X (le système de fichiers par défaut est insensible à la casse).
Tammo Freese
12
oui, le problème insensible à la casse sur Windows a provoqué le problème. Je l'ai corrigé en supprimant manuellement la référence dans le .git\refs\remotes\origindossier, puis à git pullnouveau.
Roy Ling
et pour ceux qui ne savent pas où sera le dossier .git .. il sera créé dans votre dossier Project / workspace: D
kumar
1
C'est un bug git (au moins le message d'erreur est faux). J'espère que quelqu'un pourra rapporter ce bogue au projet git. Il me semble difficile de signaler un bogue au projet git. github.com/git/git
homme de bronze
190

Fix permanent

git update-ref -d résolu mon instance de cette erreur, par exemple

git update-ref -d refs/remotes/origin/user

Notez que cela n'a pas d'impact sur la télécommande.

Dans mon cas, un suivant a git fetchrécupéré à nouveau cette branche et les git fetches / pulls suivants n'ont plus donné l'erreur "la référence à distance est à mais attendue".

Si cela ne fonctionne pas, un correctif temporaire:

Notez également que si vous ne vous souciez pas de la branche en question (par exemple, vous voulez simplement mettre à jour le maître, pas l'origine / l'utilisateur), une git pullsolution de contournement consiste à récupérer puis simplement fusionner la branche particulière qui vous intéresse, par exemple

git fetch # may give an error for a particular branch, but other branches will still be successfully fetched
git merge origin/master
JDiMatteo
la source
Cela devrait être la solution acceptée car elle résout le problème sans toucher à la télécommande.
Cerno
52

Supprimez simplement les dossiers et fichiers sous \.git\refs\remotes\origin. Fonctionne, quand vous n'avez pas de changements non poussés.

Prakash Saravanan
la source
Cela pourrait ne pas fonctionner si votre référence à distance est `` emballée '' et donc pas dans les références / télécommandes / ** La solution de JDiMatteo devrait fonctionner alors
Alexander Bird
2
A travaillé pour moi. Merci beaucoup!
Swapnil Patwa
A fonctionné comme un charme! Merci!
Anurag S Sharma
43

J'ai exécuté ceci pour résoudre le problème:

git gc --prune=now
elad silver
la source
2
Cela a résolu le problème pour moi.
Aamir Rizwan
2
pour moi aussi ..-- :)
Aravind R Pillai
3
Merci, cette solution a été corrigée pour moi. Pourriez-vous expliquer un peu plus la solution que vous avez fournie.
Aamol
1
Fondamentalement, c'est juste un outil
Git Garbage
42

Utilisez les deux commandes ci-dessous une par une.

git gc --prune=now

git remote prune origin

Cela résoudra votre problème.

Narender Gusain
la source
1
Cela fonctionne pour moi, mais quand je fais un autre git pull, ce problème se présente à nouveau
Jojin
@Jojin Comme vous. Et j'ai finalement choisi la façon dont Prakash Saravanan a fourni
xi.lin
1
Cela devrait être évalué plus haut que la suggestion de modifier les fichiers git :)
Mike Wise
seule cette solution a fonctionné pour moi. Merci!
insaineyesay
12

J'ai dû supprimer ma branche de ma ligne de commande à:

.git\refs\remotes\{my remote}\{**my branch**}

puis faire manuellement:

git pull [remote_name] [branch_name]

J'ai pu tirer les changements.

Remarque: J'utilisais SourceTree et je n'ai pas pu effectuer la traction.

jogam5
la source
En fin de compte, j'ai renommé mes télécommandes: j'avais deux télécommandes "Bitbucket / staging" et "bitbucket / staging" dans mon historique SourceTree, mais seul "Bitbucket" est apparu sur la ligne de commande lors de l'exécution de: git remote -v. J'ai donc renommé Bitbucket en bitbucket et le conflit a finalement disparu, j'espère que cela aide les utilisateurs les plus probables de SourceTree.
jogam5
J'ai également dû retirer la branche .git\packed-refsavant qu'elle ne soit réparée pour moi.
Michael
6

Une réinitialisation matérielle résoudra également le problème

git reset --hard origin/master
mruanova
la source
Avez-vous sélectionné une meilleure réponse?
mruanova
5

Des étapes plus claires

  1. dans le terminal

    cd /.git/refs/remotes/origin
    
  2. faites ls, vous verrez quelques branches et HEAD

  3. Supprimez la branche qui, selon vous, présente le problème

    rm branchname
    
  4. Si cela ne fonctionnait pas, supprimez toutes les branches / HEAD

    • vous pouvez tirer wana

J'espère que cela fonctionne maintenant.

shareef
la source
est-ce essentiellement la même chose que git update-ref -d <branchname>?
jt000
2

Essayez ça, ça a marché pour moi. Dans votre terminal: git remote prune origin.

Ranganatha GV
la source
2

Malheureusement, les commandes GIT comme prune et reset ou push n'ont pas fonctionné pour moi. Prune a fonctionné une fois, puis le problème est revenu.

La solution permanente qui a fonctionné pour moi est de modifier un fichier git manuellement. Accédez simplement au dossier .git du projet, puis ouvrez le fichier pack-refs dans un éditeur de texte comme Notepad ++. Ensuite, accédez à la ligne avec la branche défaillante et mettez à jour son guide vers la ligne attendue.

Si vous avez un message comme:

"erreur: impossible de verrouiller la référence" références / télécommandes / origine / fonction / branche_xxx ": est à 425ea23facf96f51f412441f41ad488fc098cf23 mais attendue 383de86fed394ff1a1aeefc4a522d886adcecd79"

puis dans le fichier, trouvez la ligne avec 'refs / remotes / origin / feature / branch_xxx'. Le guid y sera celui attendu (2ème) - 383de86fed394ff1a1aeefc4a522d886adcecd79. Vous devez le remplacer par le vrai (1er) - 425ea23facf96f51f412441f41ad488fc098cf23.

Répétez l'opération pour les autres branches défaillantes et vous serez prêt à continuer. Parfois, après la récupération, je devais répéter pour les mêmes branches que j'avais déjà «corrigées» plus tôt. Lors de la récupération, les mises à jour de GIT guident et vous donnent la dernière.

Quoi qu'il en soit, le problème n'est pas un arrêt de spectacle. La liste des succursales est mise à jour. C'est plutôt un avertissement.

Andrei S.
la source
1

git for-each-ref --format = 'delete% (refname)' refs / original | git update-ref --stdin git reflog expire --expire = now --all git gc --prune = now

Luciano
la source
0

Même cas ici, mais rien sur les commentaires postés, c'est juste dans mon cas, je n'ai qu'une seule branche (maître) et n'utilise que le système de fichiers Unix, cette erreur se produit au hasard lorsque j'exécute git fetch --progress --prune origine et la branche est en avance ou 'origine / maître'. Personne ne peut valider, seul 1 utilisateur peut faire push.

REMARQUE: j'ai un sous-module dans le référentiel acme, et acme a de nouveaux changements de sous-module (nouveaux commits), j'ai d'abord besoin de faire une mise à jour du sous-module avec la mise à jour du sous-module git.

[2014-07-29 13:58:37] Payload POST received from Bitbucket
[2014-07-29 13:58:37] Exec: cd /var/www/html/acme
---------------------
[2014-07-29 13:58:37] Updating Git code for all branches
[2014-07-29 13:58:37] Exec: /usr/bin/git checkout --force master
[2014-07-29 13:58:37] Your branch is ahead of 'origin/master' by 1 commit.
[2014-07-29 13:58:37]   (use "git push" to publish your local commits)
[2014-07-29 13:58:37] Command returned some errors:
[2014-07-29 13:58:37] Already on 'master'
---------------------
[2014-07-29 13:58:37] Exec: /usr/bin/git fetch --progress --prune origin
[2014-07-29 13:58:39] Command returned some errors:
[2014-07-29 13:58:39] error: Ref refs/remotes/origin/master is at 8213a9906828322a3428f921381bd87f42ec7e2f but expected c8f9c00551dcd0b9386cd9123607843179981c91
[2014-07-29 13:58:39] From bitbucket.org:acme/acme
[2014-07-29 13:58:39]  ! c8f9c00..8213a99  master     -> origin/master  (unable to update local ref)
---------------------
[2014-07-29 13:58:39] Unable to fetch Git data

Pour résoudre ce problème (dans mon cas), lancez simplement git push si votre branche est en avance sur l'origine.

Tecnocat
la source
3
Votre réponse ici ne concerne que le fait que votre référentiel local est en avance sur l'origine après un nouveau commit. Il s'agit de l'état naturel d'une opération de validation git locale et ne se rapporte pas à la question d'origine.
davient
0

Je sais que c'est vieux, mais j'ai ma propre solution. Étant donné que j'utilise l'arborescence source, cette erreur se produit car quelqu'un crée une nouvelle branche. L'arbre source est confus à ce sujet. Après avoir appuyé sur le bouton "Actualiser" à côté de la zone de liste déroulante "branche distante pour tirer", il semble que sourcetree a mis à jour la liste des branches, et maintenant je peux tirer avec succès.

Chen Li Yong
la source
0

J'ai eu le même problème qui était dû au fait que je suis revenu à un commit plus ancien même si j'ai déjà poussé vers la branche distante.

Je l'ai résolu en supprimant ma branche locale, puis en vérifiant la branche d'origine git checkout origin/my_branchet en exécutantgit checkout my_branch

Noir
la source
-1

Après avoir constamment recherché, c'est la solution qui a fonctionné pour moi qui implique de désinstaller / supprimer le amont

git branch --unset-upstream
Sugoi Reed
la source