git: Twój oddział wyprzedza X zatwierdzeń

379

Jak to się właściwie dzieje?

Obecnie pracuję w jednym repozytorium, więc oto mój przepływ pracy:

  1. Zmień pliki
  2. Popełnić
  3. Powtarzaj 1-2, aż będziesz zadowolony
  4. Naciśnij, aby opanować

Potem, gdy robię a git status, mówi mi, że moja gałąź wyprzedza X zatwierdzeń (przypuszczalnie ta sama liczba zatwierdzeń, które zrobiłem). Czy dlatego, że kiedy wypychasz kod, tak naprawdę nie aktualizuje on lokalnie buforowanych plików (w folderach .git)? git pullwydaje się „naprawiać” tę dziwną wiadomość, ale wciąż jestem ciekawy, dlaczego tak się dzieje, może źle używam git?


w tym jaka gałąź jest wydrukowana w wiadomości

Mój lokalny oddział wyprzedza mistrza

gdzie naciskasz / ciągniesz bieżącą gałąź

Naciskam na GitHub i ciągnę do dowolnego komputera, nad którym w danym momencie pracuję, moja lokalna kopia jest zawsze w pełni aktualna, ponieważ jestem jedyną, która nad tym pracuje.

tak naprawdę nie sprawdza zdalnego repo

Tak myślałem, pomyślałem, że upewnię się, że moje rozumienie tego jest prawidłowe.

przekazujesz dodatkowe argumenty?

Nie te, które widzę, może po mojej stronie dzieje się jakaś zabawna konfiguracja?

$ git status
# On branch master
# Your branch is ahead of 'origin/master' by 1 commit.
#
nothing to commit (working directory clean)
SeanJA
źródło
Jak się masz pushi jakie są ustawienia konfiguracji zdalnej i gałęzi?
CB Bailey,
2
w rzeczywistości nie sprawdza zdalnego repozytorium, musisz wykonać polecenie git, pobrać najnowsze informacje na zdalnym repozytorium po wykonaniu wypychania, zaktualizuje to lokalną gałąź „zdalną”, której używa do śledzenia.
Sekhat
2
@Sekhat: Chociaż git statusnie sprawdza zdalnego repozytorium, git pullrobi. Jeśli masz gałąź śledzenia dla repozytorium, do którego wypychasz dane, git pushzaktualizuje lokalny oddział śledzenia, aby odzwierciedlał nowy stan gałęzi zdalnej, jeśli Twoje wypychanie zakończy się powodzeniem. Dlatego zapytałem o konfigurację pytającego, ponieważ jeśli nie dzieje się to poprawnie, prawdopodobnie występuje błąd konfiguracji.
CB Bailey,
git status? naprawdę? My git statusnigdy nie mówi mi, jak daleko jest mój oddział .. ty przechodząc jakieś dodatkowe argumenty do niego?
hasen
4
@hasen j: git statusnie przechodzi do zdalnego repozytorium, aby sprawdzić, czy gałąź zdalna została zaktualizowana. Informuje o tym, jak daleko dzieli Cię lokalny oddział od lokalnie przechowywanego zdalnego oddziału śledzenia. Problem polega na tym, że normalne git push(podobnie jak pobieranie i pobieranie) powinno aktualizować gałąź zdalnego śledzenia, a dla pytającego nie wydaje się, aby działało. Aby zobaczyć, dlaczego potrzebujemy zobaczyć zarówno dokładną formę tego git push, jak używana jest konfiguracja lokalnego repozytorium, ale ponieważ pytający zaakceptował już odpowiedź, nie widzę tego teraz.
CB Bailey

Odpowiedzi:

508

Jeśli otrzymasz ten komunikat po wykonaniu git pull remote branch, spróbuj wykonać to za pomocą git fetch. (Opcjonalnie uruchom, git fetch -paby przyciąć usunięte gałęzie z repozytorium)

Wydaje się, że Fetch aktualizuje lokalną reprezentację zdalnej gałęzi, co niekoniecznie się zdarza, gdy wykonujesz git pull remote branch.

