Nie można przesłać do GitHub - ciągle mówi potrzeba scalenia

743

Jestem nowy w GitHub . Dzisiaj spotkałem się z pewnym problemem, gdy próbowałem przekazać mój kod do GitHub.

Pushing to [email protected]:519ebayproject/519ebayproject.git
To [email protected]:519ebayproject/519ebayproject.git
 ! [rejected]        master -> master (non-fast-forward)
error: failed to push some refs to '[email protected]:519ebayproject/519ebayproject.git'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Merge the remote changes (e.g. 'git pull')
hint: before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.

Jeszcze nic nie wypchnąłem do repozytorium, więc dlaczego muszę coś wyciągać?

użytkownik1353717
źródło
6
Zauważ, że może się to zdarzyć również w przypadku oddziałów wcześniej odwiedzanych lokalnie, które miały zatwierdzenia w repozytorium nadrzędnym. Czy istnieje prosty sposób na szybkie przewinięcie tak starej gałęzi lub po prostu pozwolenie gitowi zapomnieć o tym w lokalnym repozytorium?
Thorbjørn Ravn Andersen
50
@ ThorbjørnRavnAndersen - Udało mi się naprawić ten scenariusz za pomocą „git push -f”, co sprawiło, że git zapomniał o swoich wyobrażonych problemach :)
Echelon
6
Widziałem na to skargę od git przybysza. Powodem jest to, że kiedy tworzą nowy projekt na GitHubie, pozostawiają pole wyboru „Inicjuj za pomocą readme” lub wybierają opcje .gitignore / GPL, więc nowy projekt ma już zatwierdzenie, którego nie mają lokalnie, co powoduje zamieszanie spowodowane błędem powyżej.
Ruslan Kabalin
4
@Echelon opcja -f wymuszająca push jest niebezpieczna. Właśnie użyłem go w projekcie zespołowym, a 6 zatwierdzeń zostało „rozłożonych”, po prostu usuniętych z serwera i nie ma możliwości ich odzyskania!
Deleplace
42
Modny jest pochwała git. Ale prawie każdy programista, z którym rozmawiałem, prywatnie zgadza się, że osobiście nienawidzą gita. Teraz, kiedy używają git, spędzają o wiele więcej czasu na kontroli źródła w porównaniu do tego, co spędzali, kiedy używali perforce lub TFS.
developer747

Odpowiedzi:

762

Może to spowodować utratę zatwierdzeń przez zdalne repozytorium; używaj go ostrożnie.

Jeśli nie chcesz scalać gałęzi zdalnej z gałęzią lokalną (zobacz różnice w git diff ) i chcesz wykonać wymuszone wypychanie, użyj polecenia push za pomocą opcji -f

git push -f origin <branch>

gdzie originjest nazwa twojego zdalnego repo.

Zwykle polecenie odmawia aktualizacji zdalnego odwołania, które nie jest przodkiem lokalnego odwołania, którego użyto do zastąpienia. Ta flaga wyłącza czek. Może to spowodować utratę zatwierdzeń przez zdalne repozytorium; używaj go ostrożnie.

Nick Rolando
źródło
1
To działało dla mnie w przypadku repozytorium, które mam na Githubie, ale w mojej aplikacji miałem podmoduł Heroku. i musiałem wyciągnąć pliki z submodułu, a następnie przekazać zaktualizowaną aplikację do Heroku.
JGallardo
24
Przeczytaj ostatni wiersz komentarza do tego postu! „Może to spowodować utratę zatwierdzeń przez zdalne repozytorium; używaj go ostrożnie”. Wykonywanie nacisków siłowych w środowisku drużynowym jest niebezpieczne i zwykle należy tego unikać.
Adam Kalnas
Może to również DODAĆ całą historię od oryginalnego repozytorium do zdalnego za pomocą cherry-pick, aby przenieść „tylko” jedno zatwierdzenie. Wymagane przywracanie z kopii zapasowej ...
rickfoosusa,
Warto również wspomnieć, że jeśli używasz Github, może to zastąpić otwarte żądanie ściągnięcia utworzone wcześniej przy użyciu najnowszych zatwierdzeń. From Github Docs : „Force pushing może zepsuć twoje żądanie ściągnięcia”.
Armfoot
To zadziałało dla mnie. Próbowałem, $ git pull origin master -vale daje błąd fatal: refusing to merge unrelated histories. Potem spróbowałem i zadziałało, a moje lokalne pliki pojawiły się na zdalnym repozytorium github.
Vir
238

