Wycofywanie zdalnego repozytorium Git


111

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

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


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 są 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

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://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

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?


2
Dlaczego miałoby to --softbyć konieczne? Prawdopodobnie mógłbyś zrobić to samo z prostym git reset, bez flagi trybu.
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.