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ł?

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.


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


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>
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.