! [rifiutato] master -> master (recupera prima)


102

C'è un buon modo per spiegare come risolvere " ! [rejected] master -> master (fetch first)'" in Git?

Quando utilizzo questo comando $ git push origin masterviene visualizzato un messaggio di errore.

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

Risposte:


133

La risposta è lì, git ti sta dicendo di recuperare prima.

Probabilmente qualcun altro ha già spinto a padroneggiare e il tuo impegno è alle spalle. Quindi devi recuperare, unire il changeset e poi sarai in grado di eseguire nuovamente il push.

Se non lo fai (o anche peggio, se lo costringi usando l' --forceopzione), puoi rovinare la cronologia dei commit.

EDIT: Entrerò più in dettaglio sull'ultimo punto, dal momento che un ragazzo qui ha appena dato il Pessimo Consiglio di usare l' --forceopzione.

Dato che git è un DVCS, idealmente molti altri sviluppatori stanno lavorando al tuo stesso progetto, usando lo stesso repository (o un fork di esso). Se sovrascrivi con forza il tuo changeset, il tuo repository non corrisponderà ad altre persone, perché "hai riscritto la cronologia". Renderai infelici le altre persone e il deposito ne soffrirà. Probabilmente piangerà anche un gattino nel mondo.

TL; DR

  1. Se vuoi risolvere, scarica prima (e poi unisci).
  2. Se vuoi hackerare, usa l' --forceopzione.

Hai chiesto il primo, però. Scegli 1) sempre, anche se userai sempre git da solo, perché è una buona pratica.


5
Non è possibile recuperare le modifiche importanti nei file locali?
Leonardo Castro

2
Non cambia dopo un recupero
dhein

@dhein come ho scritto, il recupero deve essere seguito da una fusione - il punto è che devi "allineare" l'albero locale con l'albero remoto (quindi con l'unione) - ma grazie, l'ho scritto nel TL; Anche DR
linuxbandit

88

provare:

git fetch origin master
git merge origin master

Dopo aver scritto questo codice ho ricevuto un altro errore: (non-fast-forward)

Scrivo questo codice:

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

E ha risolto il mio problema


Stessa cosa per me. Questo ha risolto il mio problema. Ci sono un paio di avvertimenti. Ho sbagliato con un repository secondario, ma l'ho risolto con questo: stackoverflow.com/questions/19584255/…
M. Beausoleil

1
@Aurelio A Il tuo comando di unione non è corretto, dovrebbe essere git merge master.
mike

Perché dobbiamo usare git branch -D tmp?
Милош Вељковић

27

Dovresti usare git pull, questo è il comando do a git fetche poi fai il git merge.

Se usi un git push origin master --forcecomando, potresti avere problemi in futuro.


1
È corretto che dovresti usare --force solo se sei l'unico nel progetto e ti senti frustrato nel provare a fare la tua prima spinta?
Chrips

20

pull è sempre l'approccio giusto, ma un'eccezione potrebbe essere quando si tenta di convertire un file system non Git in un repository Github. Lì dovresti forzare il primo 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

per me funziona, ho ricominciato un nuovo progetto (stesso repo) e volevo sostituirlo.
ucotta

18

Prova questo comando git

git push origin master --force

o a corto di forza -f

git push origin master -f


2
Questo ignora la restrizione push di git. Non consigliato per il lavoro di squadra. Dalla documentazione di git push: se qualcun altro si è costruito sulla tua cronologia originale mentre stai ribasando, la punta del ramo sul telecomando potrebbe avanzare con il suo commit, e spingendo ciecamente con --force perderà il suo lavoro .
Casey

10

Come è indicato nel messaggio di errore, devi "recuperare prima". Questo ha funzionato per me. Usa il comando:

  1. git fetch origin master

Quindi segui questi passaggi per unire:

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

4

Prova questo comando per risolverlo -

git push origin master --force

O

 git push origin master -f


3

Segui i passaggi indicati di seguito poiché ho anche avuto lo stesso problema:

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

(Per vedere se il ramo locale può essere facilmente unito a quello remoto)

$ git push -u origin master 

(Ora invia l'intero contenuto del repository git locale al tuo repository online)


2

È probabile che qualcun altro (ad es. Il tuo collega) abbia inserito dei commit origin/masterche non si trovano nel tuo masterramo locale , e tu stai cercando di inviare alcuni commit dal tuo ramo locale al server. Nel 99% dei casi, supponendo che tu non voglia cancellare il loro lavoro da origin, hai due opzioni:

2) Unisci le loro modifiche nel tuo ramo locale, quindi invia il risultato unito. git checkout master git pull # resolve conflicts here git push

(Nota che in questo caso git pullè essenzialmente solo un git fetche git mergea.)

1) Ribassa la tua filiale locale, in modo che sembri che il tuo collega abbia prima fatto i suoi commit e poi tu abbia fatto i tuoi commit. Ciò mantiene la cronologia del commit piacevole e lineare ed evita un "commit di unione". Tuttavia, se hai conflitti con le modifiche del tuo collega, potresti dover risolvere quei conflitti per ciascuno dei tuoi commit (piuttosto che solo una volta) nel peggiore dei casi. Essenzialmente questo è più bello per tutti gli altri, ma più impegno per te. git pull --rebase # resolve conflicts here git push

(Nota che git pull --rebaseè essenzialmente un git fetche a git rebase origin/master.)



1

Il tuo errore potrebbe essere dovuto al ramo di unione.
Segui questo:

passaggio 1: git pull origin master(nel caso in cui si riceva un messaggio, ignorarlo)
passaggio 2: git add .
passaggio 3: git commit -m 'your commit message'
passaggio 4:git push origin master


1

Per prima cosa, dovresti usare git pull, quindi comando do a git fetche poi fai il git merge.

Se usi un git push origin master --forcecomando, potresti avere problemi in futuro.


1

Ho superato questo problema verificando un nuovo ramo come questo:

# git checkout -b newbranch <SHA of master>

# git branch
* newbranch
  master

# git push -u <repo_url_alias> newbranch

Ti rimangono 2 branch: Master e newbranch, che puoi unire in seguito.


0

Devi solo menzionare il nome del tuo ramo insieme al tuo nome remoto.

git fetch origin
git merge origin/master

0

Il motivo per cui è successo nel mio caso è stato durante la creazione del collegamento del rappresentante GitHub, l'ho inizializzato con il file README

Durante la creazione di Git remote non inizializzarlo con il file README altrimenti mostrerebbe err

Non farlo e funzionerà sicuramente bene Invece inizializzalo con il file readme se lo desideri dopo aver spinto al ramo principale



0

--force opzione ha funzionato per me che ho usato git push origin master --force


0

inserisci qui la descrizione dell'immagine

! errore [rifiutato] master -> master (fetch first): impossibile inviare alcuni ref a "git@github.com:"

inserisci qui la descrizione dell'immagine

Risolto con successo il problema utilizzando il comando --force. quindi, devi usare
git push origin master --force



-1

questo lavoro per me

  1. git init

  2. git add --all

3.git commit -m "nome"

4.git push origin master --force


-1

Questo ha funzionato per me:

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

-1

È semplice usare questo comando:

git push -f origin master

e porterà a termine il tuo lavoro


-1

Problema risolto

Problema che ho avuto

! [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.

Ho anche avuto lo stesso problema. Il problema è che il tuo commitsin altri repository non pushedè andato a buon fine, quindi devi eseguire i seguenti comandi:

  1. git fetch origin master

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

  2. git merge origin master

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

  3. git push

    produzione: 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

Grazie mille

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.