git pull error: error: ref remoto está em, mas esperado

227

Mensagem completa:

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
fonte
3
Aparentemente, alguém reescreveu o histórico do repositório por git push --force. Tente correr git pull --force.
precisa saber é o seguinte
1
Dá o mesmo erro com git push --force
Sanjeev Kumar Dangi
5
A resposta a esta pergunta resolveu este erro - stackoverflow.com/questions/3046436/…
Sanjeev Kumar Dangi

Respostas:

225

Se você estiver executando o git em um sistema de arquivos que não diferencia maiúsculas de minúsculas (Windows ou OS X), isso ocorrerá se houver duas ramificações com o mesmo nome, mas com letras maiúsculas diferentes, por exemplo, user_model_changese User_model_changescomo ambas as ramificações remotas corresponderem ao mesmo rastreamento ref .

Exclua a ramificação remota errada (você não deve ter ramificações que diferem apenas por caso) e, em seguida, git remote prune origintudo deve funcionar

Krijesta
fonte
obrigado pela resposta. Este não foi o problema com este erro. Eu já encontrei a solução para esse problema e postei um comentário abaixo da pergunta.
Sanjeev Kumar Dangi
2
Ajuda também para o Mac OS X (o sistema de arquivos padrão não diferencia maiúsculas de minúsculas).
Tammo Freese 9/09/13
12
Sim, o problema que não diferencia maiúsculas de minúsculas no Windows causou o problema. Corrigi-o removendo manualmente a ref na .git\refs\remotes\originpasta e git pullnovamente.
21815 Roy Ling13
e para quem não sabe onde estará a pasta .git .. ela será criada dentro da pasta Projeto / espaço de trabalho: D
kumar
1
Este é um bug do git (pelo menos a mensagem de erro está errada). Espero que alguém possa relatar esse bug para o projeto git. Parece-me difícil relatar um bug no projeto git. github.com/git/git
bronze man
190

Correção permanente

git update-ref -d resolvi minha instância desse erro, por exemplo

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

Observe que isso não afeta o controle remoto.

No meu caso, um subseqüente git fetchbuscou esse ramo novamente e o seguinte git busca / puxa não deu mais o erro "ref remoto está, mas é esperado".

Se isso não funcionar, uma correção temporária:

Observe também que, se você não se importa com o ramo em questão (por exemplo, apenas deseja atualizar o mestre, não a origem / usuário), uma git pullsolução alternativa é buscar e mesclar o ramo específico com o qual você se preocupa, por exemplo

git fetch # may give an error for a particular branch, but other branches will still be successfully fetched
git merge origin/master
JDiMatteo
fonte
Essa deve ser a solução aceita, pois resolve o problema sem tocar no controle remoto.
Cerno
52

Basta excluir as pastas e arquivos em \.git\refs\remotes\origin. Funciona quando você não possui alterações não enviadas.

Prakash Saravanan
fonte
Isso pode não funcionar se o seu ref remoto é 'embalado' e, portanto, não em refs / remotes / ** @ solução de JDiMatteo deve trabalhar então ainda
Alexander Ave
2
Trabalhou para mim. Muito obrigado!
Swapnil Patwa 22/03/19
Trabalhou como um encanto! Obrigado!
Anurag S Sharma
43

Eu executei isso para resolver o problema:

git gc --prune=now
elad prata
fonte
2
Isso corrigiu o problema para mim.
Aamir Rizwan
2
para mim também ..-- :)
Aravind R Pillai
3
Obrigado, esta solução foi corrigida para mim. Você poderia explicar um pouco mais sobre a solução que você forneceu.
Aamol
1
basicamente é apenas uma ferramenta de coletor de lixo git por isso apaga qualquer coisa que não está em sincronia, mas é no computador local para fins de armazenamento em cache
prata elad
42

Use os dois comandos abaixo, um por um.

git gc --prune=now

git remote prune origin

Isso resolverá seu problema.

Narender Gusain
fonte
1
Isso funciona para mim, mas quando eu faço outra git pull esta questão surge novamente
Jōjin
@Jojin O mesmo que você. E finalmente escolhi o caminho que Prakash Saravanan proporcionava
xi.lin
1
Isso deve ter uma classificação mais alta do que a sugestão de editar arquivos git :)
Mike Wise
somente essa solução funcionou para mim. Obrigado!
insaineyesay 18/06
12

Eu tive que remover minha ramificação da minha linha de comando em:

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

e depois fazendo manualmente:

git pull [remote_name] [branch_name]

Eu fui capaz de puxar as mudanças.

Nota: Eu estava usando o SourceTree e não consegui fazer o pull.

