! [rejeitado] mestre -> mestre (buscar primeiro)


100

Existe uma boa maneira de explicar como resolver " ! [rejected] master -> master (fetch first)'" no Git?

Quando eu uso este comando, $ git push origin masterele exibe uma mensagem de erro.

! [rejected]        master -> master (fetch first)
error: failed to push some refs to 'git@github.com:zapnaa/abcappp.git'

Respostas:


129

A resposta está lá, git está dizendo para você buscar primeiro.

Provavelmente alguém já empurrou para masterizar, e seu commit está atrasado. Portanto, você deve buscar, mesclar o conjunto de alterações e, então, será capaz de enviar por push novamente.

Se você não fizer isso (ou pior ainda, se você forçar usando a --forceopção), você pode bagunçar o histórico de commits.

EDIT: Eu entro em mais detalhes sobre o último ponto, já que um cara aqui acabou de dar o conselho muito ruim de usar a --forceopção.

Como git é um DVCS, idealmente muitos outros desenvolvedores estão trabalhando no mesmo projeto que você, usando o mesmo repositório (ou um fork dele). Se você sobrescrever forçosamente com seu changeset, seu repositório não combinará com outras pessoas, porque "você reescreveu o histórico". Você deixará outras pessoas infelizes e o repositório sofrerá. Provavelmente um gatinho no mundo também chorará.

TL; DR

  1. Se quiser resolver, primeiro busque (e depois mescle).
  2. Se você quiser hackear, use a --forceopção.

Você pediu o primeiro, no entanto. Vá para 1) sempre, mesmo que você sempre use o git sozinho, porque é uma boa prática.


5
Não é possível buscar excluir alterações importantes em arquivos locais?
Leonardo Castro

2
Não muda após uma busca
dhein de

@dhein como escrevi, a busca deve ser seguida por uma mesclagem - o ponto é que você tem que "alinhar" a árvore local com a árvore remota (portanto, com a mesclagem) - mas obrigado, eu escrevi isso no TL; DR também
linuxbandit

84

experimentar:

git fetch origin master
git merge origin master

Depois de escrever este código, recebi outro erro: (non-fast-forward)

Eu escrevo este código:

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

E resolveu meu problema


O mesmo para mim. Isso resolveu meu problema. Existem alguns avisos. Eu baguncei um sub-repositório, mas resolvi com o seguinte: stackoverflow.com/questions/19584255/…
M. Beausoleil

1
@Aurelio A Seu comando merge está incorreto, deveria estar git merge master.
mike

Por que precisamos usar git branch -D tmp?
Милош Вељковић

Solução muito útil (+1)
HuserB1989

25

Você deve usar git pull, esse comando faça ae em git fetchseguida faça o git merge.

Se você usar um git push origin master --forcecomando, poderá ter problemas no futuro.


1
É correto que você só deva usar --force se for o único no projeto e estiver ficando frustrado ao tentar fazer seu primeiro push?
notas de

20

pull é sempre a abordagem certa, mas uma exceção pode ser quando você está tentando converter um sistema de arquivos sem Git em um repositório Github. Lá você teria que forçar o primeiro commit.

git init
git add README.md
git add .
git commit -m "first commit"
git remote add origin https://github.com/userName/repoName.git
git push --force origin master

funciona para mim, comecei novamente um novo projeto (mesmo repo) e queria substituí-lo.
ucotta

17

Tente este comando git

git push origin master --force

ou com falta de força -f

git push origin master -f


2
Isso substitui a restrição do git push. Não recomendado para trabalho em equipe. Da documentação do git push: Se outra pessoa construiu sobre o seu histórico original enquanto você está rebasing, a ponta do branch no remoto pode avançar com o commit dela, e empurrar cegamente com --force perderá o trabalho dela .
Casey

10

Conforme indicado na mensagem de erro, você deve "buscar primeiro". Isso funcionou para mim. Use o comando:

  1. git fetch origin master

Em seguida, siga estas etapas para mesclar:

  1. git pull origin master
  2. git add .
  3. git commit -m 'your commit message'
  4. git push origin master

4

Tente este comando para resolver -

git push origin master --force

Ou

 git push origin master -f


3

Siga as etapas abaixo, pois também tive o mesmo problema:

