Egit ha rifiutato l'avanzamento non rapido


89

Ricevo questo messaggio durante il push al repository GitHub. Puoi dirmi la procedura passo passo per risolverlo? Ho spinto solo una volta e ha avuto successo. Ma, quando ho aggiornato un progetto e ho provato a spingere il mio secondo commit, mostra "master rifiutato non-fast-forward" e non mi permette di spingere. Si prega di spiegare la procedura.


Ho lo stesso problema dopo aver creato un nuovo repository con "Inizializza questo repository con un README". L'ho rimosso e ne ho creato di nuovo senza questo chechbox.
andrew

@andrew ha ragione
Dany Wehbe

Risposte:


228

Ho avuto lo stesso problema e sono riuscito a risolverlo. afk5min aveva ragione, il problema è che il ramo da cui hai estratto il codice è cambiato nel repository remoto. Secondo le pratiche git standard ( http://git-scm.com/book/en/Git-Basics-Working-with-Remotes ), è necessario (ora) unire quelle modifiche nel repository remoto nelle modifiche locali prima di te può impegnarsi. Questo ha senso, questo ti costringe a prendere le modifiche di altri e unirle nel tuo codice, assicurandoti che il tuo codice continui a funzionare con le altre modifiche in atto.

Comunque, sui gradini.

  1. Configura "fetch" per recuperare il ramo da cui hai estratto originariamente.

  2. Recupera il ramo remoto.

  3. Unisci quel ramo remoto al tuo ramo locale.

  4. Eseguire il commit della modifica (unione) nel repository locale.

  5. Invia la modifica al repository remoto.

In dettaglio...

  1. In eclipse, apri la vista "Repository Git".

  2. Assicurati di vedere il tuo repository locale e di poter vedere il repository remoto come una sottocartella. Nella mia versione, si chiama Remotes, e quindi posso vedere il progetto remoto al suo interno.

  3. Cerca la freccia verde che punta a sinistra, questa è la freccia di "recupero". Fare clic con il tasto destro e selezionare "Configura recupero".

  4. Dovresti vedere l'URI, assicurati che punti al repository remoto.

  5. Guarda nella sezione delle mappature ref del pop-up. Il mio era vuoto. Questo indicherà quali riferimenti remoti vuoi recuperare. Fare clic su "Aggiungi".

  6. Digita il nome del ramo che devi recuperare dal repository remoto. Il mio era "master" (btw, un menu a discesa qui sarebbe fantastico !!, per ora, devi digitarlo). Continua attraverso il pop-up, eventualmente facendo clic su "Fine".

  7. Fare clic su "Salva e recupera". Questo recupererà quel riferimento remoto.

  8. Cerca nella cartella "Branches" del tuo repository locale. Ora dovresti vedere quel ramo remoto nella cartella remota. Di nuovo, vedo "master".

  9. Fare clic con il pulsante destro del mouse sul ramo locale nella cartella "Locale" di "Filiali", denominata "master". Seleziona "Unisci", quindi seleziona il ramo remoto, denominato "origine / master".

  10. Processo attraverso l'unione.

  11. Applica le modifiche al tuo repository locale.

  12. Invia le tue modifiche al repository remoto.

  13. Vai a bere una bevanda gustosa, congratulandoti con te stesso. Prenditi il ​​resto della giornata.


7
Questo dovrebbe essere contrassegnato come risposta. Ha funzionato come un fascino. Questo problema si verifica anche se non ho aggiunto alcun file (il solito file README) durante la creazione del repository su GitHub per il mio progetto in Eclipse. Grazie mille per la spiegazione passo passo facile da seguire.
rbaleksandar

Mi ci è voluto un anno per risolvere questo problema, finché non ho letto il tuo post. Nel mio caso, non avevo un telecomando ma Eclipse ne ha creato uno predefinito chiamato "origin".
Eugene van der Merwe

Dolce, finalmente posso unirmi a Eclipse. Il punto chiave qui è usare la vista Repository Git per fare l'unione, e non la solita vista Team Synchronize. Sarebbe bello se nel team sincronizza la vista eGit avesse disabilitato tutte le opzioni che non fanno nulla.
dan carter

1
Anche se funziona, crea un commit di unione non necessario. Dovresti usare rebase qui, il che va bene perché le tue modifiche sono solo locali, quindi non stai cambiando alcuna cronologia pubblicata (e se lo facessi, git ti urlerebbe comunque per un push non rapido). Mi piace la risposta di MYN.
nyuszika7h

1
Fare clic con il pulsante destro del mouse sul progetto, quindi Mergein master, quindi fare nuovamente clic con il pulsante destro del mouse sul progetto push branch Masterlavorato
user1207289

16

Nel mio caso ho scelto la Force Updatecasella di controllo mentre spingevo. Ha funzionato come un fascino.


Questo ha funzionato anche per me. Ho avuto la condizione dell'OP dopo aver "modificato" un commit. E fetch mi ha dato "niente da recuperare"
Twilite

11

Nel frattempo (mentre stavi aggiornando il tuo progetto), sono stati fatti altri commit al ramo 'master'. Pertanto, è necessario prima eseguire il pull di tali modifiche per poter eseguire il push delle modifiche.


4
in questo caso git è abbastanza stupido, ho spinto tutte le modifiche al telecomando. e io sono l'unico a lavorare al progetto. Perché diavolo devo tirare il telecomando prima di poter spingere di nuovo ???? il cambio tirato sarebbe arrivato dal mio locale originariamente
Junchen Liu

7

Applicabile per Eclipse Luna + Eclipse Git 3.6.1

IO,

  1. repository git clonato
  2. ha apportato alcune modifiche al codice sorgente
  3. modifiche graduali da Git Staging View
  4. infine, impegnati e spingi!

E ho affrontato questo problema con EGit ed ecco come l'ho risolto ..

Sì, qualcuno ha eseguito il commit delle modifiche prima che io effettui il commit delle mie modifiche. Quindi le modifiche vengono rifiutate. Dopo questo errore, le modifiche vengono effettivamente salvate nel repository locale. Non volevo solo Pullle modifiche perché volevo mantenere linear historycome indicato in - In quali casi `git pull` potrebbe essere dannoso?

Quindi, ho eseguito i seguenti passaggi

  1. dalla prospettiva di Git Repository, fare clic con il pulsante destro del mouse sul
    progetto Git in questione
  2. select Fetch from Upstream- recupera gli aggiornamenti remoti (ref e oggetti) ma nessun aggiornamento viene effettuato localmente. per maggiori informazioni fare riferimento Qual è la differenza tra "git pull" e "git fetch"?
  3. seleziona Rebase...- questo apre un popup, fai clic su Preserve merges during rebaseguarda perché
    Cosa fa esattamente "rebase --preserve-merges" di git (e perché?)
  4. clicca su Rebase button
  5. se c'è / sono a conflict(s), vai al passaggio 6 altrimenti passaggio 11
  6. Rebase Resultapparirà un popup, basta fare clic suOK
  7. file comparatorsi aprirà, è necessario modificare left side file.
  8. una volta terminata l'unione delle modifiche correttamente, vai alla Git Stagingvisualizzazione
  9. stage the changes. cioèadd to index
  10. nella stessa vista, fare clic su Rebase-> Continue. ripetere da 7 a 10 finché tutti i conflitti non sono risolti.
  11. dalla Historyvista, seleziona la riga di commit e selezionaPush Commit
  12. selezionare la Rebase Commits of local.......casella di controllo e fare clic su Avanti. fare riferimento al perché - Git: rebase sul ramo di sviluppo dall'upstream
  13. clicca su Finish

Nota: se si dispone di più commit del repository locale, è necessario schiacciarli in un commit per evitare più unioni.


Sono d'accordo con l'utilizzo di rebase invece di merge. È meglio in quanto non crea un commit di unione non necessario. (Fuori tema: Stack Overflow è del tutto ridicolo e rifiuta il mio commento esclusivamente sulla base del fatto che originariamente ho scritto "+1 per". Il mio commento è perfettamente costruttivo, grazie.)
nyuszika7h

4

Configura Dopo aver premuto il codice quando ricevi un messaggio rifiutato, fai clic su Configura e fai clic su Aggiungi specifica come mostrato in questa immagine

Rif. Sorgente e Rif. Destinazione Scendi e fai clic su ref / heads / yourbranchname e fai nuovamente clic su Add Spec

inserisci qui la descrizione dell'immagine Assicurati di selezionare l'aggiornamento forzato

inserisci qui la descrizione dell'immagine Infine salva e invia il codice al repository


3

Apri la visualizzazione git:

1- seleziona il tuo progetto e scegli unisci 2- Seleziona il monitoraggio remoto 3- fai clic su ok

Git unirà il ramo remoto con il repository locale

4- quindi spingere


2

Questo errore significa che il repository remoto ha avuto altri commit e ha superato il tuo ramo locale.
Provo a fare un git pull seguito da un git push. Se non ci sono modifiche in conflitto, git pull ottiene il codice più recente nel mio ramo locale mantenendo intatte le mie modifiche.
Quindi un push git invia le mie modifiche al ramo principale.


sembra che a molte persone manchi questa semplice risoluzione: D
Black

0

Ho scoperto che devi essere sull'ultimo commit di git. Quindi questi sono i passaggi da compiere: 1) assicurati di non aver lavorato sugli stessi file, altrimenti incapperai in un errore DITY_WORK_TREE. 2) eseguire il pull delle ultime modifiche. 3) salva i tuoi aggiornamenti.

Spero che sia di aiuto.


-1
  1. Vai in Github e crea un repository per il tuo nuovo codice.
  2. Usa il nuovo URL https o ssh in Eclise quando esegui il push verso l'upstream;
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.