Jak mówi wiadomość,

Scal zdalne zmiany (np. „Git pull”)

Użyj, git pullaby pobrać najnowsze zmiany ze zdalnego repozytorium do lokalnego repozytorium. W takim przypadku ciągnięcie zmian będzie wymagało scalenia, ponieważ dokonano zmian w lokalnym repozytorium.

Podam przykład i zdjęcie do wyjaśnienia. Załóżmy, że twoje ostatnie pobranie z początku / oddziału miało miejsce w Commit B. Ukończyłeś i popełniłeś trochę pracy (Commit C). W tym samym czasie ktoś inny zakończył pracę i przekazał ją do źródła / oddziału (Commit D). Konieczne będzie połączenie tych dwóch gałęzi.

local branch:                         --- Commit C 
                                    /
                                   /
                                  /
origin/branch: Commit A ------ Commit B ---- Commit D

Ponieważ jesteś tym, który chce pchać, Git zmusza cię do wykonania scalenia. Aby to zrobić, musisz najpierw pobrać zmiany z początku / gałęzi.

local branch:                         --- Commit C -- Commit E
                                    /               /           
                                   /               /             
                                  /               /               
origin/branch: Commit A ------ Commit B ---- Commit D 

Po zakończeniu scalania będzie można teraz przewijać pochodzenie / oddział do Commit E, naciskając zmiany.

Git wymaga, abyś sam przeprowadzał scalanie, ponieważ scalanie może prowadzić do konfliktów.

Jake Greene
źródło
7
Co jeśli nie chcesz się połączyć? I po prostu zostaw D jako odgałęzienie (przynajmniej na razie). Później mogę popełnić więcej po C; ktoś inny może popełnić więcej po D. Po co się spieszyć, aby się połączyć? Jak mogę przesunąć boczną gałąź bez scalania? ~~~
Steve Pitchers
3
lokalny / oddział i pochodzenie / oddział mają reprezentować ten sam oddział, ale na różnych komputerach (lokalny vs pochodzenie); push lokalny / oddział oznacza aktualizację źródła / oddziału. Jeśli chcesz, aby stan twojej gałęzi był widoczny dla innych (tj. Na początku), ale nie chcesz łączyć się z początkiem / gałęzią, powinieneś utworzyć nową gałąź poza lokalną / gałęzią (git gałąź [nazwa]) i zepchnij tę gałąź do źródła (git push -u origin [nazwa])
Jake Greene
1
Świetne wyjaśnienie. Ten film pokazuje krótką demonstrację problemu i sposób jego rozwiązania, jak opisuje @JakeGreene, a także dwa sposoby uniknięcia go w pierwszej kolejności podczas konfigurowania nowego repozytorium.
Kevin Markham
4
kilka lat później wydaje się, że ta odpowiedź jest bardzo podobna do tej drugiej
superjos,
1
Dla mnie git pullrównież drukowane Already up-to-date. Okazało się, że nie byłem w oddziale, choć tak było, ale oderwany oddział HEAD (być może z powodu nieudanego scalenia?). Było to oczywiste po uruchomieniu git branch. Po uruchomieniu git checkout mybranchwszystko działało zgodnie z oczekiwaniami.
strider,
200

Czy zaktualizowałeś kod przed wypchnięciem?

