Skonfigurowałem zdalne nie-podstawowe „główne” repozytorium i sklonowałem je na moim komputerze. Wprowadziłem kilka lokalnych zmian, zaktualizowałem moje lokalne repozytorium i przesunąłem je z powrotem do mojego zdalnego repozytorium. Do tego momentu wszystko było w porządku.
Teraz musiałem coś zmienić w zdalnym repozytorium. Potem zmieniłem coś w moim lokalnym repozytorium. Uświadomiłem sobie, że zmiana zdalnego repo nie była potrzebna. Próbowałem więc git push
z lokalnego repozytorium do mojego zdalnego repozytorium, ale wystąpił błąd:
Aby zapobiec utracie historii, aktualizacje nie do szybkiego przewijania zostały odrzucone Scal zdalne zmiany przed ponownym przekazaniem dalej. Aby
git push --help
uzyskać szczegółowe informacje, zobacz sekcję „Uwaga na temat szybkiego przewijania” .
Myślałem, że prawdopodobnie a
git push --force
zmusiłbym moją kopię lokalną do wypchnięcia zmian do zdalnej i uczynienia tego samego. Wymusza aktualizację , ale kiedy wracam do zdalnego repozytorium i dokonuję zatwierdzenia, zauważam, że pliki zawierają nieaktualne zmiany (te, które poprzednio miały główne repozytorium).
Jak wspomniałem w komentarzach do jednej z odpowiedzi :
[Próbowałem wymusić, ale wracając do serwera głównego, aby zapisać zmiany, dostaję przestarzałą inscenizację. Kiedy więc zatwierdzam, repozytoria nie są takie same. A kiedy próbuję ponownie użyć git push, pojawia się ten sam błąd.
Jak mogę rozwiązać ten problem?
źródło
git push -force
ostrożniej .git push --force
jest to rzeczywiście inny prawidłowy sposób wymuszania wypychania i wypychania gałęzi tak samo dobrze, jakgit push origin master --force
w przypadku domyślnej wersji Gitpush.default config settings
, chociaż które gałęzie, które są szczególnie wypychane, różnią się między wersjami Git przed 2.0 a po 2.0.git push --force
działa teraz dobrze, FWIW ...git push --force-with-lease
działa jeszcze lepiej :), odmówi aktualizacji oddziału, chyba że jest to stan, którego się spodziewasz. (patrz developer.atlassian.com/blog/2015/04/force-with-lease )Odpowiedzi:
Po prostu zrób:
lub jeśli masz konkretne repozytorium:
Spowoduje to usunięcie poprzednich zatwierdzeń i przekazanie bieżącego.
Może to nie być właściwe, ale jeśli ktoś natknie się na tę stronę, pomyślał, że może chcieć prostego rozwiązania ...
Krótka flaga
Zauważ też, że
-f
to skrót--force
, więcbędzie również działać.
źródło
git push origin +master
zamiast tego, co pozwala wypchnąć wiele referencji bez wymuszania ich wszystkich.git push --force
, możesz zepsuć gałąź master (w zależności od domyślnego zachowania push). Co może być do bani .. trochę ..: Dgit push --force
polega na wymuszeniu wypchnięcia aktualnie wyewidencjonowanej gałęzi do jej części licznika zdalnego, więc jeśli masz gałąź master wyewidencjonowaną, to jest identycznagit push origin master --force
. Będzie inaczej, jeśli używaszmatching
ustawieniapush.default
, które jest domyślne dla wersji Git wcześniejszych niż 2.0.matching
wypycha wszystkie oddziały miejscowych do zdalnych, które mają tę samą nazwę, więc wymuszone pchanie może zdecydowanie nie być tym, co chcesz zrobić ...git push origin master --force
jest.merge -s ours
pracował dla mnieA jeśli
push --force
nie działa, możesz to zrobićpush --delete
. Spójrz na 2 nd linii w tym przypadku:Ale strzeż się...
Nigdy nie wracaj do publicznej historii gitów!
Innymi słowy:
force
pchaj publicznego repozytorium.pull
.reset
anirewrite
historii w repozytorium, które ktoś mógł już wyciągnąć.Oczywiście istnieją wyjątkowo rzadkie wyjątki nawet od tej reguły, ale w większości przypadków nie trzeba tego robić i spowoduje to problemy dla wszystkich innych.
Zamiast tego wykonaj cofnięcie.
I zawsze bądź ostrożny z tym, co popychasz do publicznego repozytorium . Cofanie:
W efekcie oba początkowe HEAD (z przywrócenia i zła resetowania ) będą zawierać te same pliki.
edytuj, aby dodać zaktualizowane informacje i więcej argumentów
push --force
Rozważ siłę pchającą z dzierżawą zamiast pchania, ale nadal wolisz wycofać
Innym problemem
push --force
może być sytuacja, gdy ktoś naciska na coś przed tobą, ale po tym, jak już go pobrałeś. Jeśli przeforsujesz wymuszoną wersję, zastąpisz teraz pracę innych .git push --force-with-lease
wprowadzony w git 1.8.5 ( dzięki komentarzowi @VonC do pytania) próbuje rozwiązać ten konkretny problem. Zasadniczo spowoduje błąd i nie wypchnie, jeśli pilot został zmodyfikowany od czasu ostatniego pobrania.Jest to dobre, jeśli naprawdę jesteś pewien, że
push --force
jest potrzebny, ale nadal chcesz zapobiec kolejnym problemom. Chciałbym powiedzieć, że powinno to byćpush --force
zachowanie domyślne . Ale wciąż nie jest to wymówka, aby wymusićpush
. Ludzie, którzy znaleźli się przed twoją bazą , nadal będą mieli wiele problemów, których można łatwo uniknąć, gdybyś zamiast tego cofnął się .A ponieważ mówimy o
git --push
instancjach ...Dlaczego ktoś miałby wymuszać nacisk?
@linquize przyniósł dobry przykład siły nacisku na komentarze: wrażliwe dane . Źle wyciekłeś danych, których nie należy wypychać. Jeśli jesteś wystarczająco szybki, możesz go „naprawić”
*
, wymuszając nacisk na górę.*
Dane nadal będą na pilocie chyba też zrobić śmieci zbierać lub oczyścić go jakoś . Istnieje również oczywisty potencjał, aby rozprzestrzenić go przez innych, którzy już go pobrali , ale masz pomysł.źródło
git push origin master --delete # do a very very bad bad thing git push origin master # regular push
to faktycznie rozwiązało mój problem idealnie (na repozytorium tylko ze mną i moim przyjacielem). może jest to złe dla publicznych repozytoriów, ale dla prywatnych jest to ratowanie życia.Przede wszystkim nie wprowadzałbym żadnych zmian bezpośrednio w repozytorium „głównym”. Jeśli naprawdę chcesz mieć „główne” repozytorium, powinieneś je tylko naciskać, nigdy nie zmieniaj bezpośrednio.
Jeśli chodzi o występujący błąd, czy próbowałeś
git pull
z lokalnego repozytorium, a następniegit push
z repozytorium głównego? To, co obecnie robisz (jeśli dobrze to rozumiem), wymusza push, a następnie utratę zmian w „głównym” repozytorium. Najpierw powinieneś scalić zmiany lokalnie.źródło
git push -f
, ale jeśli ponownie zmienisz główne repozytorium, musisz wrócić do repozytorium lokalnego igit pull
, aby zsynchronizowało się ono z najnowszymi zmianami. Następnie możesz wykonać swoją pracę i naciskać ponownie. Jeśli zastosujesz się do tego przepływu pracy „push-pull”, nie dostaniesz błędu, na który narzekałeś.Jeśli jestem w mojej gałęzi lokalnej A i chcę wymusić wypchnięcie gałęzi lokalnej B do gałęzi źródłowej CI, można użyć następującej składni:
źródło
git push --force origin B:C
. W moim przypadku wydaje się, żegit push --force origin C
będzie przekazywał tylko z lokalnego mastera do zdalnej gałęzi C, niezależnie od tego, w której gałęzi aktualnie się znajduję.git version 2.3.8 (Apple Git-58)
użyj następującego polecenia:
źródło
-f
flagi ...Naprawdę polecam:
push tylko do głównego repozytorium
upewnij się, że repozytorium główne jest repozytorium , aby nigdy nie mieć problemu z tym, że drzewo robocze repozytorium głównego nie jest zsynchronizowane z
.git
bazą. Zobacz „ Jak przekazać lokalne repozytorium git na inny komputer? ”Jeśli musisz dokonać modyfikacji w głównym (nagim) repozytorium, sklonuj go (na głównym serwerze), dokonaj modyfikacji i odepchnij się do niego
Innymi słowy, utrzymuj dostęp do repozytorium zarówno z głównego serwera, jak i komputera lokalnego, aby mieć jedno repozytorium z / do którego można pobrać / pobrać.
źródło
To było nasze rozwiązanie do zastępowania wzorca w korporacyjnym repozytorium gitHub przy zachowaniu historii.
push -f
opanowanie repozytoriów korporacyjnych jest często wyłączone, aby zachować historię oddziałów. To rozwiązanie działało dla nas.popchnij swój oddział
desiredOrigin
i utwórz PRźródło
Miałem to samo pytanie, ale w końcu je zrozumiałem. Najprawdopodobniej musisz wykonać następujące dwa polecenia git (zamieniając skrót na numer wersji git commit):
źródło