Jak usunąć ostatnie n zatwierdzeń na Github i lokalnie?

127

Próbuję usunąć ostatnie 2 zatwierdzenia z jednego z moich repozytoriów GitHub. Próbowałem jak sugeruje tutaj : git push -f origin HEAD^^:master. Wygląda na to, że działa, ponieważ ostatnie dwa zatwierdzenia są usuwane.

Następnie usunąłem je z mojego lokalnego repozytorium za pomocą git rebase -i HEAD~2. Usuwam wiersze związane z tymi zatwierdzeniami i sprawdzam git log, czy zostały poprawnie usunięte.

Następnie dokonuję pewnych zmian w moim lokalnym repozytorium, wykonuję nowe zatwierdzenie i wypycham do GitHub. Problem polega na tym, że na swoim koncie GitHub mam dwa poprzednie zatwierdzenia, które próbowałem usunąć.

Myślę, że problem tkwi w moim lokalnym repozytorium, ponieważ jeśli sklonuję moje repozytorium Github do mojego lokalnego i wprowadzę tutaj pewne zmiany, kiedy wypchnę nowe zatwierdzenie, te stare zatwierdzenia nie zostaną przesłane do GitHub.

Dowolny pomysł?

Ivan Fernandez
źródło

Odpowiedzi:

199

Aby usunąć ostatnie dwa zatwierdzenia lokalnie, sugerowałbym użycie:

git reset --hard HEAD^^

Rebase to zupełnie inna operacja, która ci tutaj nie pomoże.

KL-7
źródło
23
Jeśli już wprowadziłeś tę zmianę do zdalnego repozytorium. Możesz go usunąć za pomocą git push -f
Ivan Fernandez
Czy możesz to uogólnić dla ostatnich n liczby zatwierdzeń?
user_19
6
@ user_19 możesz robić takie rzeczy jak git reset --hard HEAD^4lub git reset --hard HEAD~4. Chociaż sytuacja może się nieco skomplikować, jeśli twoja historia zawiera fuzje. Więcej informacji na temat określania wersji można znaleźć w odpowiedniej sekcji tutaj .
KL-7
2
Gdybym chciał usunąć ostatnie 7 zatwierdzeń, to ?? Czy muszę wstawiać 7 razy ^ po HEAD ... proszę oczyść mnie
Gagan Gami,
4
@GaganGami, myślę, że byś zrobił git reset --hard HEAD~7, ale popraw mnie, jeśli się mylę.
Con Antonakos
105

Jeśli chcesz usunąć 2 (dwa) ostatnie zatwierdzenia, jest do tego prosta komenda:

git reset --hard HEAD~2

Możesz zmienić 2dowolną liczbę ostatnich zatwierdzeń, które chcesz usunąć.

Aby przenieść tę zmianę na zdalną, musisz zrobić git pushz parametrem force ( -f):

git push -f

Jednak nie polecam wykonywania żadnych gitpoleceń -fani --hardopcji związanych z nimi, jeśli po tych zatwierdzeniach są nowe zatwierdzenia na zdalnym (Github) , które chcesz usunąć. W takim przypadku zawsze używaj .git revert

Dherik
źródło
Czy wprowadzone przeze mnie zmiany pozostają?
Zuhayer Tahir
@SymfonyUser, no. Kiedy wydałeś hardpolecenie, tracisz te dwa zatwierdzenia. Jeśli chcesz zapisać zmiany, utwórz diffplik tych zatwierdzeń przed zastosowaniem resetu.
Dherik
3
@ZuhayerTahir jeśli chcesz po prostu cofnąć popełnienie w ciągu ostatnich 5 zobowiązuje potem po prostu zrobić git reset HEAD~5(nie używać hard). W ten sposób otrzymasz zmiany w stanie etapowym (tj. Niezatwierdzone). Dla mnie zobacz tę odpowiedź .
Miód
@ Kochanie Dziękuję za twoją odpowiedź. Doszedłem do tego samego wniosku.
Zuhayer Tahir
29

Poniższe działa dla mnie

git reset HEAD~n

Usuwa ostatnie nzatwierdzenia z lokalnego repozytorium, ponieważ HEAD^usuwa tylko jedno. Jeśli chcesz usunąć te zmiany ze zdalnego, może być konieczne wymuszenie wypychania, ponieważ będziesz za zdalnym.

git push -f origin <branch>
Sial01
źródło