Użyj git pull origin masterzanim cokolwiek pchniesz.

Zakładam, że używasz originnazwy pilota.

Musisz wyciągnąć przed wypchnięciem, aby Twoje lokalne repozytorium było aktualne przed wypchnięciem czegoś (na wypadek, gdyby ktoś już zaktualizował kod github.com). Pomaga to w rozwiązywaniu konfliktów lokalnie.

AYK
źródło
1
Jak mogę poznać nazwę repozytorium? Kiedy piszę, git pull origin mastergit narzeka, że'origin' does not appear to be a git repository
ziyuang,
3
„pochodzenie” to pilot. Możesz użyć, git remote --verboseaby zobaczyć wszystkie piloty skonfigurowane w folderze git. Informacje wyświetlane na ekranie będą również zawierać ścieżki „[email protected]” lub ścieżki HTTPS, z których powinieneś być w stanie określić, gdzie należy pchać. Mam nadzieję że to pomoże !
AYK
16
git pull origin masterpokazywanie Już aktualny. ale potem, gdy spróbujesz wcisnąć origin_branch, powiedz to samo ostrzeżenie wspomniane w pytaniu. Jakieś sugestie !!
CoDe,
2
@Shubh, czy kiedykolwiek rozwiązałeś problem? Dostaję to samo!
OriginalAlchemist
3
@OriginalAlchemist tak .. ponieważ jestem tylko programistą, który pracuje na oddziale lokalnym-lokalnym ... więc wymusiłem wypychanie lokalnego oddziału .. i to zastępuje wszystkie zmiany otwartego oddziału na serwerze z moimi zmianami z systemu lokalnego. git push -f <remote> <branch>np. git push origin <twoja_lokalna_granica> sprawdź ten wątek .
CoDe
122

Zwykle dzieje się tak, gdy ty git commiti próbujesz git pushzmienić wcześniej git pullingw tej gałęzi, w xktórej ktoś już dokonał zmian.

Normalny przepływ byłby jak poniżej,

KROK 1 : git stashTwoje lokalne niezatwierdzone zmiany w tym oddziale.

KROK 2 : git pull origin branch_name -vdo pull and merge(lokalnie popełnione zmian na tym oddziale . Dać efekt scalenia jakąś wiadomość, a konflikty fix jeśli występują )

KROK 3 : git stash popte stashzmiany ED ( Potem można zrobić rewizje na plikach pojawiło jeśli chcesz lub pchania już popełnił zmiany (Krok 4) imię i zrobić nowy zobowiązać do plików później. )

KROK 4 : git push origin branch_name -vscalone zmiany.

Wymień branch_namesię master(na masteroddziale).

prayagupd
źródło
3
gdzie jest commit? Czy nie powinieneś później zatwierdzać swoich zmian stash pop?
mehmet
Powinienem. Zasadniczo najpierw piszę scalony kod, a następnie zatwierdzam lokalne niezamówione zmiany. Możesz także zatwierdzać i naciskać jednocześnie. Po prostu preferencja.
prayagupd
51

Pierwsze i proste rozwiązanie (niezalecane)

  • Wypróbuj to polecenie git push -f origin master.
  • To polecenie wymusi zastąpienie zdalnego repozytorium (GitHub)

Zalecane rozwiązanie

  • Uruchom następujące polecenia:
git pull --allow-unrelated-histories  //this might give you error but nothing to worry, next cmd will fix it
git add *
git commit -m "commit message"
git push

Jeśli to nie zadziała, wykonaj 🔰

  • Usuń .gitkatalog z folderu.
  • Następnie wykonaj następujące polecenia:

    git init
    git add .
    git commit -m "First Commit"
    git remote add origin [url]
    git push -u origin master
    

LUB

git push -f origin master 

Jedynym zastosowaniem git push -f origin master jeśli -unie działa dla Ciebie.

