Jestem nowy w Git, więc możesz mnie traktować jak nowicjusza.
Nasz przepływ pracy jest taki. Mamy oddział, do dev
którego mogę dotrzeć origin/dev
. Kiedy dokonujemy zmian, tworzymy gałąź off dev:
git checkout -b FixForBug origin / dev
Teraz mam gałąź nazwaną FixForBug
śledzącą (myślę, że to właściwe słowo) origin/dev
. Tak więc, jeśli git pull
to zrobię, przyniesie nowe zmiany, z origin/dev
których jest super. Teraz, kiedy skończę z poprawką, wysyłam do zdalnej gałęzi o tej samej nazwie.
Najpierw ściągam wszelkie zmiany z origin/dev
i robię rebase:
git pull --rebase
Następnie wprowadzam zmiany do zdalnego oddziału o tej samej nazwie:
git push origin FixForBug
Teraz istnieje gałąź na serwerze zdalnym i mogę utworzyć żądanie ściągnięcia, aby ta zmiana została zatwierdzona i włączona z powrotem do gałęzi deweloperskiej. Nie zawsze naciskać nic do origin/dev
siebie. Zgaduję, że jest to dość powszechny przepływ pracy.
Za pierwszym razem git push
działa dobrze i tworzy zdalną gałąź. Jeśli jednak wciskam drugi raz (powiedzmy podczas przeglądu kodu, ktoś wskazuje na problem), pojawia się następujący błąd:
błąd: nie udało się przesłać niektórych odnośników do „https://github.limeade.info/Limeade/product.git”.
Wskazówka: aktualizacje zostały odrzucone, ponieważ końcówka Twojej bieżącej gałęzi znajduje się za jej zdalnym odpowiednikiem. Zintegruj zdalne zmiany (np. Wskazówka: „git pull ...”) przed ponownym naciśnięciem.
Zobacz „Uwaga o szybkim przekazywaniu” w „git push --help”, aby uzyskać szczegółowe informacje.
Jeśli jednak zrobię, git status
to mówi, że wyprzedzam o origin/dev
1 zmianę (co ma sens), a jeśli podążę za wskazówką i uruchomię git pull
, mówi, że wszystko jest aktualne. Myślę, że dzieje się tak, ponieważ pcham się do innej gałęzi niż moja gałąź upstream. Mogę rozwiązać ten problem, uruchamiając:
git push -f origin FixForBug
W takim przypadku prześle zmiany do zdalnej gałęzi, mówiąc (wymuszona aktualizacja) i wszystko wydaje się być dobre w zdalnej gałęzi.
Moje pytania:
Dlaczego jest to -f
wymagane w tym scenariuszu? Zwykle, gdy coś wymuszasz , dzieje się tak dlatego, że robiłeś coś złego lub przynajmniej wbrew standardowej praktyce. Czy mogę to zrobić w porządku, czy może to zepsuje coś w zdalnym oddziale lub spowoduje kłopoty dla każdego, kto będzie musiał ostatecznie scalić moje rzeczy w programistę?
git pull origin FixForBug
zanim nacisnę do tego? Ok, to ma sens. Zapraszam do dodania jako odpowiedzi!Odpowiedzi:
W rzeczywistości
-f
jest to wymagane z powodu rebase. Za każdym razem, gdy wykonujesz rebase, będziesz musiał wykonać wymuszenie wypychania, ponieważ zdalna gałąź nie może zostać przewinięta do twojego zatwierdzenia. Można by zawsze chcą mieć pewność, że robisz ciągnąć przed popychanie, ale jeśli nie lubisz siły naciśnięciem do opanowania lub dev dla tej sprawy, można utworzyć nowy oddział do push to i następnie scalić lub dokonać PR .źródło
Aby upewnić się, że lokalny oddział FixForBug nie wyprzedza zdalnej gałęzi FixForBug, ściągnij i scal zmiany przed wypchnięciem.
źródło
the tip of your current branch is behind its remote counterpart
oznacza, że nastąpiły zmiany w zdalnej gałęzi, których nie masz lokalnie. a git mówi, że importujesz nowe zmiany zREMOTE
i łączysz je z kodem, a następniepush
zdalnie.Możesz użyć tego polecenia, aby wymusić zmiany na serwerze za pomocą lokalnego repo ().
ze
-f
znacznikiem można zastąpićRemote Brach code
z kodem.źródło
Jeśli chcesz uniknąć konieczności używania
-f
, możesz użyć po prostuzamiast
Non-rebase pobierze zmiany z
origin/dev
i połączy je z TwojąFixForBug
gałęzią. Wtedy będziesz mógł biegaćbez użycia
-f
.źródło
-f
ponieważ zastępujesz zmiany w głównym repozytorium na inne, które mają inną historię (przeobrażoną). Jeśli miałbyś użyć produktu takiego jak Gerrit , obsługuje on tego rodzaju zmianę bazy przepływu pracy przeglądu kodu bez konieczności używania go-f
podczas wypychania. Używamy Gerrita w pracy w ten sposób i działa to bardzo dobrze.Polecenie, którego użyłem z Azure DevOps, gdy napotkałem komunikat „aktualizacje zostały odrzucone, ponieważ końcówka Twojej bieżącej gałęzi jest za” to / jest to polecenie:
git pull origin master
(lub możesz zacząć od nowego folderu i wykonać klonowanie).
Ta odpowiedź nie odnosi się do zadanego pytania, a konkretnie, Keif odpowiedział na to powyżej, ale odpowiada na tytuł / nagłówek pytania i będzie to typowe pytanie dla użytkowników Azure DevOps.
Zauważyłem komentarz: „Zawsze chciałbyś się upewnić, że pociągniesz przed pchnięciem” w odpowiedzi od Keif powyżej!
Oprócz narzędzia wiersza poleceń Git korzystałem również z narzędzia Git Gui.
(Nie byłem pewien, jak zrobić odpowiednik polecenia wiersza poleceń „git pull origin master” w Git Gui, więc wróciłem do wiersza poleceń, aby to zrobić).
Diagram przedstawiający różne polecenia git dla różnych działań, które możesz chcieć wykonać, jest następujący:
źródło
To właśnie mi się przydarzyło.
Rozwiązanie: ściągnij moją własną gałąź, aby uzyskać dodatkowe zatwierdzenie. Następnie odeślij go z powrotem do mojego zdalnego oddziału.
dosłownie to, co zrobiłem na mojej gałęzi, to:
źródło
W ten sposób rozwiązałem swój problem
Załóżmy, że gałąź upstream to ta, z której rozwidliłeś się, a źródło to twoje repozytorium i chcesz wysłać MR / PR do gałęzi upstream.
Powiedzmy, że masz już około 4 zatwierdzeń i otrzymujesz
Updates were rejected because the tip of your current branch is behind.
Oto co zrobiłem
Najpierw zmiażdż wszystkie 4 zatwierdzenia
Otrzymasz listę zatwierdzeń z
pick
wypisanymi na nich. (otwarty w edytorze)przykład
do
Następnie możesz zapisać swoje połączone zatwierdzenie
Kolejny
Musisz ukryć swoje zobowiązanie
Oto jak
teraz ponownie bazuj na swojej gałęzi upstream
Teraz otwórz ukryty commit
Zatwierdź te zmiany i popchnij je
źródło
To musi być spowodowane tym, że zatwierdzenie wyprzedza twoje obecne pchnięcie.
git pull origin "name of branch you want to push"
git rebase
Jeśli rebase git się powiedzie, to dobrze. W przeciwnym razie wszystkie konflikty dotyczące scalania należy rozwiązać lokalnie i kontynuować, dopóki ponowne bazowanie ze zdalnym nie powiedzie się.
git rebase --continue
źródło
Ustaw nazwę aktualnej gałęzi, taką jak master
Lub rozwinąć nazwę oddziału
źródło
Miałem ten problem, gdy próbowałem wypchnąć po ponownym bazowaniu za pomocą Visual Studio Code, mój problem został rozwiązany przez skopiowanie polecenia z okna wyjściowego git i wykonanie go z okna terminala w Visual Studio Code.
W moim przypadku polecenie wyglądało mniej więcej tak:
git push origin NameOfMyBranch:NameOfMyBranch
źródło
Ja pomogę dalej:
źródło
Musisz dodać nowe pliki do swoich zatwierdzeń, które nie zostały przesłane. Sprawdź plik i wypchnij go ponownie, a spróbuj wyciągnąć / wypchnąć to zadziała. To zadziałało dla mnie ...
źródło