git: Ramificația ta este în avans cu X comenzi (Programare, Git, Git Commit)

SeanJA a intrebat.

Cum se întâmplă de fapt acest lucru?

Lucrez singur într-un singur repo în acest moment, așa că acesta este fluxul meu de lucru:

  1. Schimbarea fișierelor
  2. Trimiteți
  3. Repetați 1-2 până când sunteți mulțumit
  4. Împingeți în master

Apoi, când fac un git status îmi spune că ramura mea este înainte cu X comisioane (probabil același număr de modificări pe care le-am făcut eu). Este din cauză că atunci când împingi codul nu se actualizează de fapt fișierele memorate local (în dosarele .git)? git pull pare să „repare” acest mesaj ciudat, dar sunt încă curios de ce se întâmplă, poate că folosesc greșit git?


inclusiv ce ramură este tipărită în mesaj

Ramificația mea locală este înaintea celei master

unde se face push/pull-ul ramurii curente

Fac push pe GitHub și extrag pe orice calculator pe care se întâmplă să lucrez în acel moment, copia mea locală este întotdeauna complet actualizată, deoarece sunt singurul care lucrează la ea.

nu verifică de fapt repo-ul de la distanță

Asta am crezut și eu, m-am gândit să mă asigur că am înțeles corect.

Îi dai niște argumente suplimentare?

Nu din câte văd eu, poate că există o configurație ciudată la mine?

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

Comentarii

  • Cum se face push și care sunt setările de configurare pentru distanță și ramură? –  > Por CB Bailey.
  • de fapt, nu verifică repo-ul de la distanță, trebuie să faceți un git fetch pentru a obține cele mai recente informații despre repo-ul de la distanță după ce ați efectuat push-ul; acest lucru va actualiza ramura locală „de la distanță” pe care o folosește pentru a urmări. –  > Por Sekhat.
  • @Sekhat: În timp ce git status nu verifică depozitul de la distanță, git pull o face. Dacă aveți o ramură de urmărire pentru un depozit în care faceți push, git push va actualiza ramura de urmărire locală pentru a reflecta noua stare a ramurii de la distanță dacă împingerea dvs. are succes. Acesta este motivul pentru care am întrebat despre configurația solicitantului, deoarece, dacă nu se întâmplă corect, probabil că există o eroare de configurare. –  > Por CB Bailey.
  • git status? într-adevăr? git status nu-mi spune niciodată cât de departe este ramura mea… îi treci niște argumente suplimentare? –  > Por hasen.
  • @hasen j: git status nu merge la depozitul de la distanță pentru a verifica dacă ramura de la distanță a fost actualizată. Îți spune cât de departe este ramura ta locală față de ramura ta locală. stocată local ramura de urmărire de la distanță stocată local. Problema este că un sistem normal git push (precum și fetch și pull) ar trebui să actualizeze ramura de urmărire de la distanță, iar pentru solicitant acest lucru nu pare să funcționeze. Pentru a vedea de ce trebuie să vedem atât forma exactă a git push care este folosită și configurația depozitului local, dar, deoarece solicitantul a acceptat deja un răspuns, nu văd cum se poate întâmpla acest lucru acum. –  > Por CB Bailey.
18 răspunsuri
Rich

Dacă primiți acest mesaj după ce ați făcut un git pull remote branch, încercați să-l urmați cu un git fetch. (Opțional, executați git fetch -p pentru a elimina ramurile șterse din repo)

Fetch pare să actualizeze reprezentarea locală a ramurii de la distanță, ceea ce nu se întâmplă neapărat atunci când efectuați un git pull remote branch.

Comentarii

  • Bravo. Aceasta a fost într-adevăr problema. Am început prin a crea un depozit pe google code. Apoi am clonat acest repository pe laptop și fac munca acolo și împing modificările, laptop => code.google. Obișnuiam să primesc acest mesaj pe serverul meu unde am creat o clonă a depozitului de cod code.google code și am folosit pentru a trage modificările. Cred că fetch este necesar pentru a actualiza baza de date locală. –  > Por rjha94.
  • Am avut aceeași problemă aici, deoarece o altă ramură (A) a indicat același commitid al masterului. Extragerea lui A și apoi a masterului a dus la aceeași situație. Atunci când git a extras A, commitid-ul a fost actualizat la ultimul, astfel încât la extragerea masterului nu avea nimic de extras de fapt, astfel încât git nu a actualizat ultimul commitid al masterului și a fost avertizat că este „înaintea masterului”. –  > Por Uberto.
  • Mulțumesc, deși am observat un lucru ciudat. „git fetch origin master” nu ajută, dar „git fetch origin” da. Eu sunt pe ramura master, așa că nu știu cum ar putea „git fetch origin” să facă ceva diferit în acest context. –  > Por Parag.
  • @Parag consultați stackoverflow.com/questions/26350876/… pentru o explicație a diferențelor dintre aceste două comenzi și cum poate să modificați fișierul de configurare pentru a schimba comportamentul astfel încât git fetch remote branch să actualizeze și ref remote-tracking-branch, astfel încât git_status să nu raporteze „ahead by”. –  > Por Casa Anatortoise.
  • @Parag, de asemenea, răspunsul stackoverflow.com/questions/7365415/…. discută detaliile legate de faptul că ORIG_HEAD și FETCH_HEAD nu sunt sincronizate, cauzând avertismentul de stare, și posibilele corecții ale fișierului de configurare. –  > Por Casa Anatortoise.
