git: il tuo ramo è in vantaggio di X commit


379

Come può effettivamente accadere?

Al momento sto lavorando in un repository da solo, quindi questo è il mio flusso di lavoro:

  1. Cambia file
  2. Commettere
  3. Ripeti 1-2 fino a quando non sei soddisfatto
  4. Spingere per padroneggiare

Quindi quando faccio un git statusmi dice che il mio ramo è in vantaggio con X commit (presumibilmente lo stesso numero di commit che ho fatto). È perché quando si spinge il codice in realtà non aggiorna i file memorizzati nella cache locale (nelle cartelle .git)? git pullsembra "riparare" questo strano messaggio, ma sono ancora curioso di sapere perché succede, forse sto usando git sbagliato?


incluso quale ramo è stampato nel messaggio

La mia filiale locale è davanti al maestro

dove spingi / tira il ramo corrente

Sto spingendo su GitHub e tirando su qualsiasi computer su cui mi capita di lavorare in quel momento, la mia copia locale è sempre completamente aggiornata poiché sono l'unico che ci sta lavorando.

in realtà non controlla il repository remoto

Questo è quello che pensavo, immaginavo che mi sarei assicurato che la mia comprensione fosse corretta.

stai passando qualche argomento in più ad esso?

Non quelli che riesco a vedere, forse c'è qualche configurazione divertente in corso da parte mia?

$ git status
# On branch master
# Your branch is ahead of 'origin/master' by 1 commit.
#
nothing to commit (working directory clean)

Come stai facendo pushe quali sono le tue impostazioni di configurazione remota e branch?
CB Bailey,

2
in realtà non controlla il repository remoto, è necessario eseguire un git recuperare il recupero delle ultime informazioni sul repository remoto dopo aver eseguito il push, questo aggiornerà il ramo locale "remoto" che utilizza per tenere traccia.
Sekhat,

2
@Sekhat: Anche git statusse non controlla il repository remoto, lo git pullfa. Se si dispone di una diramazione di tracciamento per un repository a cui si git pushesegue il push, si aggiornerà la diramazione di localizzazione locale in modo da riflettere il nuovo stato della diramazione remota se la trasmissione ha esito positivo. Questo è il motivo per cui ho chiesto informazioni sulla configurazione del richiedente perché se non sta accadendo correttamente c'è probabilmente un errore di configurazione.
CB Bailey,

git status? veramente? il mio git statusnon mi dice mai quanto è avanti il ​​mio ramo .. ci stai passando qualche argomento in più?
hasen

4
@hasen j: git statusnon va al repository remoto per verificare se il ramo remoto è stato aggiornato. Ti dice in che misura la tua filiale locale viene confrontata con la filiale di localizzazione remota memorizzata localmente . Il problema è che un normale git push(oltre a prendere e tirare) dovrebbe aggiornare il ramo di tracciamento remoto e per il richiedente questo sembra non funzionare. Per capire perché dobbiamo vedere sia la forma esatta di git pushciò che viene utilizzata sia la configurazione del repository locale, ma poiché il richiedente ha già accettato una risposta, non riesco a vederlo accadere ora.
CB Bailey

Risposte:


508

Se ricevi questo messaggio dopo aver fatto un git pull remote branch, prova a seguirlo con un git fetch. (Facoltativamente, eseguire git fetch -pper eliminare i rami eliminati dal repository)

Il recupero sembra aggiornare la rappresentazione locale del ramo remoto, cosa che non si verifica necessariamente quando si esegue un git pull remote branch.


1
Bravo. Questo era davvero il problema. Ho iniziato creando un repository sul codice di Google. Quindi ho clonato questo repository sul mio laptop e ci lavoro e spingo le modifiche, laptop => code.google. Ho usato per ricevere questo messaggio sul mio server in cui avevo creato un clone di repository di code code.google e ho usato per estrarre le modifiche. Penso che il recupero sia necessario per aggiornare il database locale.
rjha94,

2
Abbiamo avuto lo stesso problema qui perché un altro ramo (A) ha indicato lo stesso commitid di master. Tirare A e poi tirare il padrone ha portato a questa stessa situazione. Quando git ha estratto A, il commit è stato aggiornato all'ultimo, quindi tirare master non ha nulla da estrarre, quindi git non ha aggiornato l'ultimo master commit e ha avvertito di essere "avanti al master".
Uberto,

