Odpowiedzi:
Możesz użyć git revert <commit>…dla wszystkich n zatwierdzeń, a następnie push jak zwykle, zachowując historię bez zmian.
Lub możesz „wycofać” za pomocą git reset --hard HEAD~n. Jeśli pchasz w repozytorium publiczne lub współdzielone, możesz odejść i przerwać pracę innych w oparciu o swoją oryginalną gałąź. Git ci to uniemożliwi, ale możesz użyć, git push -faby wymusić aktualizację.
revertspowoduje, że twoje gałęzie funkcji będą traktowane jako „już” połączone. Dzieje się tak, ponieważ te gałęzie są rzeczywiście łączone. Ale zmiany zostały cofnięte. Rozwiązanie: Cherry-pick lub przywrócić powracają popełnić .
reset --hardrównież, że gałęzie funkcji są traktowane jako już scalone? Moje założenie jest takie, że nie (gdzie revertby).
elmarco ma rację ... jego sugestia jest najlepsza dla repozytoriów współdzielonych / publicznych (lub przynajmniej oddziałów publicznych). Jeśli nie został udostępniony (lub chcesz przeszkadzać innym), możesz również wcisnąć konkretny ref:
git push origin old_master:master
Lub, jeśli istnieje konkretny commit SHA1 (powiedz 1e4f99e w skróconej formie), do którego chcesz wrócić:
git push origin 1e4f99e:master
Na szczęście mogłem użyć rozwiązania Pata Notza, które całkowicie usunęło niechciane zatwierdzenie. Jednak początkowo otrzymałem błąd
error: failed to push some refs to 'ssh://git@gitrepo.git'
To prevent you from losing history, non-fast-forward updates were rejected*
Ale dodanie opcji force ( -f) nadpisuje ten błąd
git push -f origin 52e36b294e:master
Jeśli masz bezpośredni dostęp do zdalnego repozytorium, zawsze możesz użyć:
git reset --soft <sha1>
Działa to, ponieważ nie ma próby modyfikacji nieistniejącego katalogu roboczego. Aby uzyskać więcej informacji, zapoznaj się z oryginalną odpowiedzią:
Jak mogę cofnąć ostatnie zatwierdzenie w repozytorium git bare?
git reset --hard [sha1]gdzie sha1 jest identyfikatorem skrótu zatwierdzenia.