Git pull: erro: entrada foo not uptodate. Não é possível mesclar

86

Estou tentando atualizar meu repo de um branch remoto e continuo recebendo este erro quando faço um "git pull". Não fiz nenhuma alteração local e, mesmo que tenha, não preciso mantê-las.

Eu tentei:

git reset --hard

e eu tenho o mesmo problema

A única coisa que parece funcionar é deletar o arquivo problemático e tentar um git pull novamente.

Eu também tentei git stashseguido por um git pull. Não vá.

editar: usando PortableGit-1.6.4-preview20090729, portanto, quaisquer bugs anteriores com erros espúrios devem ser corrigidos.

yuit
fonte
Veja se a explicação em git.or.cz/gitwiki/GitFaq ajuda.
Jakub Narębski
Idem " A única coisa que parece funcionar é deletar o arquivo problemático e tentar um git pull novamente. ". Para mim, pelo menos um arquivo não estava no git; foi ignorado por uma regra curinga. Não sei por que eles eram bloqueadores, no entanto.
ruffin de
3
Consegui resolver isso executando git rm --cached learned/tests/temp_funcs.py- Como queria que o arquivo permanecesse na lista Arquivos não rastreados , git rm --cachedme desbloqueei neste caso.
Profundo
1
Isso aconteceu comigo durante uma fusão que eu desejava --abort. Nenhuma das soluções propostas me permitiu abortar, exceto para excluir os arquivos ofensivos.
Trevor Reid

Respostas:

55

Há algumas maneiras de corrigir isso, mas descobri que git stash funciona bem para mim. Ele temporariamente coloca suas mudanças locais em outro lugar. Em seguida, você pode puxar para obter as alterações mais recentes. E então você pode obter suas alterações locais de volta.

Bem assim:

$ git pull
...
...
file your_file.rb not up to date, cannot merge.

$ git stash
$ git pull
$ git stash pop
manat
fonte
21
Da pergunta original: "Eu também tentei" git stash "seguido por um" git pull ". Não vá."
Charles Wood
Não funcionou para mim - no meu caso eu tive que fazer git rm --cached, comentário completo: stackoverflow.com/questions/1248029/…
Profundo
37

Isso pode acontecer se você atualizar o índice para ignorar certos arquivos:

git update-index --assume-unchanged <file>

e então, por exemplo, verifique algum outro branch:

git checkout <branch>
> error: Entry '<file>' not uptodate. Cannot merge.

Forçar a atualização do índice corrige o problema:

git update-index --really-refresh
<file>: needs update

Seguido por:

git reset --hard 

E então tudo deve voltar ao normal.

habitats
fonte
1
Consegui resolver isso executando git rm --cached learned/tests/temp_funcs.py- Como queria que o arquivo permanecesse na lista Arquivos não rastreados , git rm --cachedme desbloqueei neste caso.
Profundo
3
A git update-index --really-refreshera a peça que faltava! Muito bem, isto foi difícil de encontrar
Bernardo Dal Corno
28

Esse tipo de problema é freqüentemente causado ao tentar extrair de um repositório que possui dois nomes de arquivo que diferem apenas no caso. Se você estiver em FAT, NTFS no modo sem distinção entre maiúsculas e minúsculas (essencialmente, a qualquer momento em que estiver sendo usado no Windows) ou HFS + no modo sem distinção entre maiúsculas e minúsculas e tiver dois arquivos "foobar" e "FOOBAR", o Git verá dois arquivos distintos arquivos, mas o sistema de arquivos verá apenas um, o que causará todos os tipos de problemas. O Git fará checkout, digamos, "FOOBAR" e, em seguida, "foobar", que o sistema de arquivos vê como uma simples substituição do conteúdo de "FOOBAR", mas deixando-o no lugar. Agora, para o Git, parece que "FOOBAR" foi substituído pelo conteúdo de "foobar" e "foobar" desapareceu.

Existem duas manifestações diferentes desse problema básico. Um é quando o seu repositório contém dois arquivos que diferem apenas na caixa. Nesse caso, você precisa trabalhar em um sistema de arquivos com distinção entre maiúsculas e minúsculas ou editar o repositório para garantir que não ocorram colisões desse tipo; um sistema de arquivos que não faz distinção entre maiúsculas e minúsculas simplesmente não pode armazenar o conteúdo deste repositório.

Um caso diferente que você pode contornar é quando ocorre uma renomeação que altera o caso do arquivo. Digamos, por exemplo, que o repositório Git contém uma renomeação de "EXEMPLO" para "exemplo". Antes de Git verificar a nova versão, ele tentará e verificará se não está sobrescrevendo algum arquivo existente que você tem em seu disco. Uma vez que ele pensa que "exemplo" é um novo nome de arquivo, ele perguntará ao sistema de arquivos se ele existe, e o sistema de arquivos verá "EXEMPLO" e dirá sim, então o Git se recusará a verificar a nova versão, pois acha que será sobrescrito arquivos não rastreados. Nesse caso, se você não tiver mudanças locais de seu interesse, um simplesgit reset --hard <revision-to-checkout>geralmente será suficiente para você superar o problema e ir para a nova revisão. Apenas tente e lembre-se de não renomear arquivos com outros nomes que diferem apenas no caso de você estar em um sistema de arquivos que não diferencia maiúsculas de minúsculas, pois isso causará problemas como este.

