git: gli aggiornamenti sono stati rifiutati perché il telecomando contiene del lavoro che non hai localmente


114

Sto lavorando in un team con alcuni sviluppatori che utilizzano git su BitBucket. Stiamo tutti lavorando su un devramo, non spingiamo fino masteral rilascio.

Uno degli sviluppatori ha commesso un codice errato che ha sovrascritto il mio per sbaglio e ora sto cercando di reinserire il codice corretto nel repository. Sto leggendo questo errore da alcuni giorni ormai, non posso più inviare il push al repository perché ricevo il seguente errore:

 ! [rejected]        master -> dev (fetch first)
error: failed to push some refs to 'https://myusername@bitbucket.org/repo_user/repo_name.git'
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing
hint: to the same ref. You may want to first integrate the remote changes
hint: (e.g., 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.

Seguo le istruzioni e pull, ma poi ricevo un conflitto di unione. Dopo aver inserito un messaggio per il conflitto di unione, il mio codice locale è ora il codice errato che l'altro sviluppatore ha caricato per sbaglio (come previsto da pull). Quindi sostituisco il codice errato con il backup che ho copiato prima di eseguire il commit e quando provo di nuovo a eseguire il push, ottengo lo stesso errore.

È davvero frustrante, voglio davvero aiutare la mia squadra e contribuire, ma non posso a causa di questo errore. Qualcuno sa come risolvere questo problema? Apprezzerei molto qualsiasi aiuto.

Questi sono i comandi che eseguo per eseguire il commit, se aiuta qualcuno:

git pull remotename master:dev
git add --all
git commit -m "some message"
git pull remotename master:dev
git push remotename master:dev

Avrei pensato che se avessi mantenuto questo ordine, non avrei ricevuto conflitti di unione. Credo di essermi sbagliato. Grazie ancora

Aggiornamento: dovrei aggiungere che ho cercato qualche ora su Google e stackoverflow e ho seguito diverse istruzioni, ma non riesco ancora pusha raggiungere il devramo.

Risposte:


42

git pull <remote> master:devrecupererà il remote/masterramo e lo unirà al tuo local/devramo.

git pull <remote> devrecupererà il remote/devramo e lo unirà al ramo corrente.

Penso che tu abbia detto che il commit in conflitto è attivo remote/dev, quindi questo è il ramo che probabilmente intendevi recuperare e unire.

In quel caso, non stavi effettivamente fondendo il conflitto nel tuo ramo locale, il che è un po 'strano dato che hai detto di aver visto il codice errato nella tua copia di lavoro. Potresti voler controllare cosa sta succedendo remote/master.


1
Wow ... non l'ho mai saputo. Ma ora ha molto senso. Anche il ramo principale era errato, quindi la tua risposta chiarisce l'intera domanda. Sono ancora un po 'nuovo su Git. Grazie mille per avermi detto la differenza tra quei due!
delos

6
La migliore opzione per me era git pull --rebase.
derekmx271

154

Usa questo comando nel terminale

git push -f origin master


49
Usare il flag force push (-f) è molto pericoloso e non dovrebbe mai far parte del tuo normale flusso di lavoro
Spaideri

5
Downvoted poiché mi manca qualche avvertimento in questa risposta.
Melebius

2
Ooh! Questo forza il repository a riscriversi.
Azarsa

3
Ho avuto lo stesso errore con GitHub e l'ho risolto con questo comando, @theeastcoastwest perché dici che è pericoloso? qual è la tua ragione "
simon

3
@simon questo è pericoloso perché ignora il lavoro che è in remoto e forza le tue modifiche nel repository. Quindi, se non vuoi rovinare il lavoro della tua squadra, NON forzare il push.
Gásten

42

Succede quando stiamo tentando di eseguire il push al repository remoto ma abbiamo creato un nuovo file su remoto che non è stato ancora estratto, diciamo Readme. In tal caso, come dice l'errore

git rifiuta l'aggiornamento

poiché non abbiamo preso il remoto aggiornato nel nostro ambiente locale. Quindi prendi prima il comando dal telecomando

git pull

Aggiornerà il tuo repository locale e aggiungerà un nuovo Readmefile. Quindi invia le modifiche aggiornate al telecomando

git push origin master

Stavo lavorando git pull origin developnel mio ramo di sviluppo locale, ma ora, solo farlo git pullfunziona bene per me, non so perché.
Alex

perché per impostazione predefinita se il tuo ramo locale è sincronizzato con il ramo remoto e sei estratto in quel ramo non è necessario specificare un ramo git pullè sufficiente
Himanshu

11

Questo di solito accade quando il repository contiene alcuni elementi che non sono presenti localmente. Quindi, per spingere le nostre modifiche, in questo caso dobbiamo integrare le modifiche remote e quindi spingere.

Quindi crea un pull dal telecomando

git pull origin master

Quindi spingere le modifiche a quel telecomando

git push origin master

10

Forza a spingere

git push -f origin master


2
Questo dovrebbe probabilmente venire con un avvertimento.
Chris

7

L'ho risolto, non sono esattamente sicuro di quello che ho fatto. Ho provato semplicemente a spingere e tirare usando:

git pull <remote> dev invece di git pull <remote> master:dev

Spero che questo aiuti qualcuno se ha lo stesso problema.


6

Devi inserire:

$ git pull
$ git fetch 
$ git merge

Se usi a git push origin master --force, avrai un grosso problema.


5
Perché è necessario utilizzare git fetche di git mergenuovo manualmente dopo l'esecuzione git pullche li contiene ?
Melebius

6

Puoi provare questo: git pull origin master --rebase


2
Ciao Eduardo! Questo ha funzionato per me. Ma puoi spiegare perché funziona? Cosa fa esattamente questo comando?
Akshaya Natarajan,

4

In realtà github è molto più semplice di quanto pensiamo e accade assolutamente ogni volta che proviamo a eseguire il push anche dopo aver inserito esplicitamente alcuni file nel nostro repository git quindi, per risolvere il problema, prova semplicemente ..

: git pull

e poi..

: git push

Nota: se ti sei bloccato accidentalmente nell'editor di vim dopo aver estratto il tuo repository, non preoccuparti, chiudi l'editor di vim e prova a spingere :)


