git: updates foram rejeitados porque o controle remoto contém trabalho que você não tem localmente

114

Estou trabalhando em uma equipe com alguns desenvolvedores usando git no BitBucket. Estamos todos trabalhando em um devbranch, não empurrando masteraté o lançamento.

Um dos desenvolvedores cometeu um código incorreto que sobrescreveu o meu por acidente, e agora estou tentando enviar o código correto de volta para o repositório. Tenho lido sobre este erro há alguns dias, não consigo mais enviar para o repo porque estou recebendo o seguinte erro:

 ! [rejected]        master -> dev (fetch first)
error: failed to push some refs to 'https://[email protected]/repo_user/repo_name.git'
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing
hint: to the same ref. You may want to first integrate the remote changes
hint: (e.g., 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.

Eu sigo as instruções e pull, mas recebo um conflito de mesclagem. Depois de inserir uma mensagem para o conflito de mesclagem, meu código local agora é o código incorreto que o outro desenvolvedor carregou acidentalmente (como esperado do pull). Portanto, substituo o código incorreto pelo backup que copiei antes de confirmar e, quando tento enviar novamente, recebo o mesmo erro.

É muito frustrante, quero muito ajudar minha equipe e contribuir, mas não posso por causa desse erro. Alguém sabe como resolver esse problema? Eu apreciaria muito qualquer ajuda.

Estes são os comandos que executo para confirmar, se isso ajudar alguém:

git pull remotename master:dev
git add --all
git commit -m "some message"
git pull remotename master:dev
git push remotename master:dev

Eu teria pensado que, se mantivesse essa ordem, não receberia conflitos de mesclagem. Eu acho que estava errado. obrigado novamente

Atualização: devo acrescentar que procurei por algumas horas no Google e stackoverflow, e segui instruções diferentes, mas ainda não consigo pushpara o devbranch.

Delos
fonte

Respostas:

42

git pull <remote> master:devirá buscar o remote/masterbranch e mesclá-lo em seu local/devbranch.

git pull <remote> devirá buscar o remote/devbranch e mesclá-lo com o seu branch atual.

Acho que você disse que o commit conflitante está ativado remote/dev, então esse é o branch que você provavelmente pretendia buscar e mesclar.

Nesse caso, você não estava realmente mesclando o conflito em seu branch local, o que é meio estranho, já que você disse que viu o código incorreto em sua cópia de trabalho. Você pode querer verificar o que está acontecendo em remote/master.

Jeff
fonte
1
Uau ... eu nunca soube disso. Mas agora faz muito sentido. O branch master também estava incorreto, então sua resposta esclarece toda a minha pergunta. Eu ainda sou um pouco novo no git. Muito obrigado por me dizer a diferença entre esses dois!
delos
6
A melhor opção para mim era git pull --rebase.
derekmx271
154

Use este comando no terminal

git push -f origin master

Donal
fonte
49
Usar a sinalização force push (-f) é muito perigoso e nunca deve fazer parte de seu fluxo de trabalho regular
Spaideri
5
Votei negada porque estou perdendo algum aviso nesta resposta.
Melebius
2
Ooh! Isso força o repositório a se reescrever.
Azarsa
3
Eu tive o mesmo erro com o github e corrigi-lo com este comando, @theeastcoastwest por que você está dizendo que isso é perigoso? qual é o seu motivo "
simon
3
@simon, isso é perigoso porque ignora o trabalho remoto e força suas alterações no repo. Portanto, se você não quer atrapalhar o trabalho da sua equipe, NÃO force o push.
Gásten
42

Acontece quando estamos tentando enviar para o repositório remoto, mas criamos um novo arquivo remoto que ainda não foi retirado, digamos Readme. Nesse caso, como diz o erro

git rejeita a atualização

como não temos atualizado remotamente em nosso ambiente local. Então, pegue primeiro do controle remoto

git pull

Isso atualizará seu repositório local e adicionará um novo Readmearquivo. Em seguida, envie as alterações atualizadas para o remoto

git push origin master
Himanshu
fonte
Eu estava fazendo git pull origin developem meu ramo de desenvolvimento local, mas agora, apenas git pullfunciona bem para mim, não sei por quê.
Alex
porque por padrão se o seu branch local está sincronizado com o branch remoto e você fez check-out nesse branch, você não precisa especificar um branch apenas git pullé o suficiente
Himanshu
11

Isso geralmente acontece quando o repo contém alguns itens que não existem localmente. Portanto, para enviar nossas alterações, neste caso precisamos integrar as alterações remotas e, em seguida, enviar.

Portanto, crie uma atração remota

git pull origin master

Em seguida, envie as alterações para esse controle remoto

git push origin master
Sravya
fonte
10

Força para empurrar

git push -f origin master

Samir Poudel
fonte
2
Isso provavelmente deve vir com um aviso.
Chris
7

Eu consertei, não tenho certeza do que fiz. Tentei simplesmente empurrar e puxar usando:

git pull <remote> dev ao invés de git pull <remote> master:dev

Espero que isso ajude alguém se eles estão tendo o mesmo problema.

Delos
fonte
6

Você precisa inserir:

$ git pull
$ git fetch 
$ git merge

Se você usar um git push origin master --force, terá um grande problema.

Gaoyehua
fonte
5
Por que você precisa usar git fetche git mergenovamente manualmente após a execução git pullque os contém ?
Melebius
6

Você pode tentar isto: git pull origin master --rebase

Eduardo ramos
fonte
2
Oi Eduardo! Isso funcionou para mim. Mas você pode explicar por que funciona? O que esse comando faz exatamente?
Akshaya Natarajan
4

Bem, na verdade o github é muito mais simples do que pensamos e absolutamente acontece sempre que tentamos fazer push, mesmo depois de inserirmos explicitamente alguns arquivos em nosso repositório git, então, para corrigir o problema, basta tentar ..

: git pull

e depois..

: git push

Nota: se você acidentalmente travou no editor vim depois de puxar seu repositório, não se preocupe, apenas feche o editor vim e tente push :)

