Wycofywanie zdalnego repozytorium Git

111

Mam zdalne repozytorium Git i muszę cofnąć ostatnie nzatwierdzenia do zimnego zapomnienia.

Jake
źródło

Odpowiedzi:

135

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ę.

elmarco
źródło
5
Możesz cofnąć się do konkretnego zatwierdzenia, używając: git reset --hard [sha1]gdzie sha1 jest identyfikatorem skrótu zatwierdzenia.
pisaruk
7
Nie można użyć get reset --hard w zdalnym repozytorium, ponieważ nie ma katalogu roboczego. Oryginalne pytanie mówi tylko, że istnieje zdalne repozytorium, nie ma wzmianki o lokalnym repozytorium.
Hazok
2
uwaga, git push -f wymusi wypychanie wszystkich lokalnych oddziałów do ich pilotów
cowlinator
Pamiętaj, że użycie revertspowoduje, że twoje gałęzie funkcji będą traktowane jako „już” połączone. Dzieje się tak, ponieważ te gałęzie rzeczywiście łączone. Ale zmiany zostały cofnięte. Rozwiązanie: Cherry-pick lub przywrócić powracają popełnić .
Benedikt,
@Benedikt czy powoduje to reset --hardrównież, że gałęzie funkcji są traktowane jako już scalone? Moje założenie jest takie, że nie (gdzie revertby).
Marcus Leon,
37

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
Pat Notz
źródło
9

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://[email protected]'
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
geedoubleya
źródło
3

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?

Hazok
źródło
2
Dlaczego miałoby to --softbyć konieczne? Prawdopodobnie mógłbyś zrobić to samo z prostym git reset, bez flagi trybu.