Git push rejeitado "não-fast-forward"


91

Ainda sou bastante novo em gitusá-lo para gerenciar nosso código em um ambiente de equipe. Tive alguns problemas de rebase e os corrigi usando

git checkout --ours filename.txt
git add filename.txt
git rebase --continue

Agora eu desejo empurrar minhas alterações e executar o seguinte comando

$ git push origin feature/my_feature_branch

me dá o seguinte erro:

To ssh://git@coderepo.com:7999/repo/myproject.git
 ! [rejected]        feature/my_feature_branch -> feature/my_feature_branch (non-fast-forward)
error: failed to push some refs to 'ssh://git@coderepo.com:7999/repo/myproject.git'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Merge the remote changes (e.g. 'git pull')
hint: before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.

O que posso fazer para me livrar do erro?

PS: Estou evitando usar a --forceopção tanto quanto possível.


Respostas:


79

Parece que alguém empurrou novos commits entre o seu último git fetche git push. Neste caso, você precisa repetir seus passos e rebase my_feature_branchmais uma vez.

git fetch
git rebase feature/my_feature_branch
git push origin feature/my_feature_branch

Depois de git fetch eu recomendo examinar a situação com gitk --all.


1
O que fazer para habilitar git pull origin master: master, que deve ser mesclado por padrão. Este é um conflito de mesclagem ou não. Esta é a única pergunta que está sendo feita.
mathtick

25

Provavelmente você não buscou as alterações remotas antes do rebase ou alguém empurrou novas alterações (enquanto você estava rebase e tentava empurrar). Experimente estes passos:

#fetching remote 'feature/my_feature_branch' branch to the 'tmp' local branch 
git fetch origin feature/my_feature_branch:tmp

#rebasing on local 'tmp' branch
git rebase tmp

#pushing local changes to the remote
git push origin HEAD:feature/my_feature_branch

#removing temporary created 'tmp' branch
git branch -D tmp

Isso resolve meu problema: quando eu cometi meu código, fiz um rebase (tarde demais, já havia mudanças, deveria fazer antes do commit). Então, mesmo que não houvesse conflito, não consegui empurrar. Depois de aplicar a magia acima, funcionou. Obrigado.
Jing Li

19

Eu tive esse problema! Eu tentei: git fetch + git merge, mas não resolvi! Eu tentei: git pull e também não resolvi

Então tentei isso e resolvi meu problema (é semelhante à resposta do Engenheiro):

git fetch origin master:tmp
git rebase tmp
git push origin HEAD:master
git branch -D tmp

8
Isso me ferrou, empurrei as coisas diretamente para o master e empurrei o deploy por um dia inteiro ... e todos estão putos ... DICAS INCRÍVEIS!
Mike Q

6
Provavelmente deseja explicar o que você está fazendo em resumo, antes de dar a alguém uma ferramenta perigosa.
Mirv - Matt

10

Tive um problema semelhante e resolvi-o com: git pull origin


1
Me ajudou quando recebi o erro em questão ao puxar um branch remoto.
GChuf

7

Estou atrasado para a festa, mas encontrei algumas instruções úteis na página de ajuda do github e gostaria de compartilhá-las aqui.

Às vezes, Git não pode fazer sua mudança para um repositório remoto sem perder commits. Quando isso acontece, seu push é recusado.

Se outra pessoa empurrou para o mesmo branch que você, Git não será capaz de enviar suas alterações:

$ git push origin master
To https://github.com/USERNAME/REPOSITORY.git
 ! [rejected]        master -> master (non-fast-forward)
error: failed to push some refs to 'https://github.com/USERNAME/REPOSITORY.git'
To prevent you from losing history, non-fast-forward updates were rejected
Merge the remote changes (e.g. 'git pull') before pushing again.  See the
'Note about fast-forwards' section of 'git push --help' for details.

Você pode corrigir isso buscando e mesclando as alterações feitas no branch remoto com as alterações feitas localmente:

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

Ou você pode simplesmente usar git pullpara executar os dois comandos ao mesmo tempo:

$ git pull origin YOUR_BRANCH_NAME
# Grabs online updates and merges them with your local work

4

tente este comando

$ git push -f -u origin <name of branch>

ie $ git push -f -u origin master


Isso funcionou no meu caso quando os outros não. Às vezes você só precisa dizer git -f -u
gcr

1

Bloqueio de gravação no repositório local compartilhado

Eu tive esse problema e nenhum dos conselhos acima me ajudou. Consegui buscar tudo corretamente. Mas o push sempre falhou. Era um repositório local localizado no diretório do Windows com vários clientes trabalhando com ele através do driver de pasta compartilhada VMWare. Parece que um dos sistemas bloqueou o repositório Git para escrita. Depois de parar o sistema VMWare relevante, que causou o bloqueio, tudo foi reparado imediatamente. Era quase impossível descobrir qual sistema causava o erro, então tive que interrompê-los um por um até conseguir.


1

Bem, eu usei o conselho aqui e me ferrou, pois mesclou meu código local diretamente ao master. .... então pegue tudo com um grão de sal. Meu colega de trabalho disse que o seguinte ajudou a resolver o problema, a necessidade de reposicionar meu ramo.

 git branch --set-upstream-to=origin/feature/my-current-branch feature/my-current-branch

0

No Eclipse, faça o seguinte:

Repositórios GIT> Remotos> Origem> Clique com o botão direito e diga buscar

Repositórios GIT> Rastreamento remoto> Selecione seu branch e diga mesclar

Vá para o projeto, clique com o botão direito em seu arquivo e diga Buscar do upstream.


0
  1. mova o código para um novo branch - git branch -b tmp_branchyouwantmergedin
  2. mude para o branch que você deseja mesclar - git checkout mycoolbranch
  3. redefina o branch que você deseja mesclar - git branch reset --hard HEAD
  4. mesclar o branch tmp no branch desejado - branch git merge tmp_branchyouwantmergedin
  5. empurre para a origem

0

Aqui está outra solução para resolver este problema

>git pull
>git commit -m "any meaning full message"
>git push

-1
  1. Desfaça o commit local. Isto irá apenas desfazer o commit e preserva as mudanças na cópia de trabalho
git reset --soft HEAD~1
  1. Extraia as últimas mudanças
git pull
  1. Agora você pode confirmar suas alterações no código mais recente
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.