8
Grazie, anche se ho notato una cosa strana. "git fetch origin master" non aiuta, ma "git fetch origin" lo fa. Sono nel ramo principale, quindi non sono sicuro di come "git fetch origin" farebbe qualcosa di diverso nel contesto.
Parag,

2
@Parag vedono stackoverflow.com/questions/26350876/... per una spiegazione delle differenze tra questi due comandi, e come forse per modificare file di configurazione per cambiare il comportamento in modo git fetch ramo remoto aggiorna anche l'arbitro a distanza-tracking-ramo, in modo da git_status non riporta "in anticipo".
Anatortoise House,

2
@Parag, anche stackoverflow.com/questions/7365415/... risposta discute i dettagli di ORIG_HEAD e FETCH_HEAD andare fuori sincrono, causando l'avviso di stato, e le possibili correzioni file di configurazione.
Anatortoise House,

138

Uso

git pull --rebase

L'opzione --rebase significa che git sposta da parte il commit locale, si sincronizza con il telecomando e quindi tenta di applicare i commit dal nuovo stato.


3
Un ottimo modo per prevenire inutili fusioni e avere un albero più pulito in origine!
Odio il

1
Ho provato questo comando, ma ho ancora lo stesso problema ...$ git pull --rebase Current branch xyz is up to date. $ git status On branch xyz Your branch is ahead of 'origin/xyz' by 6 commits. (use "git push" to publish your local commits) nothing to commit, working tree clean
bbh,

4
Questa risposta è sbagliata: se la usi senza comprendere la situazione, stai potenzialmente creando problemi per i tempi a venire (storia riscritta!). Se capisci la situazione, questa non sarà la soluzione. Si prega di pensare prima di digitare durante l'utilizzo gite di non riscrivere mai la storia in modo inconsapevole!
cmaster - reinstalla monica il

81

Usa questi 3 semplici comandi

Step 1 :git checkout <branch_name>

Passaggio 2 :git pull -s recursive -X theirs

Passaggio 3 :git reset --hard origin/<branch_name>

Maggiori dettagli: https://stackoverflow.com/a/39698570/2439715

Godere.


3
Questa è l'unica risposta che in realtà ha risolto il problema per me. I comandi sopra stranamente l'hanno buttato giù da 12 a 7 commit e questo ha finalmente rimosso quelli
Ieuan

1
Concordo sul fatto che questa sia l'unica cosa che ha funzionato per me. Sono convinto che a volte GIT abbia disturbi della personalità multipla.
ksed

11
Come @leuan, nient'altro che git reset --hard origin/masterrisolto per me.
Dave Land,

Lo stesso qui, questo è l'unico passo che ha funzionato per me
Shard_MW

51

Penso che tu stia leggendo male il messaggio - il tuo ramo non è avanti master, lo è master . E 'in anticipo origin/master, che è un ramo di monitoraggio remoto che registra lo stato del repository remoto dal vostro ultimo push, pullo fetch. Ti sta dicendo esattamente quello che hai fatto; hai superato il telecomando e ti ricorda di spingere.


22
Questo è in realtà dopo che ho spinto. Ho dovuto tirare (o eventualmente recuperare?) Per farlo per non avere quel messaggio.
SeanJA,

26

Qualcuno ha detto che potresti aver letto male il tuo messaggio, non lo sei. Questo problema ha effettivamente a che fare con il tuo <project>/.git/configfile. In esso sarà una sezione simile a questa:

