Git mówi, że lokalny oddział znajduje się za zdalnym oddziałem, ale tak nie jest

84

Scenariusz:

  1. Tworzę nową gałąź
  2. zhakować to
  3. popełnij to
  4. Popchnij
  5. hack to więcej
  6. popełnij ponownie
  7. spróbuj ponownie

Git odpowiada:

Aktualizacje zostały odrzucone, ponieważ końcówka Twojej bieżącej gałęzi znajduje się za jej zdalnym odpowiednikiem. itp.

Tylko ja hakuję tę gałąź - nikt inny jej nie dotyka. Oddział zdalny znajduje się w rzeczywistości za oddziałem lokalnym. W ogóle nie powinnam musieć ciągnąć.

(A jeśli wyciągnę, Git zgłasza konflikty między nimi i zmusza mnie do scalenia gałęzi w siebie)

Dlaczego tak się (prawdopodobnie) dzieje? Jak mogę to zdiagnozować / naprawić?

Żeby było jasne, nigdzie się nie rozgałęziam i nikt inny nad tym nie pracuje:

Remote: Commit A -------- Commit B  

Local:  Commit A -------- Commit B -------- Commit C  

C jest prostą kontynuacją B, bez rozgałęzień. Ale git myśli, że C jest gałęzią A:

Remote: Commit A -------- Commit B  

                  ------- Commit C  
                /  
Local:  Commit A -------- Commit B  

To nie jest; to prosta kontynuacja B.

Tim Janke
źródło
1
Wyjście git remote -vi git show remote origin(zakładając, że źródłem jest pilot, z którym masz problem) może być pomocne
Ben Graham

Odpowiedzi:

197

Prawdopodobnie przepisałeś historię? Twój lokalny oddział różni się od tego na serwerze. Uruchom to polecenie, aby lepiej zrozumieć, co się stało:

gitk HEAD @{u}

Zdecydowanie zalecamy, abyś spróbował zrozumieć, skąd pochodzi ten błąd. Aby to naprawić, po prostu uruchom:

git push -f

To -fsprawia, że ​​jest to „wymuszone wypychanie” i nadpisuje gałąź na serwerze. Jest to bardzo niebezpieczne, gdy pracujesz w zespole. Ale ponieważ jesteś sam i jesteś pewien, że twój stan lokalny jest poprawny, powinno to wystarczyć. Ryzykujesz utratę historii zatwierdzania, jeśli tak nie jest.

Chronial
źródło
13
To było to. W kroku 2 wykonałem polecenie „Popraw ostatnie zatwierdzenie”, następnie nacisnąłem, zhakowałem jeszcze trochę, a potem spróbowałem ponownie. Źle zrozumiałem sposób działania programu Amend. Dzięki!
Tim Janke
4
Wydaje się to bardzo przydatne - ale czy ktoś mógłby wyjaśnić składnię „HEAD @ {u}”?
ChrisV,
5
Zarówno polecenie, jak HEADi @{u}odnoszą się do zatwierdzeń. Mówią gitk, które gałęzie mają wyświetlić. HEADodnosi się do aktualnie wyewidencjonowanej gałęzi, @{u}jest skrótem od HEAD@{u}, który reprezentuje wyższą gałąź aktualnie wyewidencjonowanej gałęzi. Czyli np. master, to jest zwykle origin/master.
Kronika
Miałem ten sam scenariusz - musiałem wykonać ponowne skanowanie i scalić konflikty. Korzystanie bardzo gitkpomogło!
brichins
Przydarza mi się, gdy wykonam lokalnie wiele prostych zatwierdzeń (nie poprawiam) i spróbuję naciskać. Wiem, że nikt inny nie zmienia rzeczy na githubie. Gitk naprawdę pokazał, że zdalny był inny niż lokalny, pomimo oczekiwań, powinien pokazać lokalną jako nowszą wersję niż zdalna, a nie zdalną jako rozwidlenie (wyglądało tak, nie wiem zbyt wiele gitk do powiedzenia)
Aquarius Power
5

Rozwiązanie jest bardzo proste i działało dla mnie.

Spróbuj tego :

git pull --rebase <url>

następnie

git push -u origin master
theRana
źródło
4

Zdarzyło mi się to, gdy próbowałem popchnąć gałąź develop (używam git flow). Ktoś musiał opanować aktualizacje push. aby to naprawić, zrobiłem:

git co master
git pull

Co spowodowało te zmiany. Następnie,

git co develop
git pull

Co nic nie dało. Myślę, że gałąź deweloperska już została wypchnięta pomimo komunikatu o błędzie. Wszystko jest teraz aktualne i żadnych błędów.

Daniel
źródło
0

Aby to zdiagnozować, postępuj zgodnie z tą odpowiedzią .

Ale aby to naprawić, wiedząc, że jesteś jedyną osobą, która go zmienia, wykonaj:
1 - wykonaj kopię zapasową projektu (zrobiłem tylko pliki na git, folder ./src)
2 -git pull
3 - przywróć kopię zapasową wielu "pomieszanych" plików ( ze wskaźnikami łączenia)

próbowałem git pull -s recursive -X ours ale nie działałem tak, jak chciałem, może to być opcja, ale najpierw wykonaj kopię zapasową !!!

Upewnij się, że różnice / zmiany (w git gui) nie istnieją. To jest mój przypadek, w ogóle nie ma nic do scalenia, ale github ciągle mówi, że powinienem się scalić ...

Moc Wodnika
źródło