Marian Zburlea

Utilizați

git pull --rebase

Opțiunea –rebase înseamnă că git va muta comiterea locală la o parte, se va sincroniza cu cea de la distanță și apoi va încerca să aplice comiterea din noua stare.

Comentarii

  • O modalitate foarte bună de a preveni fuziunile inutile și de a avea un arbore mai curat în origin! –  > Por hatef.
  • Am încercat această comandă, dar încă mai am aceeași problemă…$ 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 –  > Por bbh.
  • Acest răspuns este greșit: dacă îl folosiți fără să înțelegeți situația, puteți crea probleme pentru vremurile viitoare (istorie rescrisă!). Dacă înțelegeți situația, acest lucru va nu fi soluția pentru aceasta. Vă rugăm să vă gândiți înainte de a tasta atunci când utilizați git, și nu rescrieți niciodată istoria fără să vă gândiți! –  > Por cmaster – restabiliți-o pe monica.
  • Care este diferența față de răspunsul lui @Rich? –  > Por Timo.
Abhishek Goel

Utilizați aceste 3 comenzi simple

Pasul 1 : git checkout <branch_name>

Pasul 2 : git pull -s recursive -X theirs

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

Mai multe detalii : https://stackoverflow.com/a/39698570/2439715

Bucurați-vă.

Comentarii

  • Acesta este singurul răspuns care chiar a rezolvat problema pentru mine. Comenzile de mai sus au coborât în mod ciudat de la 12 la 7 comenzi, iar acest lucru le-a eliminat în cele din urmă –  > Por Ieuan.
  • Sunt de acord cu faptul că acesta este singurul lucru care a funcționat pentru mine. Sunt convins că GIT are uneori tulburări de personalitate multiplă. –  > Por ksed.
  • 17

  • Ca și @leuan, nimic altceva decât git reset --hard origin/master a lămurit lucrurile pentru mine. –  > Por Dave Land.
  • Același lucru aici, acesta este singurul pas care a funcționat pentru mine –  > Por Shard_MW.
Josh Lee

Cred că interpretezi greșit mesajul – ramura ta nu este înaintea lui masterci este master. Este în fața lui origin/master, care este un ramura de urmărire la distanță care înregistrează starea depozitului de la distanță de la ultima dvs. push, pull, sau fetch. Îți spune exact ce ai făcut; ai luat-o înainte de la distanță și îți amintește să faci push.

Comentarii

    24

  • Aceasta este de fapt după ce am apăsat. A trebuit să trag (sau, eventual, să aduc?) pentru a nu mai avea acest mesaj. –  > Por SeanJA.
Али Палитаев

Acest lucru a funcționat pentru mine

git reset --hard origin/master

Ieșirea trebuie să arate astfel

On branch dev
HEAD is now at ae1xc41z Last commit message

Comentarii

  • Da! Mulțumesc, am folosit git reset --hard origin master dar încă aveam un commit gata de a fi împins –  > Por Broski.
Fake Code Monkey Rashid

Cineva a spus că s-ar putea să interpretezi greșit mesajul, nu este așa. Această problemă are de fapt legătură cu <project>/.git/config fișier. În el va fi o secțiune asemănătoare cu aceasta:

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

Dacă elimini linia fetch din fișierul .git/config al proiectului tău, vei opri mesajul „Your branch is ahead of ‘origin/master’ by N comits.” să nu mai apară.

Sau cel puțin așa sper. 🙂