To rozwiąże prawie każdy rodzaj błędów występujących podczas wypychania plików.

Smit Patel
źródło
4
Usunięcie repozytorium git i utrata całej historii zatwierdzeń to „zalecane” rozwiązanie? Pośpiesz się.
Nils Guillermin
@Nils Guillermin To zależy od twojej sytuacji. Jeśli pracuję nad dużym projektem, w którym muszę naprawić wszystkie konflikty scalania, użyłbym vscode, aby łatwo przejrzeć i scalić wszystkie zmiany. Dziękuję za twoją opinię.
Smit Patel
47

Czasami zapomnieliśmy o ciągnięciu i wykonaliśmy wiele prac w lokalnym środowisku.

Jeśli ktoś chce pchać bez ciągnięcia,

git push --force

działa. Nie jest to zalecane podczas pracy z innymi ludźmi, ale jeśli twoja praca jest prostą rzeczą lub osobistym projektem zabawki, będzie to szybkie rozwiązanie.

Teo
źródło
$ git push --force origin master
shaurya uppal
2
To działało dla mnie: osobisty projekt z 0 innymi współpracownikami. Wypróbowałem kilka innych sugerowanych „rozwiązań” tutaj na SO, z których żadne nie naprawiło bardzo prostego problemu: zrobiłem lokalną reset --hardwersję starszego zatwierdzenia, a potem zrobiłem kilka innych. Potem po prostu chciałem, pushale zdalne repo nie było przygotowane, aby mi na to pozwolić. WarrenP mógłby w rzeczywistości pomóc uczniom zdobyć mniej runiczny charakter. Może nie chce.
Mike gryzoń
2
Albo go nie używaj, albo naucz się go prawidłowo używać. Jeśli wymusisz wypychanie do ważnego centralnego repozytorium udostępnionego przez zespół, powinieneś utracić dostęp do wszystkich ważnych repozytoriów. To, co robisz na swoim osobistym repozytorium, aby uniknąć poznania alternatywnych sposobów wyjścia, ostatecznie wpłynie na twoją zdolność do pracy na wspólnych repozytoriach. Jeśli wiesz, co się stało przed wypchnięciem siły, czasami użycie siły jest w porządku. Jeśli nie, to nigdy nie jest ok.
Warren P,
35

Niektórzy z was mogą mieć ten błąd, ponieważ Git nie wie, którą gałąź próbujesz wcisnąć.

Jeśli Twój komunikat o błędzie zawiera również

error: failed to push some refs to '[email protected]:jkubicek/my_proj.git'
hint: Updates were rejected because a pushed branch tip is behind its remote
hint: counterpart. If you did not intend to push that branch, you may want to
hint: specify branches to push or set the 'push.default' configuration
hint: variable to 'current' or 'upstream' to push only the current branch.

to możesz skorzystać z przydatnych wskazówek Jima Kubicka, Skonfiguruj Git, aby działał tylko w trybie Push Current Branch , aby ustawić domyślną gałąź na current.

git config --global push.default current
xiatica
źródło
32
git pull origin branch_name --rebase

To zadziałało dla mnie - komenda git pull origin branch_name --rebasenajpierw pobierze zmiany ze zdalnej gałęzi, a następnie na rebasebieżącej gałęzi.

Pyuri Sahu
źródło
20

Oprócz powyższych odpowiedzi, dla mnie działały: -

Scenariusz -

  1. Z powodzeniem wypchnąłem moją_gałęzię .
  2. Wprowadziłem jeszcze kilka zmian.
  3. Kiedy próbowałem ponownie pchnąć (po dodaniu, zatwierdzeniu oczywiście), otrzymałem wyżej wspomniany błąd.

Rozwiązanie -

 1. git checkout **my_branch**
 2. git add, commit your changes.
 3. git pull origin **my_branch** (not origin, master, or develop)
 4. git push origin **my_branch**

Dowód