Bogaty
źródło
1
Brawo. To był naprawdę problem. Zacząłem od utworzenia repozytorium w kodzie Google. Następnie sklonowałem to repozytorium na moim laptopie i pracuję tam i wypycham zmiany, laptop => code.google. Kiedyś tę wiadomość otrzymywałem na mój serwer, na którym utworzyłem klon repozytorium kodu code.google i ściągałem zmiany. Myślę, że pobranie jest wymagane do aktualizacji lokalnej bazy danych.
rjha94
2
Mieliśmy tutaj ten sam problem, ponieważ inna gałąź (A) wskazywała na ten sam commid master. Pociągnięcie A, a następnie pociągnięcie mistrza spowodowało tę samą sytuację. Kiedy git wyciągnął A, plik zatwierdzenia został zaktualizowany do ostatniego, więc ciągnięcie elementu nadrzędnego nie ma nic do pobrania, więc git nie zaktualizował ostatniego elementu zatwierdzenia i ostrzegał przed wyprzedzeniem.
Uberto,
8
Dziękuję, choć zauważyłem jedną dziwną rzecz. „git fetch origin master” nie pomaga, ale „git fetch origin” robi. Jestem w gałęzi master, więc nie jestem pewien, jak „git fetch origin” zrobiłby coś innego w tym kontekście.
Parag
2
@ Parag patrz stackoverflow.com/questions/26350876/..., aby uzyskać wyjaśnienie różnic między tymi dwoma poleceniami i jak zmodyfikować plik konfiguracyjny w celu zmiany zachowania, aby git fetch remote branch aktualizował również referencję oddziału zdalnego śledzenia, więc git_status nie zgłasza „z wyprzedzeniem”.
Anatortoise House,
2
@Parag, także stackoverflow.com/questions/7365415/… odpowiedź omawia szczegóły braku synchronizacji ORIG_HEAD i FETCH_HEAD, powodując ostrzeżenie o stanie i możliwe poprawki pliku konfiguracyjnego.
Anatortoise House,
138

Posługiwać się

git pull --rebase

Opcja --rebase oznacza, że ​​git przeniesie twoje lokalne zatwierdzenie na bok, zsynchronizuje się ze zdalnym, a następnie spróbuje zastosować twoje zatwierdzenia z nowego stanu.

Marian Zburlea
źródło
3
Naprawdę dobry sposób, aby zapobiec niepotrzebnym połączeniom i uzyskać czystsze drzewo pochodzenia!
Hatef
1
Próbowałem tego polecenia, ale nadal mam ten sam 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
bbh,
4
Ta odpowiedź jest błędna: jeśli użyjesz go bez zrozumienia sytuacji, potencjalnie przysparzasz problemów w nadchodzących czasach (przepisana historia!). Jeśli zrozumiesz sytuację, nie będzie to poprawką. Zastanów się, zanim zaczniesz pisać git, i nigdy nie bezmyślnie przepisuj historię!
cmaster
80

Użyj tych 3 prostych poleceń

Krok 1 :git checkout <branch_name>

Krok 2 :git pull -s recursive -X theirs

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

Więcej informacji: https://stackoverflow.com/a/39698570/2439715

Cieszyć się.

Abhishek Goel
źródło
3
To jedyna odpowiedź, która naprawiła problem. Komendy powyżej dziwnie powaliły go z 12 do 7 zatwierdzeń, co w końcu je usunęło
Ieuan
1
Zgadzam się, że to była jedyna rzecz, która działała dla mnie. Jestem przekonany, że GIT ma czasem wiele zaburzeń osobowości.
ksed
11
Podobnie jak @leuan, nic mi git reset --hard origin/masternie wyjaśniło.
Dave Land
To samo tutaj, to są jedyne kroki, które działały dla mnie
Shard_MW
51

Myślę, że źle odczytujesz wiadomość - Twoja gałąź nie wyprzedza master, tak jest master . To przodzie origin/master, który jest odległy oddział śledzenia , który rejestruje status zdalnego repozytorium z twoim ostatnim push, pullalbo fetch. Mówi ci dokładnie, co zrobiłeś; wyprzedziłeś pilota, który przypomina ci pchanie.

Josh Lee
źródło
22
To jest właściwie po tym, jak nacisnąłem. Musiałem wyciągnąć (a może pobrać?), Aby nie wyświetlać tej wiadomości.
SeanJA
26

Ktoś powiedział, że możesz źle odczytać wiadomość, a ty nie. Ten problem dotyczy w rzeczywistości Twojego <project>/.git/configpliku. W tym będzie sekcja podobna do tej:

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

Jeśli usuniesz linię pobierania z pliku .git / config twojego projektu, zatrzymasz „Twoja gałąź wyprzedza 'origin / master' przez Ncommits.” irytacja.

Tak przynajmniej mam nadzieję. :)

Fałszywy kod Monkey Rashid
źródło
Sprawdzę to następnym razem, gdy zobaczę ahead by x commitswiadomość. Dawno nie widziałem wiadomości.
SeanJA,
Dawno nie widziałem wiadomości. Myślę, że
dzieje się
Próbowałem tego, ale spowodowało to, że eGit w Eclipse zaczął pojawiać się z „błędem wewnętrznym”, gdy próbowałem zatwierdzić. Jednak sama Git działała dobrze.
user4815162342
18
Co robi ta linia? i czego mi brakuje, usuwając go? (oprócz irytacji)
John Mee
1
To działało, ale bardziej przypomina tłumienie błędu. Dodaj linię z powrotem, a zaczniesz ponownie otrzymywać ostrzeżenie.
Krishna Pandey
15

