2012-09-29 12 views
72

Scenario:Git dice filiale locale è dietro ramo a distanza, ma non è

  1. Faccio un nuovo ramo
  2. mod su di esso
  3. commetterlo
  4. spinta è
  5. hack su di esso un po 'di più
  6. commit di nuovo
  7. cercare di spingere di nuovo

Git risponde:

Aggiornamenti sono stati respinti perché la punta del ramo corrente è dietro sua controparte remota. ecc.

Sono l'unico hacking su questo ramo, nessun altro lo sta toccando. Il ramo remoto è in realtà dietro la filiale locale. Non dovrei dover tirare affatto.

(E se io tiro, Git riporta i conflitti tra i due, e mi costringe a fondere la filiale in sé)

Perché questa (probabile) succedendo? E come posso diagnosticare/risolvere il problema?

Per essere chiari, non sto ramificazione da nessuna parte, e nessun altro sta lavorando su di esso:

Remote: Commit A -------- Commit B 

Local: Commit A -------- Commit B -------- Commit C 

C è una continuazione rettilineo di B, non ramificazione coinvolti. Ma Git pensa che C sia un ramo di A:

Remote: Commit A -------- Commit B 

        ------- Commit C 
       / 
Local: Commit A -------- Commit B 

Non lo è; è una continuazione diretta di B.

+1

L'uscita del 'git remote -V' e' git spettacolo origin' remoto (origine supponendo che è il telecomando si hanno problemi con) può essere utile –

risposta

182

Probabilmente hai fatto un po 'di riscrittura della storia? La tua filiale locale si è discostata da quella sul server. Eseguire questo comando per ottenere una migliore comprensione di ciò che è accaduto:

gitk HEAD @{u} 

consiglio vivamente si tenta di capire dove questo errore proviene. Per risolvere il problema, basta eseguire:

git push -f 

Il -f rende questo un “push forzata” e sovrascrive il ramo sul server. È molto pericoloso quando lavori in team. Ma dato che sei da solo e sicuro che il tuo stato locale è corretto questo dovrebbe andare bene. Rischia di perdere la cronologia dei commit se questo non è il caso.

+12

E 'stato. Al punto 2, ho fatto un "Amend Last Commit", poi ho spinto, poi ho hackerato un altro po ', poi ho provato a spingere di nuovo. Ho frainteso il modo in cui Amend funziona. Grazie! –

+3

Questo sembra davvero utile - ma qualcuno potrebbe spiegare la sintassi di 'HEAD @ {u}'? – ChrisV

+3

Sia il 'HEAD' che il' @ {u} 'si riferiscono ai commit. Dicono a Gitk, quali rami mostrare. 'HEAD' si riferisce al ramo attualmente estratto,' @ {u} 'è l'abbreviazione di' HEAD @ {u} ', che rappresenta il ramo upstream del ramo attualmente estratto. Quindi per es. 'master', che di solito è' origine/master'. – Chronial

4

Questo è successo a me quando stavo cercando di spingere il ramo di sviluppo (sto usando git flow). Qualcuno ha avuto aggiornamenti push da padroneggiare.per risolverlo ho fatto:

git co master 
git pull 

Che ha recuperato quelle modifiche. Quindi,

git co develop 
git pull 

Quale non ha fatto nulla. Penso che il ramo di sviluppo sia già stato spinto nonostante il messaggio di errore. Tutto è aggiornato ora e nessun errore.

0

Per diagnosticare, seguire this answer.

Ma per risolvere il problema, sapendo di essere l'unico a cambiarla, fare:
1 - sostegno il vostro progetto (ho fatto solo i file su git, ./src cartella)
2-git pull
3 - ripristinare il backup su molti file "incasinati" (con indicatori di unione)

Ho provato git pull -s recursive -X ours ma non ha funzionato come volevo, potrebbe essere un'opzione, ma prima il backup !!!

Assicurarsi che le differenze/modifiche (a git gui) non siano. Questo è il mio caso, non c'è niente da unire, ma github continua a dire che dovrei fondermi ...

0

La soluzione è molto semplice e ha funzionato per me.

Prova questo:

git pull --rebase <url> 

poi

git push -u origin master 
Problemi correlati