Bhavuk Mathur
źródło
1
Pomogłeś mi Z trudem zauważyłem, że muszę się zameldować do innej gałęzi i wyciągnąć ją ze zdalnego, mimo że ciągnąłem inną gałąź za pomocą --allflagi.
MZanetti,
18

Miałem ten sam problem, ale najpierw popchnąłem go siłą, używając tego

git push --force

Zrobiłem to po tym, jak zatwierdziłem pliki i otrzymywałem błąd tak jak ty. Zatwierdziłem wszystkie pliki i popchnąłem je. Następnym razem naciskałem na github. Zrobiłem to, o co mnie prosił i wtedy było w porządku. Mam nadzieję, że to też dla ciebie działa :)

Kailash Bhalaki
źródło
Będzie działać, ale może nie być to, czego chcesz! Oznacza to, że w zasadzie ignorujesz zmiany, które teraz zostaną utracone na zawsze.
rzuca
3
git push --set-upstream origin master --force
Legends,
1
Świetny sposób na zniszczenie repozytorium. Jeśli wymusisz pchnięcie, zniszczysz historię. Również wiele profesjonalnie skonfigurowanych baz kodu git nie pozwoli na to.
Oliver Dixon,
To jest duplikat odpowiedzi, a oryginał i tak nie był świetną radą.
moopet
To właśnie chcę zrobić, ale właśnie próbowałem z Gitlab, a Gitlab nie pozwala na to w „chronionych gałęziach” z założenia
jeffery_the_wind
13

Wspomniałem o tym w moim tutorialu, jak korzystać z GitHub: tutorial dla początkujących .

Podczas tworzenia nowego repozytorium w GitHub, GitHub może poprosić o utworzenie pliku readme. Jeśli utworzysz plik readme bezpośrednio w GitHub, musisz najpierw złożyć żądanie „pull”, zanim żądanie „push” zakończy się powodzeniem. Te polecenia „wyciągną” zdalne repozytorium, połączą je z bieżącymi plikami, a następnie „wypchną” wszystkie pliki z powrotem do GitHub:

git pull https://github.com/thomas07vt/MyFirstRepo.git master

git push https://github.com/thomas07vt/MyFirstRepo.git master
Thomas07vt
źródło
Wiem, że to rok później, ale spośród wszystkich tych odpowiedzi, Twoja była jedyną, która faktycznie wyjaśniła, dlaczego miałem już problem z pierwszym dniem z githubem. Jaka jest jednak różnica między ściąganiem a pobieraniem?
Xander Luciano
1
Funkcja pobierania pozwala na śledzenie zmian bez łączenia ich z lokalnym oddziałem. Pull to skrót do pobrania, a następnie scalenia. Jestem pewien, że wymyśliłeś to w ciągu ostatnich 13 miesięcy. Po prostu przechodzę, bo stworzyłem własny bałagan. ;-)
wolfhoundjesse
6

Otrzymałem wyżej wymieniony komunikat o błędzie, gdy próbowałem wcisnąć mój aktualny oddział foobar:

git checkout foobar
git push origin foo

Okazuje się, że miałem dwa oddziały lokalne śledzące ten sam oddział zdalny:

foo -> origin/foo (some old branch)
foobar -> origin/foo (my current working branch)

Udało mi się przesunąć moją obecną gałąź za pomocą:

git push origin foobar:foo

... i sprzątać za pomocą git branch -d

Marco
źródło
6

git push -f origin nazwa gałęzi

Użyj powyższego polecenia tylko wtedy, gdy masz pewność, że nie potrzebujesz zdalnego kodu oddziału, w przeciwnym razie najpierw scal, a następnie wypchnij kod

VIKAS KOHLI
źródło
5
To duplikat złej odpowiedzi.
moopet
5