Miałem ten problem na moim serwerze scenicznym, gdzie robię tylko ściągnięcia. A twardy reset pomógł mi wyczyścić HEAD do tego samego co pilot.

git reset --hard origin/master

Więc teraz znów mam:

On branch master
Your branch is up-to-date with 'origin/master'.
Anatolii Pazhyn
źródło
Najpierw próbowałem bez flagi --hard i zadziałało!
kroiz
12

To zadziałało dla mnie

git reset --hard origin/master

Wynik musi wyglądać

On branch dev HEAD is now at ae1xc41z Last commit message

Али Палитаев
źródło
11

W moim przypadku było tak, ponieważ przełączyłem się na master za pomocą

 git checkout -B master

Wystarczy pobrać nową wersję zamiast

 git checkout master

Pierwsze polecenie resetuje szefa master do moich najnowszych zatwierdzeń

użyłem

git reset --hard origin/master

Aby to naprawić

AxCoder
źródło
9

Przejrzałem wszystkie rozwiązania na tej stronie i na szczęście @ anatolii-pazhyn skomentował, ponieważ jego rozwiązanie było tym, które zadziałało. Niestety nie mam wystarczającej reputacji, aby go zagłosować, ale najpierw polecam wypróbowanie jego rozwiązania:

git reset --hard origin/master

Co dało mi:

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

Polecam również:

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

Możesz także użyć:

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

Powodzenia

Ryan Erwin
źródło
4

Miałem ten sam problem na komputerze z systemem Windows. Gdy uruchomiłem git pull origin masterpolecenie, otrzymałem ostrzeżenie „przed / początek / wzorzec przez X zatwierdzeń”. Odkryłem, że jeśli zamiast tego uruchomiłem git pull origini NIE określiłem gałęzi, nie otrzymam już ostrzeżenia.

Ojciec Kodeksu
źródło
Wierzę, że skutecznie robi to git fetchza kulisami.
Brian Peterson
„git fetch” nie rozwiązało mojego problemu. Mam listę nowo dodanych gałęzi i komunikat „Poprosiłeś o pobranie ze zdalnego„ nadrzędnego ”, ale nie określiłeś gałęzi. Ponieważ nie jest to domyślnie skonfigurowany zdalny dla bieżącej gałęzi, musisz podać gałąź w poleceniu linia." a następne polecenie „status git” nie wyświetlało ostrzeżenia.
Krishna Pandey
2

Przypomina tylko różnice między bieżącą gałęzią a gałęzią, która wykonuje bieżącą ścieżkę. Podaj więcej informacji, w tym o tym, która gałąź jest drukowana w wiadomości i gdzie naciskasz / ciągniesz obecną gałąź.

wRAR
źródło
2

Chociaż to pytanie jest trochę stare ... Byłem w podobnej sytuacji, a moja odpowiedź tutaj pomogła mi rozwiązać podobny problem

Najpierw spróbuj z push -flub wymuś opcję

Jeśli to nie zadziała, możliwe jest, że (jak w moim przypadku) zdalne repozytoria (a raczej odniesienia do zdalnych repozytoriów, które się pojawią git remote -v) mogą nie zostać zaktualizowane.

Wynikiem powyższego jest to, że push zsynchronizował lokalny / oddział ze zdalnym / oddziałem, jednak pamięć podręczna w lokalnym repozytorium nadal pokazuje poprzednie zatwierdzenie (lokalnego / oddziału ... pod warunkiem, że tylko pojedynczy zatwierdzenie zostało wypchnięte) jako HEAD.

Aby potwierdzić powyższe klonowanie repozytorium w innej lokalizacji i spróbuj porównać lokalną / odgałęzioną HEAD i zdalną / odgałęzioną HEAD. Jeśli oba są takie same, prawdopodobnie masz do czynienia z problemem, który zrobiłem.

Rozwiązanie:

$ 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)

Teraz wykonaj push -fnastępujące czynności

git push -f github master ### Uwaga: twoje polecenie już nie ma origin!

Zrób git pullteraz git pull github master

po git statusotrzymaniu

# On branch master

nothing to commit (working directory clean)

Mam nadzieję, że jest to przydatne dla kogoś, ponieważ liczba wyświetleń jest tak duża, że ​​wyszukiwanie tego błędu prawie zawsze wyświetla ten wątek na górze

Zobacz także gitref, aby uzyskać szczegółowe informacje

Vikram
źródło
2

Tak się naprawdę zdarzyło, kiedy robiłem zamianę / kasy z TortiseGIT.

