Como mesclar alterações remotas no GitHub?


137

Estou recebendo o seguinte erro, ao tentar o primeiro push do Github:

[rejected] master -> master (non-fast forward)
error: failed to push some refs to 'git@github.com:me/me.git'
To prevent you from losing history, non-fast-forward updates were rejected
Merge the remote changes before pushing again.  See the 'non-fast forward'
section of 'git push --help' for details.

como posso corrigir isso e mesclar alterações remotas?

Respostas:


106

Veja a seção 'non-fast forward' de ' git push --help ' para detalhes.

Você pode executar "git pull", resolver possíveis conflitos e "git push" o resultado. Um "git pull" criará uma consolidação de mesclagem C entre as confirmações A e B.

Como alternativa, você pode refazer a alteração entre X e B na parte superior de A, com "git pull --rebase", e empurrar o resultado de volta. A rebase criará um novo commit D que cria a alteração entre X e B em cima de A.


16
Eu continuo enfrentando isso, exceto que, se eu fizer um "git pull", me dizem "Já está atualizado". e se eu fizer um "git pull --rebase", é-me dito que "o mestre de ramificações atual está atualizado". Alguma ideia? Obrigado!
precisa saber é

3
@ larson4 eu tenho o mesmo problema, mas depois de fazer o git pull, fazer outra cometer e, em seguida, ele deve ser bom
Patrick

20
@Patrick @larson Eu tive um problema semelhante causado pelo fato de não ter lido a mensagem de erro com cuidado. A rejeição foi em um galho que eu não fiz check-out. O ramo em que eu estava realmente estava tendo sucesso. A solução foi git checkout other-branch; git pull; git push; git checkout branch-i-was-working-on.
Noah Spurrier

86

Você também pode forçar um empurrão adicionando o símbolo + antes do nome do seu ramo.

git push origin +some_branch

1
Obrigado, este funciona para mim. As outras soluções iria apagar completamente o efeito da minhagit reset --hard
Oli

1
Obrigado! Enviei a ramificação "A" para o meu aplicativo de teste Heroku para testar algumas funcionalidades em um ambiente de produção. Em seguida (localmente), mesclei "A" e "B" em "mestre" e desejei inserir "mestre" no meu aplicativo de teste. Estava tendo todo tipo de problemas. Isso fez empurrar o "mestre" muito simples. Obrigado!
Don Leatham

Trabalhou para mim também. Levei 4 horas para encontrar o problema. Muito obrigado. Eu corro o Netbeans na máquina local (windows 7) e queria em cada push local, check-out na máquina remota (linux).
Maxim Shoustin

Observe que esse método pode não ser seguro e pode fazer com que algumas confirmações divergentes sejam inacessíveis.
samuil

Essa deve ser a solução aceita. As outras soluções não estavam funcionando para mim
banarun

20

Você provavelmente tem alterações no github que nunca mesclou. Tente git pullbuscar e mesclar as alterações, para poder fazer o push. Desculpe se eu entendi mal sua pergunta.


18
Em caso de necessidade de rejeitar alterações no mestre remoto e empurrar suas próprias mudanças, tentar empurrar com a chave -f
Hotsyk

13

Se você "git pull" e ele diz "Já está atualizado." E ainda receber esse erro, pode ser porque um de seus outros ramos não está atualizado. Tente mudar para outro ramo e verifique se também está atualizado antes de tentar "empurrar o git" novamente:

Alterne para o ramo "foo" e atualize-o:

$ git checkout foo
$ git pull

Você pode ver os ramos que você obteve, emitindo o comando:

$ git branch

Você pode explicar por que isso funciona e é necessário? (Ele resolveu meu problema.) Isso me parece contra-intuitivo. Eu não entendo por que o git precisaria de outro ramo para estar atualizado também para eu avançar no ramo mestre.
Quinxy von Besiex

@QuinxyvonBesiex Não tenho certeza se eu mesmo entendo. Pode ter algo a ver com a estrutura subjacente do Git e como ele organiza ramificações (que são basicamente as mesmas que as tags, até onde eu entendo).
David Calhoun

7

Você pode forçá-lo a pressionar, mas faça isso SOMENTE quando tiver certeza do que está fazendo.

O comando é:

git push -f 

3

Esse problema também pode ocorrer quando você possui tags conflitantes. Se sua versão local e remota usarem o mesmo nome de tag para confirmações diferentes, você poderá terminar aqui.

Você pode resolver isso excluindo a tag local:

$ git tag --delete foo_tag

2

Quando recebi esse erro, fiz backup de toda a pasta do projeto. Então eu fiz algo como

$ git config branch.master.remote origin
$ git config branch.master.merge refs/heads/master

... dependendo do nome do seu ramo (se não for mestre).

Então eu fiz git pull --rebase. Depois disso, substituí os arquivos puxados pelos arquivos do meu projeto de backup. Agora estou pronto para confirmar minhas alterações novamente e enviar por push.


0

1) Forçando um pull a substituir alterações locais

Se você não se importa com as alterações feitas localmente e deseja obter o código do repositório, pode forçar uma atração. Isso substituirá todas as alterações locais feitas no seu computador e uma cópia duplicada da versão no repositório será exibida.

Execute os seguintes comandos no seu IDE:

git reset - difícil

puxão

Isso destruirá instantaneamente todas as alterações locais, portanto, saiba o que está fazendo e não precise das alterações locais.

2) Manter as duas alterações (local e do repo)

Se você deseja manter as duas alterações (alterações feitas localmente e alterações presentes no repositório), você pode adicionar e confirmar suas alterações. Quando você puxa, obviamente haverá um conflito de mesclagem. Aqui você pode usar as ferramentas do seu IDE (como Difftool e mergetool) para comparar os dois trechos de código e determinar quais alterações serão mantidas e quais serão removidas. Este é o caminho do meio; nenhuma alteração será perdida até que você as remova manualmente.

git add $ the_file_under_error

git commit

puxão
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.