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://[email protected]:7999/repo/myproject.git
 ! [rejected]        feature/my_feature_branch -> feature/my_feature_branch (non-fast-forward)
error: failed to push some refs to 'ssh://[email protected]: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.

Frankline
fonte

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.

Boris Brodski
fonte
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
Engenheiro
fonte
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
Aurelio A
fonte
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

William Rossier
fonte
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
Bilal
fonte
4

tente este comando

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

ie $ git push -f -u origin master

Ivever Timothy
fonte
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.

Boris Zinchenko
fonte
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
Mike Q
fonte
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.

MansoorShaikh
fonte
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
richard
fonte
0

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

>git pull
>git commit -m "any meaning full message"
>git push
Sheo Dayal Singh
fonte
-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
alk453
fonte