2013-03-22 10 views
7

Folks,ramo git è più avanti di origine/master mentre repo è in sincronia

Questo è qualcosa in git che proprio non ha senso per me, qui è ciò che accade

  • faccio un git status , Vedo che sono su un master di ramo e niente da commettere e la directory di lavoro è pulita.
  • Io faccio quindi git pull origin master Mi tiro un mucchio di codice, nessun problema.
  • Ora, quando faccio git status vedo una nuova linea vostro ramo è in anticipo di origine/master 1 commettere

mio repo locale e pronti contro termine a distanza sono totalmente in sintonia, che cosa vostra filiale è avanti di origine/master di 1 commit significa, questo è molto molto confuso. Qualsiasi input/feedback è molto apprezzato. Grazie

+1

Perché pensi che il tuo repository sia sincronizzato con il telecomando? –

+0

Non stai rebasando di default nel tuo pull, vero? Potresti provare a caricare e unire separatamente invece di tirare? –

+0

Puoi usare "gitk". per vedere a quali commit sono associate le etichette "master" e "origine/master". –

risposta

9

ho sperimentato esattamente quello che si vede. non riesco a trovare la spiegazione adeguata sul git-scm.com ma credo che sia qualcosa di simile:

  1. clono un repo di origine, consente di dire origine ha padrone e ho adesso nel mio padrone repo locale
  2. ora origine e il repository hanno un riferimento all'ultimo commit. Questo riferimento è il ramo principale e il riferimento è lo stesso nella vostra repo locale e sull'origine
  3. Diciamo che qualcuno (altro allora) spinge nuovi commit da padroneggiare origine
  4. non git pull origin master
  5. ora fai git status e vedrai che il tuo ramo è avanti all'origine/padrone anche se non hai nuovi commit nel tuo repository locale e niente da spingere !! (In questo esempio, non ha commesso nulla di nuovo a livello locale dal punto 1 (clonazione))

==> I risolvere questo problema facendo un git pull origin quando sono sul padrone.

A git pull origin master trasferirà tutti i nuovi commit da un ramo sull'origine alla filiale locale.

A git pull origin reimpostare il riferimento su master uguale al commit in cui il master è referenziato all'origine !! (Quando ciò non è accaduto, il git-bash penserà che tu sei un sacco di commit avanti! Perché nell'albero del commit ci sono un sacco di commit fatti dopo il commit dove è il tuo riferimento principale!)

Questo ti rende d'accordo? Lo fa per me :)

Inoltre non esitate a sostenere i miei toughts un po 'con prove concrete/documentazione :)

+0

per favore leggi anche i commenti sotto la risposta di blunderboy. Lì user1781472 dice che cosa ha risolto il suo problema + alcuni commenti sul perché ha risolto il suo problema. – deblendewim

4

È stato aggiunto un commit sul computer locale, che non è ancora stato inviato al server remoto.

Se si è sicuri le modifiche devono essere condivisi con il repository remoto, inviando il commit al telecomando viene fatto con il comando git push:

git push orgin master:master 
+0

no, questo è il punto, non ho nulla sul mio computer locale che non è impegnato. – user1781472

+0

Qual è la differenza tra ** git push master d'origine ** e ** git push master d'origine: origine/master ** – user1781472

+0

Prima di tutto: errore mio, il comando dovrebbe leggere 'git push origin master: master' - corretto nel inviare. – LeGEC

0

In realtà, è il vostro presupposto che la filiale locale e remota il ramo è sincronizzato Se sta dicendo che il tuo ramo locale è avanti all'origine/master di 1 commit, sicuramente lo è. Tutti noi ci fidiamo di GIT.

Da utilizzare per testare.

git checkout master // You move to master branch 
cat .git/HEAD //shows the commit on which HEAD is pointing to 

git checkout origin/master //you switch to origin master branch 
cat .git/HEAD 

Se vedi che HEAD nel tuo padrone locale e punto di diramazione principale remoto per lo stesso commettere poi sono entrambi in sincronia.

Se la vostra filiale locale è più avanti di 1 commit, basta premere di nuovo (se si desidera) alla filiale remota come

git push origin master 
+1

grazie per la risposta, quindi ho controllato sia local (git log) che remote prima di leggerlo e hanno entrambi lo stesso commit recente. Poi ho fatto un ** git fetch ** e ora quel messaggio è sparito, il che dice che il mio ramo è avanti di 1 commit. Sembra che tutto ciò che ho ottenuto da git pull git pensasse che è il mio commit che non è stato spinto e git fetch risolto, non ho idea di cosa stia succedendo qui – user1781472

+0

1. Hai spinto il tuo commit all'origine. Se non lo hai spinto, il tuo impegno non può trascorrere. 2.Hai resettato HEAD con un'opzione dura? Perché questo rimuove anche il commit dal tuo ramo. – sachinjain024

+1

@ user1781472: Nel sito Web git-scm ho trovato quanto segue: Aggiorna i rami di localizzazione remota: $ git fetch origine Il comando precedente copia tutti i rami dai riferimenti/punti di riferimento/spazio dei nomi e li memorizza negli arbitri locali/remotes/origin/namespace, a meno che il ramo. . L'opzione di recupero è usata per specificare un refspec non predefinito. – deblendewim

1

Non sei in 100% in sincronia con il repository remoto come si sta pensando. Hai tutto dal repository remoto, sì. Ma il tuo master locale è più avanti dell'origine/master di un commit.

Run questo, e ci mostrano i risultati:

git log --all --graph --pretty=format:'%h %d %s' 

mi aspetto di vedere qualcosa di simile:

* (master) Commit D 
* (origin/master) Commit C 
* Commit B 
* Commit A 

Se sto leggendo il tuo post in modo corretto, sei uno commit avanti perché si avere D mentre il ramo remoto è in C. Dovrai git push spingere verso l'alto il commit D al repository remoto. Allora sarai sincronizzato al 100%.

Problemi correlati