Chcę odrzucić wszystkie zmiany wprowadzone po zatwierdzeniu <commit-hash>
. Więc zrobiłem:
git reset --hard <commit-hash>
Teraz chcę zrobić to samo z moim pilotem. W jaki sposób mogę to zrobić? Później wykonałem kilka zatwierdzeń (i wypycham) <commit-hash>
i chcę je wszystkie odrzucić. Jest po prostu coś poszło strasznie źle w drodze i nie chcę, aby to gorzej niż już jest. ; (
Zasadniczo chcę, aby przewinąć mój origin/master
TO<commit-hash>
origin/master
nie zostałeś pociągnięty i zepchnięty przez innych użytkowników? Zawsze należy unikać zmiany historii publicznego (tj. Nielokalnego) repozytorium.Odpowiedzi:
Zakładając, że twoja gałąź jest wywoływana
master
zarówno tutaj, jak i zdalnie, a twój pilot jest nazywany,origin
możesz:Należy jednak tego unikać, jeśli ktoś inny pracuje ze zdalnym repozytorium i wyciągnął zmiany. W takim przypadku lepiej cofnąć niepotrzebne zatwierdzenia, a następnie wcisnąć jak zwykle.
Aktualizacja: wyjaśniłeś poniżej, że inne osoby wyciągnęły zmiany, które wprowadziłeś, więc lepiej utworzyć nowe zatwierdzenie, które cofnie wszystkie te zmiany . W tej odpowiedzi Jakuba Narębskiego jest dobre wyjaśnienie twoich możliwości zrobienia tego . To, który z nich jest najwygodniejszy, zależy od liczby zmian, które chcesz przywrócić, i która metoda jest dla Ciebie najbardziej sensowna.
Ponieważ z twojego pytania jasno wynika, że
git reset --hard
zresetowałeś już swójmaster
oddział, być może będziesz musiał zacząć odgit reset --hard ORIG_HEAD
przeniesienia swojego oddziału z powrotem do poprzedniego miejsca. (Jak zawszegit reset --hard
, upewnij się, żegit status
jest czysty, że jesteś na właściwej gałęzi i że znasz sięgit reflog
jako narzędzie do odzyskiwania pozornie utraconych zatwierdzeń.) Powinieneś również sprawdzić, czyORIG_HEAD
wskazuje to na prawidłowe zatwierdzenie, za pomocągit show ORIG_HEAD
.Rozwiązywanie problemów:
Jeśli pojawi się komunikat „ ! [Zdalne odrzucenie] a60f7d85 -> master (odrzucony hak wstępny) ”
musisz zezwolić na przepisywanie historii gałęzi dla określonej gałęzi. Na przykład w BitBucket napisano: „Ponowne zapisywanie historii oddziału jest niedozwolone”. Jest pole wyboru o nazwie,
Allow rewriting branch history
które musisz zaznaczyć.źródło
git update-ref
zamiastreset --hard
; pozwoli ci to zrobić bez posiadania działającego drzewa / sprawdzonej gałęzirevert
ale powiedzmy, że chcę cofnąć poprzednie 4 zatwierdzenia, więc powinienem to zrobić,git revert comit1; git push; git revert comit2; git push; ...
czy po prostugit revert commit4; git push
?git revert commit4
tworzy nowe zatwierdzenie, które tylko cofa wprowadzone zmianycommit4
. Jednak w odpowiedzi, na którą wskazałem, można połączyć je w jeden zatwierdzenie.git reset --hard
ale usunąłem plik lokalny i ponownie wyciągnąłem z pochodzenia, więc mogęgit revert ...
teraz zrobić. Mam teraz wątpliwości: czy muszę cofać każdy zatwierdzenie i wypychać (jeden po drugim), czy po prostu wycofać pierwszy zatwierdzenie po prawda tylko zatwierdzić?.git
katalog refami, których nie chcieli stworzyć. Myliłem się twierdząc, że nie ma kontroli bezpieczeństwa. Możesz znaleźć klasyfikację do poleceń „hydraulika” i „porcelana” na stronie git man .Użyj innych odpowiedzi, jeśli nie masz nic przeciwko utracie lokalnych zmian. Ta metoda nadal może zniszczyć pilota, jeśli wybierzesz niewłaściwy skrót zatwierdzenia, do którego chcesz wrócić.
Jeśli chcesz, aby zdalne dopasowanie było zatwierdzeniem, które jest w dowolnym miejscu w lokalnym repozytorium:
git log
aby znaleźć zatwierdzenie, do którego chcesz mieć pilota.git log -p
aby zobaczyć zmiany lubgit log --graph --all --oneline --decorate
zobaczyć zwarte drzewo.Uruchom polecenie takie jak:
na przykład
lub
Korzystam z wygodnego aliasu (
git go
) do przeglądania historii, jak w kroku 2, który można dodać w następujący sposób:źródło
git config --global alias.graph 'log --graph --all --decorate --oneline'
jest mniej niechlujny i nadal można go ograniczyć, np .:git graph -5
q
aby zamknąć dziennik git. 2 minuty, nigdy nie wrócę.less
iq
jest normalnym sposobem na jego wyjście. Git Bash jest jak terminal * nix.Rozwiązałem problem podobny do twojego za pomocą następujących poleceń:
źródło
Na GitLab może być konieczne ustawienie oddziału jako niezabezpieczonego przed wykonaniem tego. Możesz to zrobić w [repo]> Ustawienia> Repozytorium> Chronione gałęzie. Następnie działa metoda z odpowiedzi Marka.
źródło
Jeśli chcesz poprzednią wersję pliku, polecam korzystanie z usługi git checkout.
W ten sposób cofniesz się w czasie, nie wpłynie to na bieżący stan twojego projektu, możesz przejść do głównej linii głównej git Checkout głównej
ale kiedy dodajesz plik w argumencie, plik ten jest przywracany z poprzedniego czasu do bieżącego czasu projektu, tzn. twój bieżący projekt jest zmieniany i musi zostać zatwierdzony.
Zaletą tego jest to, że nie usuwa historii ani nie przywraca określonych zmian kodu (git revert)
Sprawdź więcej tutaj https://www.atlassian.com/git/tutorials/undoing-changes#git-checkout
źródło
Moje dwa centy do poprzednich odpowiedzi: jeśli
nadal nie działa, możesz edytować
<your-remote-repo>.git/config
sekcję odbioru pliku:źródło
Jeśli twoja gałąź nie jest programistyczna ani produkcyjna, najprostszym sposobem na osiągnięcie tego jest zresetowanie do określonego zatwierdzenia lokalnie i utworzenie z niego nowej gałęzi. Możesz użyć:
Git Checkout 000000
(gdzie 000000 to identyfikator zatwierdzenia, do którego chcesz przejść) w problematycznej gałęzi, a następnie po prostu utwórz nową gałąź:
git remote add [nazwa_zdjecia]
Następnie możesz utworzyć nowy PR i wszystko będzie działać dobrze!
źródło
Zrób jedną rzecz, uzyskaj numer SHA zatwierdzenia. takich jak 87c9808, a następnie
git push --force origin master
źródło
Sourcetree: resetowanie pilota do określonego zatwierdzenia
Wciśnij to zatwierdzenie do nowego początku / funkcji / 1337_MyAwesomeFeature
Twój lokalny oddział funkcji i twój zdalny oddział funkcji są teraz na poprzednim (wybranym przez Ciebie) zatwierdzeniu
źródło