Comentarii

  • Voi verifica asta data viitoare când voi vedea ahead by x commits mesaj. Nu am mai văzut mesajul de ceva vreme. –  > Por SeanJA.
  • Nu am mai văzut mesajul de ceva vreme. Cred că se datorează faptului că am început să creez repo-ul git local, apoi să-l împing către un repo la distanță, în loc de invers… –  > Por SeanJA.
  • Am încercat acest lucru, dar a făcut ca eGit în Eclipse să înceapă să apară cu „eroare internă” atunci când am încercat să comit. Git în sine părea să funcționeze bine, totuși. –  > Por user481516162342.
  • 19

  • Ce face această linie și ce pierd dacă o înlătur? (în afară de enervare) – –  > Por John Mee.
  • Acest lucru a funcționat, dar este mai mult ca și cum ar fi suprimarea erorii. Adăugați linia înapoi și veți începe să primiți din nou avertismentul. –  > Por Krishna Pandey.
Anatolii Pazhyn

Am avut această problemă pe serverul meu de scenă, unde fac doar trageri. și hard reset m-a ajutat să curăț HEAD la fel ca la distanță.

git reset --hard origin/master

Așa că acum am din nou:

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

Comentarii

  • Prima dată am încercat fără steagul –hard și a funcționat! –  > Por kroiz.
Ryan Erwin

Am parcurs fiecare soluție de pe această pagină și, din fericire, @anatolii-pazhyn a comentat, deoarece soluția lui a fost cea care a funcționat. Din păcate, nu am suficient reputație pentru a-i da upvote, dar vă recomand să încercați mai întâi soluția lui:

git reset --hard origin/master

Care mi-a dat:

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

De asemenea, recomand:

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

De asemenea, puteți folosi:

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

Mult noroc

AxCoder

În cazul meu a fost din cauză că am trecut la master folosind

 git checkout -B master

Doar pentru a trage noua versiune în loc de

 git checkout master

Prima comandă resetează capul de master la cele mai recente comenzi ale mele

Eu am folosit

git reset --hard origin/master

Pentru a repara asta

Tatăl Codului

Am avut aceeași problemă pe o mașină Windows. Când am rulat un git pull origin master comanda, primeam avertismentul „ahead of ‘origin/master’ by X commits”. Am descoperit că dacă în loc de asta executam git pull origin și NU specifica ramura, atunci nu mai primeam avertismentul.

Comentarii

  • Cred că acest lucru face efectiv git fetch în spatele scenei. –  > Por Brian Peterson.
  • „git fetch” nu a rezolvat problema mea, ci aceasta. Am primit o listă cu ramurile nou adăugate și acest mesaj „You asked to pull from the remote ‘upstream’, but did not specify a branch. Deoarece aceasta nu este distanța configurată în mod implicit pentru ramura curentă, trebuie să specificați o ramură în linia de comandă.”, iar următoarea comandă „git status” nu a afișat avertismentul. –  > Por Krishna Pandey.
wRAR

Vă reamintește doar diferențele dintre ramura curentă și ramura care face track-ul curent. Vă rugăm să furnizați mai multe informații, inclusiv ce ramură este tipărită în mesaj și de unde faceți push/pull la ramura curentă.

Vikram

Deși această întrebare este un pic mai veche… am fost într-o situație similară și răspunsul de aici m-a ajutat să rezolv o problemă similară pe care am avut-o

Prima încercare cu push -f sau opțiunea force

Dacă nu a funcționat, este posibil ca (ca în cazul meu) depozitele la distanță (sau mai degrabă referințele la depozitele la distanță care apar pe git remote -v) să nu fie actualizate.

Rezultatul de mai sus este că push-ul dvs. a sincronizat ramura locală/branșă cu cea de la distanță/branșă, însă, în cache-ul din repo-ul dvs. local încă mai apare confirmarea anterioară (a ramurii locale/branșă …cu condiția ca o singură confirmare să fi fost trimisă) ca HEAD.

Pentru a confirma cele de mai sus, clonați repo-ul într-o altă locație și încercați să comparați local/branch HEAD și remote/branch HEAD. Dacă ambele sunt identice, atunci probabil că vă confruntați cu problema cu care m-am confruntat eu.

Soluție:

$ git remote -v
github  [email protected]:schacon/hw.git (fetch)
github  [email protected]:schacon/hw.git (push)
$ git remote add origin git://github.com/pjhyett/hw.git
$ git remote -v
github  [email protected]:schacon/hw.git (fetch)
github  [email protected]: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  [email protected]:schacon/hw.git (fetch)
github  [email protected]:schacon/hw.git (push)

Acum efectuați un push -f după cum urmează

git push -f github master ### Rețineți că comanda dvs. nu are origin anymore!

Faceți a git pull acum git pull github master

pe git status primește

# On branch master

nothing to commit (working directory clean)