jogam5
fonte
Por fim, renomeei meus controles remotos: eu tinha dois controles remotos "Bitbucket / staging" e "bitbucket / staging" no meu histórico do SourceTree, mas apenas "Bitbucket" apareceu na linha de comando ao fazer: git remote -v. Então, renomei o Bitbucket para bitbucket e o conflito finalmente desapareceu. Espero que isso ajude os usuários mais prováveis ​​do SourceTree.
jogam5
Eu também tive que remover o ramo .git\packed-refsantes que ele fosse corrigido para mim.
Michael
6

Uma reinicialização completa também resolverá o problema

git reset --hard origin/master
mruanova
fonte
Você selecionou a melhor resposta?
Mruanova
5

Etapas mais claras

  1. no terminal

    cd /.git/refs/remotes/origin
    
  2. não ls, você vai ver alguns ramos e CABEÇA

  3. Remova o ramo que você acha que tem o problema

    rm branchname
    
  4. Se não funcionou, exclua todos os ramos / HEAD

    • você pode puxar

Espero que funcione agora.

shareef
fonte
isso é essencialmente o mesmo que git update-ref -d <branchname>?
Jt000 ​​# 11/18
2

Tente isso, funcionou para mim. Em seu terminal: git remote prune origin.

Ranganatha GV
fonte
2

Infelizmente, os comandos do GIT, como remover e redefinir ou empurrar, não funcionaram para mim. A remoção funcionou uma vez e o problema retornou.

A solução permanente que funcionou para mim é editar um arquivo git manualmente. Vá para a pasta .git do projeto e abra o arquivo embal-refs em um editor de texto como o Notepad ++. Em seguida, navegue até a linha com o ramo com falha e atualize seu guia para o esperado.

Se você tiver uma mensagem como:

"erro: não é possível bloquear ref 'refs / remotes / origin / feature / branch_xxx': está em 425ea23facf96f51f412441f41ad488fc098cf23, mas espera 383de86fed394ff1a1aeefc4a522d886adcecd79"

em seguida, no arquivo, encontre a linha com 'refs / remotes / origin / feature / branch_xxx'. O guia será o (2) esperado - 383de86fed394ff1a1aeefc4a522d886adcecd79. É necessário alterá-lo para o real (1º) primeiro - 425ea23facf96f51f412441f41ad488fc098cf23.

Repita o procedimento para os outros ramos com falha e será bom prosseguir. Às vezes, depois de buscar novamente, eu tinha que repetir para os mesmos ramos que eu já 'consertei' anteriormente. Ao buscar novamente as atualizações do GIT, você fornece os mais recentes.

De qualquer forma, o problema não é um obstáculo ao show. A lista de ramificações é atualizada. Este é um aviso.

Andrei S.
fonte
1

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

Luciano
fonte
0

Mesmo caso aqui, mas nada sobre comentários postados está certo no meu caso, eu tenho apenas uma ramificação (mestre) e uso apenas o sistema de arquivos Unix, esse erro ocorre aleatoriamente quando executo a origem e ramificação git fetch --progress --prune ou 'origem / mestre'. Ninguém pode confirmar, apenas 1 usuário pode fazer push.

NOTA: Eu tenho um submódulo no repositório acme, e o acme possui novas alterações no submódulo (novas confirmações). Preciso primeiro fazer uma atualização do submódulo com a atualização do submódulo 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

Para resolver esse problema (no meu caso), basta executar o primeiro git push se o seu ramo estiver à frente da origem.

Tecnocat
fonte
3
Sua resposta aqui refere-se apenas ao fato de que seu repositório local está à frente da origem após um novo commit. Esse é o estado natural de uma operação de confirmação do git local e não está relacionado à pergunta original.
davient 4/08/15
0

Eu sei que isso é antigo, mas tenho minha própria correção. Como estou usando a árvore de origem, esse erro ocorre porque alguém cria um novo ramo. A árvore de origem está confusa sobre isso. Depois de pressionar o botão "Atualizar" ao lado da caixa de seleção "ramificação remota para puxar", parece que o sourcetree atualizou a lista de ramificações e agora posso puxar com êxito.

Chen Li Yong
fonte
0

Eu tive o mesmo problema que foi causado porque redefinii para um commit mais antigo, apesar de já ter enviado para o ramo remoto.

Eu o resolvi excluindo minha ramificação local, verificando a ramificação de origem git checkout origin/my_branche executandogit checkout my_branch

Preto
fonte
-1

Depois de pesquisar constantemente, esta é a solução que funcionou para mim, o que implica desarmar / remover o Upstream

git branch --unset-upstream
Sugoi Reed
fonte