Ktoś zaakceptował żądanie ściągnięcia, którego nie powinien. Mamy teraz dołączoną masę uszkodzonego kodu. Jak cofnąć żądanie ściągnięcia? Chciałem tylko cofnąć zmiany w zatwierdzeniu tuż przed scaleniem, ale zauważyłem, że scalił się w kilka zatwierdzeń. Więc teraz są wszystkie te zobowiązania tej osoby z dni przed połączeniem. Jak to cofnąć?
git
github
merge
pull-request
Będzie
źródło
źródło
Odpowiedzi:
Jest lepsza odpowiedź na ten problem, chociaż mógłbym po prostu rozłożyć to krok po kroku.
Będziesz musiał pobrać i sprawdzić najnowsze zmiany, takie jak na przykład:
Patrząc na dziennik zatwierdzeń, powinieneś znaleźć coś podobnego do tego:
Teraz chcesz cofnąć całe żądanie ściągnięcia z możliwością późniejszego cofnięcia. Aby to zrobić, będziesz musiał wziąć identyfikator zatwierdzenia scalenia .
W powyższym przykładzie zatwierdzenie scalające znajduje się na górze, gdzie jest napisane „Scalone żądanie ściągnięcia nr 123 ...” .
Zrób to, aby cofnąć obie zmiany ( „Dodaj pasek” i „Dodaj foo” ), a skończysz w jednym zatwierdzeniu, przywracając całe żądanie ściągnięcia, które możesz później cofnąć i zachować czystą historię zmian:
źródło
git checkout upstream/master -b revert/john/foo_and_bar
? co to dokładnie robi?Spójrz na swój wykres zatwierdzenia (z gitk lub podobnym programem). Zobaczysz zatwierdzenia z żądania ściągnięcia i zobaczysz własne zatwierdzenia i zatwierdzenie scalające (jeśli nie było to szybkie scalanie do przodu). Musisz tylko znaleźć ostatnie własne zatwierdzenia przed scaleniem i zresetować gałąź do tego zatwierdzenia.
(Jeśli masz reflog gałęzi, znalezienie zatwierdzenia przed scaleniem powinno być jeszcze łatwiejsze).
(Edytuj po więcej informacji w komentarzach :)
OK, spójrzmy na wykres:
Zakładam, że ostatnim (najbardziej po prawej) zatwierdzeniem było twoje złe połączenie przez pull request , które połączyło niebieską linię widoczną tutaj. Twoim ostatnim dobrym zatwierdzeniem byłoby to, co wcześniej na czarnej linii, tutaj zaznaczone na czerwono:
Zresetuj do tego zatwierdzenia i powinno być dobrze.
Oznacza to, że w swojej lokalnej kopii roboczej zrób to (po upewnieniu się, że nie masz więcej niezaangażowanych rzeczy, na przykład przez git stash):
Teraz potwierdź, że naprawdę jesteś na zatwierdzeniu, które tam zaznaczyłem, a nie zobaczysz żadnego z wyciągniętych rzeczy w jego przodkach.
(jeśli nazwany jest twój pilot github
origin
- w przeciwnym razie zmień nazwę).Teraz też wszystko powinno wyglądać dobrze na githubie. Zatwierdzenia nadal będą w twoim repozytorium, ale nie będą dostępne dla żadnej gałęzi, więc nie powinny tam wyrządzić żadnej szkody. (I oczywiście nadal będą w repozytorium RogerPaladin).
(Może istnieć specyficzny dla serwisu Github sposób na zrobienie tego samego, ale nie jestem zbyt zaznajomiony z Githubem i jego systemem zarządzania żądaniami ściągnięcia).
Zauważ, że jeśli ktoś inny mógł już wyciągnąć twojego mastera z niewłaściwym zatwierdzeniem, wtedy ma ten sam problem, co obecnie i nie może tak naprawdę wnieść wkładu. przed zresetowaniem do nowej wersji głównej.
Jeśli jest prawdopodobne, że tak się stało, lub po prostu chcesz uniknąć problemów, użyj
git revert
polecenia zamiastgit reset
, aby cofnąć zmiany nowym zatwierdzeniem, zamiast przywracać starsze. (Niektórzy uważają, że nigdy nie powinieneś resetować z opublikowanymi gałęziami.) Zobacz inne odpowiedzi na to pytanie, jak to zrobić.Na przyszłość:
Jeśli chcesz tylko niektórych zatwierdzeń gałęzi RogerPaladin, rozważ użycie
cherry-pick
zamiastmerge
. Lub skontaktuj się z RogerPaladin, aby przenieść je do oddzielnej gałęzi i wysłać nowe żądanie ściągnięcia.źródło
reset --hard
a nacisk jest siła bardzo zła praktyka) .Odpowiedź @errordeveloper poniżej pokazuje sposób na zrobienie tego bez przepisywania historii lub forsowania na siłę.Jeśli szarpnięcie było ostatnią rzeczą, jaką wtedy zrobił
źródło
git reset --hard HEAD~1
użyłemgit push origin -f
zaktualizować zdalnego repozytorium. Ale bądź ostrożny, zachowaj ostrożność, zanim to zrobisz.Od 24 czerwca 2014 r. Możesz łatwo anulować żądanie ściągnięcia (zobacz „ Cofanie żądania ściągnięcia ”) za pomocą:
Przedstawiamy przycisk Cofnij
Pozostaje jednak do przetestowania, czy to przywracanie używa,
-m
czy nie (również w przypadku przywracania połączeń)Ale Adil H Raza dodaje w komentarzach (grudzień 2019):
Ostrzeżenie : Korayem zwraca uwagę w komentarzach, że:
Korayem odsyła nas do „ Github: zmiany ignorowane po przywróceniu (
git cherry-pick
,git rebase
) ” po więcej.źródło
Aby cofnąć żądanie ściągnięcia z Github z zatwierdzeniami, których nie chcesz usuwać, musisz uruchomić:
git reset --hard --merge <commit hash>
z hashem zatwierdzenia będącym zatwierdzeniem przed scaleniem żądania ściągnięcia. Spowoduje to usunięcie wszystkich zatwierdzeń z żądania ściągnięcia bez wpływu na jakiekolwiek zatwierdzenia w historii.
Dobrym sposobem na znalezienie tego jest przejście do teraz zamkniętego żądania ściągnięcia i znalezienie tego pola:
Obraz żądania ściągnięcia
Po uruchomieniu
git reset
uruchom:git push origin --force <branch name>
Powinno to przywrócić gałąź z powrotem przed żądaniem ściągnięcia BEZ wpływu na jakiekolwiek zatwierdzenia w gałęzi, które są zasypywane w historii zatwierdzeń między zatwierdzeniami z żądania ściągnięcia.
EDYTOWAĆ:
Jeśli klikniesz przycisk przywracania w żądaniu ściągnięcia, spowoduje to utworzenie dodatkowego zatwierdzenia w gałęzi. NIE cofa zobowiązań ani nie rozłącza. Oznacza to, że w przypadku naciśnięcia przycisku przywracania nie można otworzyć nowego żądania ściągnięcia, aby ponownie dodać cały ten kod.
źródło
Korzystam z tego miejsca cały czas, dzięki.
Szukałem, jak cofnąć żądanie ściągnięcia i dotarłem tutaj.
Miałem właśnie
git reset --hard
„dawno temu” i szybko cofnąć się do miejsca, w którym byłem przed wykonaniem polecenia ściągnięcia.Oprócz szukania tutaj, zapytałem również mojego współpracownika, co zrobi, i miał zazwyczaj dobrą odpowiedź: korzystając z przykładowego wyjścia w pierwszej odpowiedzi powyżej:
Podobnie jak w przypadku większości rzeczy w Git, jeśli robisz to w sposób, który nie jest łatwy, prawdopodobnie robisz to źle.
źródło