Jeśli nie chcesz angażować się w bieżący projekt (i potencjalnie masz do czynienia z konfliktami scalania, których nie chcesz rozwiązać) i nie chcesz tworzyć innej gałęzi (zarządzanie innym oddziałem będzie uciążliwe), a nie nie chcę robić ryzykownego i stałego git force poleceń (które nawet po przeczytaniu tego, co robią, często jestem zaskoczony implikacjami zrobienia tego).

Rozwiązanie : możesz po prostu przeciągnąć zawartość folderu do innego folderu, przeciągnąć projekt do teraz pustego folderu, przeciągnąć wyciągniętą zawartość do kosza, a następnie przeciągnąć prawidłowy projekt z powrotem do folderu. Powinieneś być w stanie prawidłowo naciskać i uzyskiwać pożądane wyniki. Zajmuje mi to dosłownie mniej niż 10 sekund.

Ludziom, którzy powiedzieliby mi, że nie jest to właściwe, nie powołując się na jakiekolwiek konsekwencje, lub ludzi, którzy mówią mi, żebym użył polecenia, które wywołują u mnie przyszłe niedogodności, mówię: „Ta metoda dosłownie zajmuje mi mniej niż 10 sekund”. Jeśli napotkam polecenie git, którego wdrożenie zajmuje mniej niż 10 sekund i ma dokładnie taki sam efekt, przyjmuję to. Do tego czasu używam tej metody.

Wadą tej metody jest to, że historia zatwierdzeń będzie wyglądać liniowo, gdy faktycznie połączysz się w gałęzi bez udokumentowania scalenia. To może nie być najlepsza metoda podczas pracy z grupami. W takich przypadkach pracuj nad oddziałami!

ScottyBlades
źródło
4

Po prostu miałem ten sam problem, ale w moim przypadku wpisałem niewłaściwą gałąź na pilocie. Wygląda więc na to, że jest to inne źródło tego problemu ... dokładnie sprawdź, czy naciskasz na właściwą gałąź.

longda
źródło
1
I miałem podobną rzecz, przywołałem poprzednie polecenie, które dotyczyło zupełnie innego repozytorium!
Clare Macrae,
4

Doświadczyłem tego samego problemu i okazało się, że jestem w innym (lokalnym) oddziale, niż myślałem, że jestem ORAZ poprawny lokalny oddział był opóźniony w zatwierdzeniach ze zdalnego.

Moje rozwiązanie: sprawdź poprawną gałąź, wybierz zatwierdzenie z innej gałęzi lokalnej, git pull i git push

Ramon Fincken
źródło
4

Miałem podobny problem i okazało się, że mój przepływ pracy związany z aktualizacją mojego oddziału był winy. Robiłem następujące:

W moim lokalnym „mistrzu”

git fetch upstream
git merge upstream/master --ff-only

potem z powrotem w moim lokalnym oddziale

git rebase master

Działa to dobrze w przypadku poprzedniego przepływu git, ale nie w przypadku github. git rebaseTu problem, powodując problemy z synchronizacją (i muszę przyznać, że coś miałem przyjąć bez pełnego zrozumienia) i niestety umieścić mnie w miejscu, gdzie git push -fstał prawdopodobnie najłatwiejszym rozwiązaniem. Niedobrze.

Mój nowy przepływ polega na bezpośredniej aktualizacji gałęzi, wykonując git mergenastępujące czynności:

W moim lokalnym oddziale

git fetch upstream
git merge upstream/master

Nie ma szybkiego przewijania do przodu, ponieważ dokonam oczywiście zmian w lokalnym oddziale.

Jak zapewne wiesz, nie jestem ekspertem od git, ale jestem rzetelnie informowany, że ten przepływ pracy prawdopodobnie pozwoli uniknąć konkretnych problemów, które miałem.

Komponent 10
źródło
3

W moim przypadku sprawdziłem „mój oddział” i zrobiłem to git pull, więc nie mogłem zrozumieć, dlaczego push nie działa. W końcu zdałem sobie sprawę, że pcham niewłaściwą gałąź. git push origin masterZamiast tego pisałem git push origin mybranch.

