Jak to się właściwie dzieje?
Obecnie pracuję w jednym repozytorium, więc oto mój przepływ pracy:
- Zmień pliki
- Popełnić
- Powtarzaj 1-2, aż będziesz zadowolony
- 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 pull
wydaje 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)
źródło
push
i jakie są ustawienia konfiguracji zdalnej i gałęzi?git status
nie sprawdza zdalnego repozytorium,git pull
robi. Jeśli masz gałąź śledzenia dla repozytorium, do którego wypychasz dane,git push
zaktualizuje 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.git status
? naprawdę? Mygit status
nigdy nie mówi mi, jak daleko jest mój oddział .. ty przechodząc jakieś dodatkowe argumenty do niego?git status
nie 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 normalnegit 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ę tegogit push
, jak używana jest konfiguracja lokalnego repozytorium, ale ponieważ pytający zaakceptował już odpowiedź, nie widzę tego teraz.Odpowiedzi:
Jeśli otrzymasz ten komunikat po wykonaniu
git pull remote branch
, spróbuj wykonać to za pomocągit fetch
. (Opcjonalnie uruchom,git fetch -p
aby 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
.źródło
Posługiwać się
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.
źródło
$ 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
git
, i nigdy nie bezmyślnie przepisuj historię!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ę.
źródło
git reset --hard origin/master
nie wyjaśniło.Myślę, że źle odczytujesz wiadomość - Twoja gałąź nie wyprzedza
master
, tak jestmaster
. To przodzieorigin/master
, który jest odległy oddział śledzenia , który rejestruje status zdalnego repozytorium z twoim ostatnimpush
,pull
albofetch
. Mówi ci dokładnie, co zrobiłeś; wyprzedziłeś pilota, który przypomina ci pchanie.źródło
Ktoś powiedział, że możesz źle odczytać wiadomość, a ty nie. Ten problem dotyczy w rzeczywistości Twojego
<project>/.git/config
pliku. W tym będzie sekcja podobna do tej:Jeśli usuniesz linię pobierania z pliku .git / config twojego projektu, zatrzymasz „Twoja gałąź wyprzedza 'origin / master' przez
N
commits.” irytacja.Tak przynajmniej mam nadzieję. :)
źródło
ahead by x commits
wiadomość. Dawno nie widziałem wiadomości.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.
Więc teraz znów mam:
źródło
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
W moim przypadku było tak, ponieważ przełączyłem się na master za pomocą
Wystarczy pobrać nową wersję zamiast
Pierwsze polecenie resetuje szefa master do moich najnowszych zatwierdzeń
użyłem
Aby to naprawić
źródło
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:
Co dało mi:
Polecam również:
Możesz także użyć:
Powodzenia
źródło
Miałem ten sam problem na komputerze z systemem Windows. Gdy uruchomiłem
git pull origin master
polecenie, otrzymałem ostrzeżenie „przed / początek / wzorzec przez X zatwierdzeń”. Odkryłem, że jeśli zamiast tego uruchomiłemgit pull origin
i NIE określiłem gałęzi, nie otrzymam już ostrzeżenia.źródło
git fetch
za kulisami.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łąź.
źródło
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 -f
lub 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:
Teraz wykonaj
push -f
następujące czynnościgit push -f github master
### Uwaga: twoje polecenie już nie maorigin
!Zrób
git pull
terazgit pull github master
po
git status
otrzymaniu# 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
źródło
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/config
który wyglądał mniej więcej tak: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.
źródło
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 status
po ostatnim ściągnięciu.źródło
git fetch
rozwiąże to dla ciebieJeśli moje rozumowanie jest prawidłowe, twój lokalny (buforowany)
origin/master
jest nieaktualny. To polecenie zaktualizuje stan repozytorium z serwera.źródło
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 status
pokazał , ż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
develop
gałę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,develop
więc moja lokalna gałąź funkcji była jeszcze dalej niż gałąź funkcji worigin
repozytorium.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 push
tychpull
zmian z powrotem doorigin
repozytorium („gałąź śledzenia”) z repozytorium lokalnego, aby wszystko zsynchronizować.źródło
Odpowiedzi, które sugerują
git pull
lubgit fetch
są prawidłowe.Komunikat jest generowany, gdy
git status
widzi różnicę między.git/FETCH_HEAD
i.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 fetch
aktualizacji 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_HEAD
się nie zmienia.źródło
.git/FETCH_HEAD
zawiera9f7336c873ccffc772168bf49807e23ff74014d3 branch 'master' of URL
i.git/refs/remotes/origin/master
zawiera9f7336c873ccffc772168bf49807e23ff74014d3
, ale ja nadal odbierać wiadomości anigit pull
niegit fetch
rozwiązuje goJeś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.
źródło