Git push falhou, “Atualizações não rápidas foram rejeitadas”

99

Eu editei meus repositórios GIT via Git Online. Depois de tentar empurrar minhas alterações de código local, recebi um erro:

Git push failed, To prevent from losing history, non-fast forward updates were rejected.

Como posso consertar isso?

Sarath
fonte

Respostas:

137

Puxe as alterações primeiro:

git pull origin branch_name
iafonov
fonte
1
Se isso não resolver o seu problema, certifique-se de que você está enviando para o mesmo branch daquele em que está trabalhando no momento. Verifique em qual branch você está com o "status git".
afilina
1
Este comando funcionou comigo, mas gostaria de saber, por que não git pull:? O controle remoto é igual origin, para que ele realmente funciona: git pull origin. Não deveria atualizar todos os ramos?
Karlen Kishmiryan de
83

Adicione --force à sua linha de comando se tiver certeza de que deseja enviar. Por exemplo, use git push origin --force(eu recomendo a linha de comando, pois você encontrará muito mais suporte de outros usuários com a linha de comando. Também pode não ser possível com o SmartGit.) Consulte este site para obter mais informações: http://help.github.com/ Remotos/

Matt
fonte
8
--force resolverá seus problemas, mas potencialmente prejudicará outras pessoas. Deve ser usado apenas com muito cuidado (e conhecimento)
schoetbi
7
-1 porque forçar empurra em geral é uma ideia terrível.
joshin4colours
6
+1 porque 5 pessoas concordaram com @ joshin4colours em dar -1. Mas embora o push forçado nem sempre seja a melhor ideia (o que o git deixa bem claro ao negar o push), se fosse uma ideia ruim 100% do tempo, a opção não existiria. A sugestão de Matt aqui certamente pode ser útil para outras pessoas.
user1271772
2
Sinta-se à vontade para usar o --forcese você for o único usando esse branch. No entanto, isso causa problemas ao compartilhar um branch com outros desenvolvedores.
Robert Brisita
22

Antes de empurrar, faça um git pull com a opção rebase. Isso obterá as alterações que você fez online (em sua origem) e as aplicará localmente, em seguida, adicionará suas alterações locais sobre elas.

git pull --rebase

Agora, você pode empurrar para remoto

git push 

Para obter mais informações, dê uma olhada na explicação do rebase Git e no Capítulo 3.6 Ramificação do Git - Rebase .

satishgoda
fonte
2
No meu caso git pull --rebaseacaba comThere is no tracking information for the current branch. Please specify which branch you want to rebase against.
trejder
17

Encontrei o mesmo erro, basta adicionar "--force" ao comando, funciona

git push origin master --force
Wen Qi
fonte
6
existem consequências para isso?
jayunit100
8
perder commits de outros.
Giovanni Toraldo
1
Eu tive uma situação estranha em que isso é exatamente o que eu queria fazer ... explodir o conteúdo de um branch master remoto recém-criado com algo novo. Isso resolveu meu problema. Embora não seja a solução para todos, --forcepode ser útil.
Brad
1
Não acho que essa resposta mereça ser rejeitada 6 vezes. Esta é uma solução válida para o problema fornecido, no entanto, o autor poderia ter sido um pouco mais descritivo sobre as circunstâncias em que este comando seria útil. Vale a pena mencionar, pois vale a pena escrever (a funcionalidade para --force)
Aiden Strydom
5

Eu tive o mesmo problema.
O motivo era que minha filial local havia de alguma forma perdido o rastreamento para a contraparte remota.

Depois de

git branch branch_name --set-upstream-to=origin/branch_name
git pull

e resolvendo os conflitos de fusão, consegui empurrar.

hardmooth
fonte
Parece que você perdeu as alterações no branch remoto
ozma
5

Você pode adicionar --force-with-lease ao comando, ele funcionará.

git push --force-with-lease

--force é destrutivo porque sobrescreve incondicionalmente o repositório remoto com tudo o que você tem localmente. Mas --force-with-lease garante que você não sobrescreva o trabalho de outros.

Veja mais informações aqui .

igorjosesantos
fonte
1

(Um) Solução para Netbeans 7.1: Experimente um pull. Isso provavelmente também falhará. Agora dê uma olhada nos logs (eles geralmente são mostrados agora no IDE). Há uma / mais linhas dizendo:

"A extração falhou devido a este arquivo:"

Pesquise esse arquivo, exclua-o (faça um backup antes). Normalmente é um arquivo .gitignore, portanto, você não excluirá o código. Refaça o push. Tudo deve funcionar bem agora.

Sliq
fonte
1

Usar a --rebaseopção funcionou para mim.

  • git pull <remote> <branch> --rebase

Em seguida, envie para o repositório.

  • git push <remote> <branch>

Por exemplo

git pull origin master --rebase

git push origin master

CyberDemic
fonte
0

Eu tive o mesmo problema. Eu resolvi com

git checkout <name branch>
git pull origin <name branch>
git push origin <name branch>
Andrea Perdicchia
fonte
3
OP diz sobre empurrar mudanças de código local. checkoutsubstituirá essas alterações ou, pelo menos, não as incluirá no push.
trejder
0

Isto é o que funcionou para mim. Ele pode ser encontrado na documentação do git aqui

Se você estiver no ramo desejado, pode fazer o seguinte:

git fetch origin
# Fetches updates made to an online repository
git merge origin YOUR_BRANCH_NAME
# Merges updates made online with your local work
CodeChops
fonte
0

Encontrou o mesmo problema, para resolvê-lo, execute os seguintes gitcomandos.

  • git pull {url} --rebase
  • git push --set-upstream {url} master

Você deve ter criado o repositório no github primeiro.

blackFoxCoder
fonte
0

Às vezes, enquanto puxa o git, o HEAD se solta. Você pode verificar isso inserindo o comando:

git branch 
  • (HEAD separado de 8790704)

    mestre

    desenvolve

É melhor ir para o seu branch e dar uma nova tragada no seu respectivo branch.

git checkout develop

git pull origin develop

git push origin develop
Abhinav
fonte