4

Ho eseguito i passaggi seguenti. finalmente funziona bene.

passi

1) git init

2) git status (per controllare lo stato)

3) git add. (aggiungi tutto il file di modifiche (.))

4) git commit -m "<pass your comment>"

5) git remote aggiungi origine "<pass your project clone url>"

6) git pull --allow-unrelated-histories "<pass your project clone url>"master

7) git push -u "<pass your project clone url>"master


2

Ho riscontrato questo errore ed era perché c'era un aggiornamento sul server ma SourceTree non mostrava alcun aggiornamento disponibile (forse perché ero offline l'ultima volta che ha controllato). Quindi ho aggiornato l'albero dei sorgenti e ora mostra 2 elementi da inviare invece di 1 elemento.

Quindi assicurati di premere Aggiorna o Pull se ricevi questo errore e poi riprova.


1

git pull --rebase origin master

git push origin master


git push -f origin master

Avviso git push -f origin master

  • spinge con forza sul repository esistente ed elimina anche i repository precedenti quindi se non hai bisogno di versioni precedenti potrebbe essere utile


1

L'opzione migliore per me e funziona e semplice

git pull --rebase

poi

git push

buona fortuna


1

Ecco come ho risolto questo problema:

  1. git pull origin master
  2. git push origin master

Questo di solito accade quando il tuo ramo remoto non è aggiornato. E dopo questo, se ricevi un errore del tipo "Inserisci un messaggio di commit" Fai riferimento a questo (per me la risposta di xiaohu Wang ha funzionato :))


0

Ho avuto prima un progetto SSDT VS. Volevo spingere il progetto così come l'avevo fatto su Github. Volevo che quella spinta fosse la versione iniziale del mio repository che avvia il ramo principale. Il suggerimento di Donal di git push -f origin master è stato il modo più semplice (che ho visto) per ottenere questo risultato. Dal momento che non dovevo preoccuparmi di riscrivere nulla, sembrava avere un senso.


0

Ho avuto lo stesso problema. È successo che ho creato il file .Readme sul repository senza prima estrarlo.

Potresti voler eliminare il file .Readme o estrarlo prima di spingere.


Non sono sicuro che questa risposta a una vecchia domanda di 5 anni fornisca un valore aggiuntivo, inoltre non fornisce una soluzione al problema specifico dell'OP. Dato che sei un nuovo collaboratore, si prega di dare un'occhiata a una guida su come rispondere alle domande: stackoverflow.com/help/how-to-answer
Sotiris Koukios-Panopoulos

0

Puoi usare

git pull --rebase <your_reponame> <your_branch>

questo ti aiuterà nel caso in cui tu abbia alcune modifiche non ancora registrate nel tuo repository locale. particolarmenteREADME.md

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.