Sper că acest lucru este util pentru cineva, deoarece numărul de vizualizări este atât de mare încât căutarea acestei erori aproape întotdeauna listează acest fir de discuție în partea de sus

De asemenea, consultați gitref pentru detalii

Dustin Graham

De fapt, am avut acest lucru se întâmplă când făceam un switch / checkout cu TortiseGIT.

Problema mea a fost că am creat ramura bazată pe o altă ramură locală. Acesta a creat o intrare de „fuziune” în /.git/config care arăta ceva de genul acesta:

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

De fiecare dată când treceam la ramura „web”, mi se spunea că sunt cu peste 100 de comenzi înainte de dezvoltare. Ei bine, nu mai făceam comenzi pentru dezvoltare, așa că era adevărat. Am reușit să elimin pur și simplu această intrare și se pare că funcționează așa cum era de așteptat. Urmărește în mod corespunzător cu referința de la distanță în loc să se plângă că este în urma ramurii de dezvoltare.

După cum a spus Vikram, acest fir de discuție Stack Overflow este primul rezultat în Google atunci când se caută această problemă, așa că m-am gândit să împărtășesc situația și soluția mea.

Partho Chatterjee

Aș dori să reiterez același lucru menționat de @Marian Zburlia mai sus. A funcționat pentru mine și aș sugera același lucru și altora.

git pull origin develop

ar trebui să fie urmat de $ git pull --rebase.

Acest lucru va elimina comentariile care apar pe $ git status după ultimul pull.

user10272064

git fetch va rezolva acest lucru pentru dvs.

Dacă am înțeles corect, fișierul local (în cache) origin/master este depășită. Această comandă va actualiza starea depozitului de pe server.

Comentarii

  • Vă rugăm să adăugați o descriere –  > Por Mathews Sunny.
FPGA-guy

Apoi, când fac un git status, îmi spune că ramura mea este în avans cu X comenzi (probabil același număr de de comenzi pe care le-am făcut eu).

Experiența mea este într-un mediu de echipă cu multe ramuri. Lucrăm în propriile ramuri de caracteristici (în clone locale) și a fost una dintre cele care git status a arătat că am fost cu 11 comenzi înainte. Presupunerea mea de lucru, la fel ca autorul întrebării, a fost că +11 era de la comisioane ale mele.

S-a dovedit că am preluat modificări din ramura comună develop în ramura mea caracteristică cu multe săptămâni mai devreme – dar am uitat! Când am revizitat astăzi ramura mea locală de caracteristici și am făcut un git pull origin develop numărul a sărit la +41 comisioane înainte. Se lucrase mult în develop și astfel, ramura mea locală de caracteristici era chiar și mai avansată decât ramura de caracteristici de pe origin depozit.

Așadar, dacă primiți acest mesaj, gândiți-vă la orice extragere/mergare pe care ați făcut-o din alte ramuri (ale voastre sau ale altora) la care aveți acces. Mesajul vă semnalează doar că trebuie să git push acele pullmodificări editate înapoi în ramura origin repo („ramura de urmărire”) din repo-ul dvs. local pentru a sincroniza lucrurile.

NoBrassRing

Răspunsurile care sugerează git pull sau git fetch sunt corecte.
Mesajul este generat atunci când git status vede o diferență între .git/FETCH_HEAD și .git/refs/remotes/<repository>/<branch> (de ex. .git/refs/remotes/origin/master).

Acest din urmă fișier înregistrează HEAD de la ultima preluare (pentru depozitul/ramura). Efectuarea git fetch actualizează ambele fișiere la HEAD-ul curent al ramurii.
Desigur, dacă nu mai este nimic de preluat (deoarece depozitul local este deja actualizat), atunci .git/FETCH_HEAD nu se modifică.

Comentarii

  • Acest lucru nu pare să fie cazul meu: .git/FETCH_HEAD conține 9f7336c873ccffc772168bf49807e23ff74014d3 branch 'master' of URL și .git/refs/remotes/origin/master conține 9f7336c873ccffc772168bf49807e23ff74014d3, dar primesc în continuare mesajul și nici git pull nici git fetch îl rezolvă –  > Por Davide.
nurb

Dacă primiți acest mesaj după ce ați făcut o confirmare, pentru a elimina fișierul din ramură, încercați să faceți o modificare în orice fișier și efectuați o confirmare. Aparent, nu puteți face un singur commit care include doar untracking fișier trackat anterior. în cele din urmă acest post m-a ajutat să rezolv întreaga problemă https://help.github.com/articles/removing-files-from-a-repository-s-history/. A trebuit doar să elimin fișierul din istoricul depozitului.