$ git pull origin master --allow-unrelated-histories 

(Para ver se a filial local pode ser facilmente mesclada com uma remota)

$ git push -u origin master 

(Agora envie todo o conteúdo do repositório git local para o seu repositório online)


2

É provável que outra pessoa (por exemplo, seu colega) tenha colocado commits origin/masterque não estão em seu masterbranch local , e você está tentando enviar alguns commits de seu branch local para o servidor. Em 99% dos casos, supondo que você não queira apagar o trabalho deles origin, você tem duas opções:

2) Mesclar suas alterações em seu branch local e, em seguida, enviar o resultado mesclado. git checkout master git pull # resolve conflicts here git push

(Observe que git pullé essencialmente apenas um git fetche git mergeneste caso.)

1) Rebase seu branch local, de forma que pareça que seu colega fez seus commits primeiro, e então você fez seus commits. Isso mantém o histórico de commits bom e linear - e evita um "commit de mesclagem". No entanto, se você tiver conflitos com as mudanças do seu colega, você pode ter que resolver esses conflitos para cada um de seus commits (ao invés de apenas uma vez) no pior caso. Essencialmente, isso é mais agradável para todos, mas mais esforço para você. git pull --rebase # resolve conflicts here git push

(Observe que git pull --rebaseé essencialmente ae git fetcha git rebase origin/master.)



1

Seu erro pode ser devido ao branch de mesclagem.
Basta seguir isto:

etapa 1: git pull origin master(caso você receba alguma mensagem, ignore-a)
etapa 2: git add .
etapa 3: git commit -m 'your commit message'
etapa 4:git push origin master


1

Primeiro, você deve usar git pull, depois o comando do a git fetche em seguida fazer o git merge.

Se você usar um git push origin master --forcecomando, poderá ter problemas no futuro.


1

Eu superei isso fazendo check-out de um novo branch como este:

# git checkout -b newbranch <SHA of master>

# git branch
* newbranch
  master

# git push -u <repo_url_alias> newbranch

Você fica com 2 ramos: Master e newbranch, que você pode gerenciar para fundir mais tarde.


0

Problema resolvido

Problema que tive

! [rejected]        master -> master (non-fast-forward) error: failed to push some refs to 'https://github.com/repo_name/repo-hint: Updates were rejected because the tip of your current branch is behind hint: its remote counterpart. Integrate the remote changes (e.g.hint: 'git pull ...') before pushing again. hint: See the 'Note about fast-forwards' in 'git push --help' for details.

Eu também tive o mesmo problema. O problema é que seus commitsoutros repositórios não foram bem pushed- sucedidos, então você precisa executar os seguintes comandos:

  1. git fetch origin master

    resultado: From https://github.com/username/repo-name * branch master -> FETCH_HEAD

  2. git merge origin master

    resultado: Merge made by the 'recursive' strategy. repo-name/ReadMe.md | 1 - 1 file changed, 1 deletion(-)

  3. git push

    resultado: Enumerating objects: 8, done. Counting objects: 100% (8/8), done. Delta compression using up to 8 threads Compressing objects: 100% (6/6), done. Writing objects: 100% (6/6), 1.00 KiB | 1.00 MiB/s, done. Total 6 (delta 2), reused 0 (delta 0) remote: Resolving deltas: 100% (2/2), completed with 1 local object. To https://github.com/user_name/repo-name.git 0852d5vf..70v56d9 master -> master

Muito obrigado


0

Você apenas tem que mencionar o nome do seu ramo junto com o nome remoto.

git fetch origin
git merge origin/master

0

No meu caso, isso aconteceu ao criar o link representante do GitHub, inicializei-o com o arquivo README

Ao criar o Git remoto, não o inicialize com o arquivo README, caso contrário, ele mostraria err

Não faça isso & definitivamente funcionará bem. Em vez disso, inicialize-o com o arquivo leia-me se desejar depois de enviar para o branch master



-1

este trabalho para mim

  1. git init

  2. git add --all

3.git commit -m "nome"

4.git push origin master --force


-1

Isso funcionou para mim:

$ git add .
$ git commit -m "commit"
$ git push origin master --force

-1

É simples usar este comando:

git push -f origin master

e fará seu trabalho

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.