Więc jeśli już to zrobiłeś git pulli nadal otrzymujesz ten komunikat, upewnij się, że przesuwasz właściwą gałąź.

wisbucky
źródło
3

Czy nazwa twojego oddziału jest taka sama jak nazwa oddziału zdalnego?

Jeśli nie, sprawdź nowy oddział o tej samej nazwie co oddział zdalny i spróbuj ponownie.

Załóżmy, że gałąź zdalna, którą chcesz przekazać, to [ testowanie ], a lokalna gałąź ma nazwę [ test ].

Jeśli nie jesteś w gałęzi testowej , najpierw przełącz się na nią.

git checkout test

Następnie otwórz nowy oddział i nazwij go testowaniem .

git checkout -b testing

Teraz nadszedł czas, aby to przeforsować:

git push [remote repo] testing
fox323
źródło
2
Wystarczy użyć, $git branch -M <new_name>aby zmienić nazwę oddziału lokalnego.
przyjeżdża
3

Rozwiązałem ten problem w moim repozytorium GIT. W tym przypadku nie ma potrzeby rebaseani forcezobowiązań. Aby rozwiązać ten problem, wykonaj poniższe czynności -

local_barnch> git branch --set-upstream to=origin/<local_branch_name> 

local_barnch>git pull origin <local_branch_name>

local_barnch> git branch --set-upstream to=origin/master

local_barnch>git push origin <local_branch_name>

mam nadzieję, że to pomoże.

Sai prateek
źródło
2

Innym rozwiązaniem jest przesunięcie głowy pilota, dokonując kolejnego zatwierdzenia, jeśli możesz. Po wyciągnięciu tej zaawansowanej głowy do lokalnego poddrzewa będziesz mógł ponownie z niej wypchnąć.

9swampy
źródło
2

Otrzymałem podobny błąd podczas wypychania najnowszych zmian do czystego repozytorium Git, którego używam dla gitweb . W moim przypadku nie wprowadziłem żadnych zmian w czystym repozytorium, więc po prostu usunąłem moje puste repozytorium i sklonowałem ponownie:

git clone --bare <source repo path> <target bare repo path>
Hemant
źródło
2

Jeśli masz pewność, że nikt nie wprowadził zmian w repozytorium git i pracujesz nad najnowszą wersją, git pullnie ma to sensu jako rozwiązanie w twoim sercu ...

Więc prawdopodobnie tak się stało, użyłeś git commit --amend

Pozwala łączyć zmiany etapowe z poprzednim zatwierdzeniem zamiast zatwierdzania go jako całkowicie nowej migawki. Można go także użyć do edycji poprzedniej wiadomości zatwierdzenia bez zmiany jej migawki.

Samouczek ATLASSIAN: przepisywanie historii

Jednak nie zaleca się wykonywania, git commit --amend jeśli już wypchnąłeś zatwierdzenie do GitHub , ponieważ „zmiana nie zmienia tylko ostatniego zatwierdzenia - całkowicie go zastępuje. Dla Gita będzie wyglądać jak nowy zatwierdzenie” co oznacza dla innych programistów na twoim GitHubie, historia wygląda jak A-> B-> C, ale dla ciebie wygląda jak A-> B-> D, jeśli GitHub pozwala push, wszyscy inni będą musieli ręcznie naprawić swoją historię

To jest powód, dla którego pojawia się komunikat o błędzie ! [rejected] master -> master (non-fast-forward), jeśli wiesz, że nikt nie wyciągnął Twojej ostatniej zmiany, możesz to zrobić git push --force, zmieni to historię git w Twoim publicznym repozytorium . W przeciwnym razie ... możesz wykonać git pull, ale wierzę, że przyniesie to taki sam wynik, jak nie przeszedłeś git commit --amend, utworzy nowe zatwierdzenie (tj: historia gita po git pull: A-> B-> C-> D )