Brian Campbell
fonte
14

Para mais detalhes sobre a postagem de @Brian Campbell (porque o reset hard também não funcionou), quero apontar um caso extremo que estava me impedindo.

Mudei um arquivo OldFilepara uma pasta diferente e o renomeei NewFile. Em seguida, sinalizei o arquivo como assume-unchanged.

Isso estava me impedindo de trocar de branches e não havia stash para salvar ou commitar para push. O problema é que não confirmei essa alteração de arquivo com um novo nome antes de definir o assume-unchangedsinalizador. Então eu configurei de volta para no-assume-unchanged, confirmei e, em seguida, configurei de volta para assume-unchangede eu poderia alternar de novo

Agressor
fonte
1
Essa resposta me colocou no caminho certo, obrigado. Eu usei "git ls-files -v | grep '^ [[: lower:]]' | awk '{print $ 2}' | xargs git update-index --no-assume-unchanged" para redefinir o sinalizador assume-inalterado , então fui capaz de redefinir --hard sem erros.
ocroquette de
Acho que isso também se aplica a qualquer arquivo marcado como 'assum-inalterado'. Tive o mesmo problema ao ignorar alterações em um arquivo local que tinha seu nome original. Seu comentário me lembrou que eu havia marcado aquele arquivo, obrigado!
Jake_
5
Eu tenho o mesmo problema. Basicamente, "assumir inalterado" é uma característica maligna. Depois de usá-lo, torna-se MUITO difícil verificar outros branches. Mesmo se você usar checkout -f, ele falhará.
John Henckel
13

De um modo geral, isso significa que você tem alterações em seus arquivos locais que não foram enviadas para seu repositório local. Você também pode ver esta questão stackoverflow para um pouco mais de detalhes.

codificar
fonte
11
Da pergunta: "Não fiz nenhuma alteração local ..."
Charles Wood
É um bug do git ou é uma corrupção do repositório git.
Warren P
11

Eu estava vendo um problema semelhante (Windows 10): eu estava ligado branchAe queria acessar master. Tive algumas mudanças não confirmadas, então primeiro eu git stash, git checkout -f mastermas ainda consegui Entry 'fileName' not uptodate. Cannot merge.

git status não estava mostrando nada para cometer.

Acabei removendo o arquivo manualmente e fui capaz de ir para o outro branch (o que obviamente fez meu arquivo voltar), então acho que houve um bug em algum lugar do git.

user276648
fonte
1
Esta é a única solução para esta questão que funcionou para mim. Estava recebendo o erro com o .gitignorearquivo! Mesmo que eu não tenha feito nenhuma mudança nele, e o git não me permitiria "esconder" (porque não há mudanças locais, dã!) Então, movi o .gitignorearquivo para fora do repositório (como uma espécie de "backup") e, em seguida, fiz um git reset --hard, que "consertou" o repositório em um estado são.
Homem Mascarado
git statusme mostrou qual arquivo foi alterado e sugeriu que eu poderia usar em git restore myFilevez de excluí-lo, o que funcionou.
Noumenon,
7

Pode ser um problema também com as permissões de arquivo. O Git também está versionando-os, a menos que o config diga o contrário. Apenas adicionando esta resposta para pessoas que têm quase, mas não o problema semelhante.

Drachenfels
fonte
5

Vale a pena tentar:

Você poderia definir, apenas para esta atualização, definir o parâmetro de configuraçãocore.trustctime como falso?

core.trustctime

Se false, as diferenças de ctime entre o índice e a cópia de trabalho são ignoradas; útil quando o tempo de mudança do inode é regularmente modificado por algo fora do Git (rastreadores do sistema de arquivos e alguns sistemas de backup).

VonC
fonte
2
bom achado, isso realmente funcionou para mim quando vi a mensagem de erro acima ao executar "git reset --merge". Quando eu defini esse parâmetro como falso, ele eliminou o erro.
DemitryT
1
Funcionou para mim ao verificar conflitos com outro branch usando "git merge <feature> --no-ff --no-commit" e revertendo com "git merge --abort". O Xcode era "algo fora do Git" neste caso. Obrigado quase 10 anos depois!
Ralfonso
@Ralfonso Quase dez anos depois, você é muito bem-vindo :)
VonC
2

Adicionando minha resposta porque nenhum dos outros mencionou isso. No meu caso, isso aconteceu depois que adicionei novos arquivos ao índice com o -Nsinalizador, apenas adicionando-os ao índice sem adicionar seu conteúdo. Nesse estado, fazer git stashproduz esse erro.

Aviad P.
fonte
0

Eu tive o mesmo erro, após uma situação em que git statusdisse new file: foo.cpppara um arquivo não adicionado à área de teste. ou seja, sob o título "Alterações não preparadas para confirmação". Muito estranho, isso geralmente não acontece.

Solução:, git add foo.cppe depois git stashfuncionou novamente.

David Faure
fonte