[remote "origin"]
    url = <url>
    fetch = +refs/heads/*:refs/remotes/origin/*

Se rimuovi la linea di recupero dal file .git / config del tuo progetto, interromperai "Il tuo ramo è davanti a 'origin / master' per Ncommit." fastidio dal verificarsi.

Almeno così spero. :)


Lo verificherò la prossima volta che vedrò il ahead by x commitsmessaggio. Non vedo il messaggio da un po '.
SeanJA,

Non vedo il messaggio da un po '. Penso che sia perché ho iniziato a creare il repository git localmente, quindi spingerlo in un repository remoto invece che viceversa ...
SeanJA,

Ho provato questo, ma ha fatto sì che eGit in Eclipse iniziasse a comparire con "errore interno" quando ho provato a eseguire il commit. Git stesso sembrava funzionare bene, però.
user4815162342

18
Cosa fa quella linea? e cosa mi sto perdendo rimuovendolo? (a parte il fastidio)
John Mee,

1
Questo ha funzionato, ma è più come sopprimere l'errore. Aggiungi nuovamente la riga e ricomincerai a ricevere un avviso.
Krishna Pandey,

15

Ho avuto questo problema sul mio stage server dove faccio solo pull. E l'hard reset mi ha aiutato a pulire HEAD allo stesso modo del telecomando.

git reset --hard origin/master

Quindi ora ho di nuovo:

On branch master
Your branch is up-to-date with 'origin/master'.

Ho provato per la prima volta senza la bandiera --hard e ha funzionato!
kroiz,

12

Questo ha funzionato per me

git reset --hard origin/master

L'output deve essere simile

On branch dev HEAD is now at ae1xc41z Last commit message


11

Nel mio caso è stato perché sono passato al master usando

 git checkout -B master

Solo per estrarre la nuova versione invece di

 git checkout master

Il primo comando reimposta il capo del master ai miei ultimi commit

ero solito

git reset --hard origin/master

Per risolvere questo


9

Ho esaminato tutte le soluzioni in questa pagina e fortunatamente @ anatolii-pazhyn ha commentato perché la sua soluzione era quella che ha funzionato. Sfortunatamente non ho abbastanza reputazione per votarlo, ma raccomando prima di provare la sua soluzione:

git reset --hard origin/master

Che mi ha dato:

HEAD is now at 900000b Comment from my last git commit here

Raccomando anche:

git rev-list origin..HEAD
# to see if the local repository is ahead, push needed

git rev-list HEAD..origin
# to see if the local repository is behind, pull needed

Puoi anche usare:

git rev-list --count --left-right origin/master...HEAD
# if you have numbers for both, then the two repositories have diverged

Buona fortuna


4

Ho avuto lo stesso problema su un computer Windows. Quando ho eseguito un git pull origin mastercomando, ho ricevuto l'avvertimento "anticipando" origine / master "da X commit". Ho scoperto che se invece avessi eseguito git pull origine NON specificato il ramo, non avrei più ricevuto l'avviso.


Credo che ciò avvenga effettivamente git fetchdietro le quinte.
Brian Peterson,

"git fetch" non ha risolto il mio problema, questo è successo. Ho ottenuto un elenco di rami appena aggiunti e questo messaggio "Hai chiesto di estrarre dal 'upstream' remoto, ma non hai specificato un ramo. Poiché questo non è il telecomando configurato per il tuo ramo corrente, devi specificare un ramo sul comando linea." e il successivo comando "git status" non ha mostrato l'avvertimento.
Krishna Pandey,

2

Ti ricorda solo le differenze tra il ramo corrente e il ramo che fa la traccia corrente. Fornisci ulteriori informazioni, incluso quale ramo è stampato nel messaggio e dove spingi / tira il ramo corrente.


2

Anche se questa domanda è un po 'vecchia ... Ero in una situazione simile e la mia risposta qui mi ha aiutato a risolvere un problema simile che avevo

Prima prova con push -fo forza l'opzione

Se ciò non ha funzionato, è possibile che (come nel mio caso) i repository remoti (o piuttosto i riferimenti ai repository remoti che appaiono su git remote -v) potrebbero non essere aggiornati.

Il risultato di cui sopra è stato il tuo push sincronizzato locale / branch con il tuo remoto / branch, tuttavia, la cache nel repository locale mostra ancora il commit precedente (di locale / branch ... purché sia ​​stato inviato solo il commit singolo) come HEAD.

Per confermare quanto sopra clonare il repository in una posizione diversa e provare a confrontare HEAD locale / branch e HEAD remoto / branch. Se entrambi sono uguali, probabilmente stai affrontando il problema che ho fatto.

Soluzione:

$ git remote -v
github  git@github.com:schacon/hw.git (fetch)
github  git@github.com:schacon/hw.git (push)
$ git remote add origin git://github.com/pjhyett/hw.git
$ git remote -v
github  git@github.com:schacon/hw.git (fetch)
github  git@github.com:schacon/hw.git (push)
origin  git://github.com/pjhyett/hw.git (fetch)
origin  git://github.com/pjhyett/hw.git (push)
$ git remote rm origin
$ git remote -v
github  git@github.com:schacon/hw.git (fetch)
github  git@github.com:schacon/hw.git (push)

Ora fai push -fquanto segue

git push -f github master ### Nota che il tuo comando non ha originpiù!

Fai un git pullora git pull github master

al git statusricevimento

# On branch master

nothing to commit (working directory clean)

Spero che ciò sia utile per qualcuno in quanto il numero di visualizzazioni è così elevato che la ricerca di questo errore elenca quasi sempre questa discussione in alto

Consultare anche gitref per i dettagli


2

In realtà questo è successo mentre stavo facendo un cambio / checkout con TortiseGIT.

Il mio problema era che avevo creato il ramo basato su un altro ramo locale. Ha creato una voce "unisci" in /.git/configqualcosa del genere:

[branch "web"]
    merge = refs/heads/develop
    remote = gitserver

Dove ogni volta che passavo al ramo "web", mi diceva che avevo più di 100 impegni prima dello sviluppo. Bene, non mi stavo più impegnando a sviluppare, quindi era vero. Sono stato in grado di rimuovere semplicemente questa voce e sembra funzionare come previsto. Sta correttamente monitorando con il riferimento remoto invece di lamentarsi di essere dietro il ramo di sviluppo.

Come ha detto Vikram, questo thread Stack Overflow è il miglior risultato in Google durante la ricerca di questo problema, quindi ho pensato di condividere la mia situazione e soluzione.


2

Vorrei ribadire lo stesso menzionato da @Marian Zburlia sopra. Ha funzionato per me e suggerirebbe lo stesso ad altri.

git pull origin develop

dovrebbe essere seguito da $ git pull --rebase.

Questo rimuoverà i commenti che arrivano sul $ git statusdopo l'ultimo pull.


2

git fetch risolverà questo per te

Se la mia comprensione è corretta, il tuo locale (memorizzato nella cache) non origin/masterè aggiornato. Questo comando aggiornerà lo stato del repository dal server.


1
Per favore, aggiungi una descrizione
Mathews Sunny,

2

Quindi quando faccio uno stato git mi dice che il mio ramo è avanti di X commit (presumibilmente lo stesso numero di commit che ho fatto ).

La mia esperienza è in un ambiente di squadra con molte filiali. Lavoriamo nelle nostre filiali (in cloni locali) ed è stato uno di quelli che git statushanno mostrato che avevo 11 impegni in anticipo. La mia ipotesi di lavoro, come l'autore della domanda, era che +11 provenisse da miei impegni .

Si è scoperto che avevo apportato modifiche dal developramo comune al mio ramo delle funzioni molte settimane prima, ma ho dimenticato! Oggi, quando ho rivisitato il mio ramo locale delle funzionalità e ho fatto un git pull origin developnumero, il numero è salito a +41 e si impegna in anticipo. Molto lavoro era stato svolto develope quindi il mio ramo di funzionalità locale era ancora più avanti rispetto al ramo di funzionalità sulorigin repository.

Quindi, se ricevi questo messaggio, ripensa a eventuali pull / fusioni che potresti aver fatto da altri rami (tuoi o di altri) a cui hai accesso. Il messaggio segnala semplicemente che è necessario apportare git pushtali pullmodifiche al originrepository ("branch di monitoraggio") dal repository locale per sincronizzare le cose.


1

Le risposte che suggeriscono git pullo git fetchsono corrette.
Il messaggio viene generato quando git statusvede una differenza tra .git/FETCH_HEADe .git/refs/remotes/<repository>/<branch>(ad es .git/refs/remotes/origin/master.).

Quest'ultimo file registra HEAD dall'ultimo recupero (per il repository / branch). Fare git fetchaggiorna entrambi i file all'attuale HEAD della filiale.
Naturalmente se non c'è nulla da recuperare (perché il repository locale è già aggiornato), allora .git/FETCH_HEADnon cambia.


Questo non sembra essere il caso per me: .git/FETCH_HEADcontiene 9f7336c873ccffc772168bf49807e23ff74014d3 branch 'master' of URLe .git/refs/remotes/origin/mastercontiene 9f7336c873ccffc772168bf49807e23ff74014d3, ma ho ancora ricevuto il messaggio e non git pullne git fetchrisolve
Davide

0

Se viene visualizzato questo messaggio dopo aver eseguito un commit per non tracciare il file nel ramo, provare ad apportare alcune modifiche in qualsiasi file ed eseguire il commit. Apparentemente non è possibile eseguire un singolo commit che include solo il tracciamento del file precedentemente tracciato. Finalmente questo post mi ha aiutato a risolvere l'intero problema https://help.github.com/articles/removing-files-from-a-repository-s-history/ . Ho dovuto solo rimuovere il file dalla cronologia del repository.

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.