po więcej szczegółów: Jak zmienić swoje ostatnie zatwierdzenie

watashiSHUN
źródło
2

Inna opcja: lokalnie zmień nazwę swojego oddziału na coś nowego.

Będziesz wtedy mógł przekazać go do zdalnego repozytorium, na przykład, jeśli to twój sposób przechowywania kopii (kopii zapasowej) i upewnienia się, że nic nie zostanie utracone.

Możesz pobrać gałąź zdalną, aby uzyskać lokalną kopię i zbadać różnice między (i) tym, co miał pilot (ze starą nazwą gałęzi) a (ii) co masz (z nową nazwą gałęzi), i zdecydować, co zrobić . Ponieważ nie byłeś świadomy różnic między pilotem (stąd problem), po prostu łączenie lub wymuszanie gdzieś zmian jest zdecydowanie zbyt brutalne.

Spójrz na różnice, wybierz gałąź, nad którą chcesz pracować, wybierz zmiany wiśni, które chcesz z drugiej gałęzi lub cofnij zmiany, których nie chcesz w gałęzi, którą masz itp.

Następnie powinieneś być w stanie zdecydować, czy chcesz wymusić czystą wersję na pilocie, dodać nowe zmiany lub cokolwiek innego.

Ivan
źródło
1

Problem z poleceniem push polega na tym, że twoje lokalne i zdalne repozytorium nie pasuje. JEŻELI domyślnie inicjujesz plik Readme podczas tworzenia nowego repozytorium z git hub, gałąź master jest tworzona automatycznie. Jednak przy próbie wypychania nie ma żadnej gałęzi. nie możesz naciskać ... Najlepszą praktyką jest tworzenie repozytoriów bez domyślnej inicjalizacji readme.

Suman Astani
źródło
1

Ten problem jest zwykle powodowany przez utworzenie pliku readme.md, który jest liczony jako zatwierdzenie, nie jest synchronizowany lokalnie w systemie i brakuje go za głową, dlatego pokazuje żądanie ściągnięcia git. Możesz spróbować uniknąć pliku readme, a następnie spróbować zatwierdzić. W moim przypadku zadziałało.

Aman Mishra
źródło
0

Inna przyczyna tego problemu (najwyraźniej nie tak powszechna) ...

Mój serwer był opóźniony ~ 12 godzin, kiedy zrobiłem push

Skonfigurowałem NTP na serwerze SYNC mój zegar.

Wykonałem nowe polecenie git push, które doprowadziło do błędu omówionego w tym poście.

XMAN
źródło
0

Jeśli przypadkiem zostanie git pullwydrukowany, Already up-to-datemożesz sprawdzić globalny push.defaultparametr git (In ~/.gitconfig). Ustaw, simplejeśli to było matching. Poniższa odpowiedź wyjaśnia, dlaczego:

Git - Jaka jest różnica między „dopasowaniem” i „prostym” push.default

Warto również sprawdzić, czy lokalny oddział jest nieaktualny git remote show origini w razie potrzeby wykonać pull

Vikash Raja Samuel Selvin
źródło
0

use git pull https://github.com/username/repository Jest tak, ponieważ Github i zdalne repozytoria nie są zsynchronizowane. Jeśli to pullrepozytorium, a następnie Pushwszystko będzie zsynchronizowane, a błąd zniknie.

`

Mahi
źródło
0

git pull drukuje już up-to-date

rozwiązanie:

możesz utworzyć repozytorium / projekt na zdalnym serwerze (serwer) i dodać tam jakiś plik, a następnie ponownie utworzyć folder w swoim lokalnym i zainicjowanym git git init- to jest błąd , nie powinieneś tworzyćgit init w lokalnym, zamiast tego klonuj projekt do lokalnego za pomocągit clone

następnie pociągnij

noob_no1
źródło