Mój problem polegał na tym, że utworzyłem oddział w oparciu o inny oddział lokalny. Utworzył wpis „scalania”, /.git/configktóry wyglądał mniej więcej tak:

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

Gdziekolwiek, kiedy przechodziłem do gałęzi „web”, mówiono mi, że mam ponad 100 zobowiązań przed rozwojem. Cóż, nie zobowiązałem się już do rozwoju, więc to prawda. Mogłem po prostu usunąć ten wpis i wydaje się, że działa zgodnie z oczekiwaniami. To właściwie śledzi za pomocą zdalnego ref, zamiast narzekać na to, że stoi za gałęzią programistyczną.

Jak powiedział Vikram, ten wątek przepełnienia stosu jest najlepszym wynikiem w Google podczas wyszukiwania tego problemu, więc pomyślałem, że podzielę się moją sytuacją i rozwiązaniem.

Dustin Graham
źródło
2

Chciałbym powtórzyć to samo, co wspomniany powyżej przez @Marian Zburlia. To działało dla mnie i sugerowałoby to samo innym.

git pull origin develop

powinien następować $ git pull --rebase.

Spowoduje to usunięcie komentarzy pojawiających się $ git statuspo ostatnim ściągnięciu.

Partho Chatterjee
źródło
2

git fetch rozwiąże to dla ciebie

Jeśli moje rozumowanie jest prawidłowe, twój lokalny (buforowany) origin/masterjest nieaktualny. To polecenie zaktualizuje stan repozytorium z serwera.

Racilla Guillaume
źródło
1
Dodaj opis
Mathews Sunny,
2

Potem, gdy robię status git, mówi mi, że moja gałąź wyprzedza X zatwierdzeń (prawdopodobnie ta sama liczba zatwierdzeń, które zrobiłem ).

Moje doświadczenie jest w środowisku zespołowym z wieloma oddziałami. Pracujemy we własnych gałęziach fabularnych (w lokalnych klonach) i był to jeden z tych, który git statuspokazał , że miałem 11 zmian do przodu. Moje robocze założenie, podobnie jak autora pytania, było takie, że +11 pochodzi z moich własnych zobowiązań .

Okazało się, że wprowadziłem zmiany z developgałęzi wspólnej do mojej gałęzi obiektów wiele tygodni wcześniej - ale zapomniałem! Kiedy ponownie odwiedziłem mój lokalny oddział funkcji i zrobiłem, git pull origin developże liczba przeskoczyła do +41 zatwierdzeń przed nami. Dużo pracy zostało zrobione, developwięc moja lokalna gałąź funkcji była jeszcze dalej niż gałąź funkcji w originrepozytorium.

Tak więc, jeśli otrzymasz ten komunikat, wróć do wszelkich operacji ściągania / scalania, które mogłeś wykonać z innych gałęzi (własnych lub innych), do których masz dostęp. Wiadomość tylko sygnalizuje, że potrzebujesz git pushtych pullzmian z powrotem do originrepozytorium („gałąź śledzenia”) z repozytorium lokalnego, aby wszystko zsynchronizować.

Facet z FPGA
źródło
1

Odpowiedzi, które sugerują git pulllub git fetchsą prawidłowe.
Komunikat jest generowany, gdy git statuswidzi różnicę między .git/FETCH_HEADi .git/refs/remotes/<repository>/<branch>(np .git/refs/remotes/origin/master.).

Ten ostatni plik zapisuje HEAD od ostatniego pobrania (dla repozytorium / oddziału). Wykonanie git fetchaktualizacji obu plików do aktualnego HEAD oddziału.
Oczywiście, jeśli nie ma nic do pobrania (ponieważ lokalne repozytorium jest już aktualne), to .git/FETCH_HEADsię nie zmienia.

NoBrassRing
źródło
To nie wydaje się być tak, dla mnie: .git/FETCH_HEADzawiera 9f7336c873ccffc772168bf49807e23ff74014d3 branch 'master' of URLi .git/refs/remotes/origin/masterzawiera 9f7336c873ccffc772168bf49807e23ff74014d3, ale ja nadal odbierać wiadomości ani git pullnie git fetchrozwiązuje go
Davide
0

Jeśli pojawi się ten komunikat po wykonaniu zatwierdzenia w celu wyśledzenia pliku w gałęzi, spróbuj wprowadzić zmiany w dowolnym pliku i wykonać zatwierdzenie. Najwyraźniej nie można dokonać pojedynczego zatwierdzenia, które obejmuje jedynie wyśledzenie wcześniej śledzonego pliku. Wreszcie ten post pomógł mi rozwiązać cały problem https://help.github.com/articles/removing-files-from-a-repository-s-history/ . Musiałem tylko usunąć plik z historii repozytorium.

nurb
źródło