Git push rifiutato "non-fast-forward"


91

Sono abbastanza nuovo gite attualmente lo uso per gestire il nostro codice in un ambiente di squadra. Ho avuto alcuni problemi di ribasatura e li ho risolti usando

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

Ora desidero eseguire il push delle mie modifiche e quindi eseguire il seguente comando

$ git push origin feature/my_feature_branch

mi dà il seguente errore:

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.

Cosa posso fare per eliminare l'errore?

PS: sto evitando di utilizzare l' --forceopzione il più possibile.


Risposte:


79

Sembra che qualcuno abbia spinto nuovi commit tra l'ultimo git fetche il git push. In questo caso è necessario ripetere i passaggi e ribasare ancora my_feature_branchuna volta.

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

Dopo il git fetchconsiglio di esaminare la situazione con gitk --all.


1
Cosa fare per abilitare git pull origin master: master che dovrebbe essere predefinito per l'unione. È questo un conflitto di unione o no. Questa è l'unica domanda che viene posta.
mathtick

25

Probabilmente non hai recuperato le modifiche remote prima del rebase o qualcuno ha inviato nuove modifiche (mentre stavi ribasando e provando a spingere). Prova questi passaggi:

#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

Questo risolve il mio problema: quando ho eseguito il commit del mio codice, ho fatto un rebase (troppo tardi, c'erano già dei cambiamenti, dovresti farlo prima del commit). Allora anche non c'era conflitto, non potevo spingere. Dopo aver applicato la magia sopra, ha funzionato. Grazie.
Jing Li

19

Ho avuto questo problema! Ho provato: git fetch + git merge, ma non risolto! Ho provato: git pull, e anche non risolto

Quindi ho provato questo e ho risolto il mio problema (è simile alla risposta dell'Ingegnere):

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

8
Questo mi ha fregato, ho spinto le cose direttamente al master e ho spinto il deploy da un'intera giornata ... e tutti sono incazzati .... CONSIGLI IMPRESSIONANTI!
Mike Q

6
Probabilmente vuoi spiegare cosa stai facendo in sintesi prima di dare a qualcuno uno strumento pericoloso.
Mirv - Matt

10

Ho avuto un problema simile e l'ho risolto con: git pull origin


1
Mi ha aiutato quando ho ricevuto l'errore in questione mentre tiravo un ramo remoto.
GChuf

7

Sono in ritardo alla festa ma ho trovato alcune utili istruzioni nella pagina di aiuto di GitHub e volevo condividerle qui.

A volte, Git non può apportare la tua modifica a un repository remoto senza perdere i commit. Quando ciò accade, la tua spinta viene rifiutata.

Se un'altra persona ha eseguito il push del tuo stesso ramo, Git non sarà in grado di inviare le tue modifiche:

$ 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.

Puoi risolvere questo problema recuperando e unendo le modifiche apportate sul ramo remoto con le modifiche apportate 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

Oppure puoi semplicemente usare git pullper eseguire entrambi i comandi contemporaneamente:

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

4

prova questo comando

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

cioè $ git push -f -u origin master


Ha funzionato per il mio caso quando gli altri no. A volte devi solo dire a git -f -u
gcr

1

Blocco in scrittura sul repository locale condiviso

Ho avuto questo problema e nessuno dei consigli sopra mi ha aiutato. Sono riuscito a recuperare tutto correttamente. Ma il push falliva sempre. Era un repository locale situato nella directory di Windows con diversi client che lavoravano con esso tramite il driver della cartella condivisa VMWare. Sembrava che uno dei sistemi avesse bloccato il repository Git per la scrittura. Dopo aver arrestato il sistema VMWare pertinente, che ha causato il blocco, tutto è stato riparato immediatamente. Era quasi impossibile capire quale sistema causa l'errore, quindi ho dovuto interromperli uno per uno finché non ci riuscivo.


1

Bene, ho usato il consiglio qui e mi ha fregato poiché ha unito il mio codice locale direttamente al master. .... quindi prendi tutto con un pizzico di sale. Il mio collega ha detto che quanto segue ha aiutato a risolvere il problema, necessario per rinominare il mio ramo.

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

0

In Eclipse, fai quanto segue:

Archivi GIT> Telecomandi> Origine> Fai clic con il pulsante destro del mouse e pronuncia fetch

Archivi GIT> Monitoraggio remoto> Seleziona il tuo ramo e pronuncia unisci

Vai al progetto, fai clic con il pulsante destro del mouse sul tuo file e dì Recupera dall'upstream.


0
  1. sposta il codice in un nuovo ramo - git branch -b tmp_branchyouwantmergedin
  2. passare al ramo in cui si desidera unire - git checkout mycoolbranch
  3. resetta il ramo a cui vuoi unire - git branch reset --hard HEAD
  4. unisci il ramo tmp nel ramo desiderato - git branch merge tmp_branchyouwantmergedin
  5. spingere all'origine

0

Ecco un'altra soluzione per risolvere questo problema

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

-1
  1. Annulla il commit locale. Questo annullerà semplicemente il commit e preserverà le modifiche nella copia di lavoro
git reset --soft HEAD~1
  1. Estrai le ultime modifiche
git pull
  1. Ora puoi applicare le modifiche al codice più recente
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.