d337
fonte
4

Eu fiz as etapas abaixo. finalmente está funcionando bem.

Passos

1) git init

2) git status (para verificar o status)

3) git add. (adicione todo o arquivo de mudança (.))

4) git commit -m "<pass your comment>"

5) git remote add origin "<pass your project clone url>"

6) git pull --allow-unrelated-histories "<pass your project clone url>"master

7) git push -u "<pass your project clone url>"master

Prabhat
fonte
2

Eu tive esse erro e foi porque havia uma atualização no servidor, mas o SourceTree não estava mostrando nenhuma atualização disponível (possivelmente porque eu estava offline na última verificação). Então, eu fiz uma atualização na árvore de origem e agora mostra 2 itens para enviar em vez de 1 item.

Portanto, certifique-se de pressionar atualizar ou puxar se você receber este erro e tente novamente.

1,21 gigawatts
fonte
1

git pull --rebase origin master

git push origin master


git push -f origin master

Aviso git push -f origin master

  • empurra vigorosamente no repositório existente e também exclui repositórios anteriores, então se você não precisar de versões anteriores, isso pode ser útil
Bhavesh Chand
fonte
1

O erro possivelmente vem por causa da estrutura diferente do código que você está enviando e aquele presente no GitHub. Você pode consultar: Como lidar com o erro " recusar-se a mesclar históricos não relacionados ":

$ git pull --allow-unrelated-histories
$ git push -f origin master
Kourosh Neyestani
fonte
1

A melhor opção para mim e funciona e simples

git pull --rebase

então

git push

boa sorte

Omar Abusabha
fonte
1

Foi assim que resolvi esse problema:

  1. git pull origin master
  2. git push origin master

Isso geralmente acontece quando seu branch remoto não é atualizado. E depois disso, se você receber um erro como "Por favor, digite uma mensagem de confirmação" Consulte isto (Para mim, xiaohu Wang, a resposta funcionou :))

SalomiEdward
fonte
0

Eu tive um projeto SSDT VS primeiro. Eu queria enviar o projeto como o fiz para o Github. Eu queria que esse push fosse a versão inicial do meu repo iniciando o branch master. A sugestão de Donal de git push -f origin master foi a maneira mais fácil (que eu vi) de fazer isso. Como não precisei me preocupar em reescrever nada, parecia fazer sentido.

cromastro
fonte
0

Eu tive o mesmo problema. Acontece que criei o arquivo .Readme no repositório sem puxá-lo primeiro.

Você pode excluir o arquivo .Readme ou puxá-lo antes de empurrar.

Martin Oputa
fonte
Não tenho certeza se esta resposta a uma pergunta de 5 anos fornece algum valor adicional, além de não fornecer uma solução para o problema específico do OP. Como você é um novo contribuidor, dê uma olhada no guia sobre como responder a perguntas: stackoverflow.com/help/how-to-answer
Sotiris Koukios-Panopoulos
0

você pode usar

git pull --rebase <your_reponame> <your_branch>

isso ajudará no caso de você ter algumas alterações ainda não registradas em seu repositório local. especialmenteREADME.md

braspy
fonte