2015-12-03 12 views
9

przypadkowo prowadził:Jak przywrócić moje zdalne repozytorium git do określonego zatwierdzenia?

git push origin +master 

starając się wcisnąć plik do mojego GitHub repo. To polecenie zresetuje całą historię zatwierdzenia i usunęło kilka plików.

Zastanawiam się, czy istnieje sposób na zresetowanie mojego repo na certain commit having the hash 94b90dc1121ce477131fa60ffdc234591554b6c8.

+1

Nigdy nie wiedziałem o tym modyfikatorze '+ '. Myślę, że push przy użyciu refspec, który powodowałby, że zdalne zatwierdzenia nie będą odwoływane, wymagałby opcji '-f", zanim zostanie zastosowana. –

+0

Możliwy duplikat [Resetowanie lub przywracanie określonego pliku do konkretnej wersji za pomocą Git?] (Http://stackoverflow.com/questions/215718/reset-lub-revert-a-specific-file-to-a-specific- revision-using-git) – ErTR

Odpowiedz

10
git checkout master 
git reset --hard 94b90dc1121ce477131fa60ffdc234591554b6c8 
git push -f origin master 

Oto wyjaśnienie commmands ...

Najpierw upewnij się, że jesteś na gałęzi głównej, więc użyj komendy checkout więc punkty Głowa do opanowania.

Co to jest HEAD? Jest to po prostu wskaźnik, który Git utrzymuje, aby wskazać, gdzie aktualnie znajdujesz się w drzewie Git.

W rzeczywistości większość z tych koncepcji, takich jak HEAD i gałęzie, to tylko wskaźniki do różnych punktów w drzewie. Wykonaj gitk z wiersza poleceń, aby wyświetlić drzewo w ładnym formacie graficznym.

Następnie, pozwólmy, aby reset twój wskaźnik HEAD był dokładnie taki, jak w pierwotnym pytaniu. Dzięki temu pliki w systemie plików będą zgodne z tym zatwierdzeniem.

Należy jednak zachować ostrożność, ponieważ reset --hard ... jeśli masz wyjątkową pracę lub zatwierdzenia, które nie zostały jeszcze przekazane na serwer, może to spowodować, że staną się "nieosiągalne" (pomyśl jeszcze raz o tym drzewie) ... jeśli "stracisz" "zatwierdza z tego polecenia, ale zazwyczaj można je odzyskać, używając reflog.

Na koniec, popchnij lokalny stan swojej gałęzi głównej do gałęzi głównej GitHub. -f jest tam, ponieważ ponownie piszesz historię gałęzi, więc musisz powiedzieć Git, aby "wymusić" ją.

+0

Dziękuję bardzo za pomoc! – user2821370

+0

To jest poprawne rozwiązanie, ale byłoby miło, gdybyś opracował, co robią te polecenia, aby pomóc w zrozumieniu funkcjonalności git. – k0pernikus

3

Odpowiedź Jonathana jest poprawna. Alternatywnym sposobem osiągnięcia tego samego jest:

git push -f origin 94b90dc1121ce477131fa60ffdc234591554b6c8:master 
+0

Czy ten cukier syntaktyczny odpowiada na odpowiedź Jonatana, czy też działa inaczej w obrębie wewnętrznym? – k0pernikus

+0

Niestety, nie wypróbowałem twojej metody, ponieważ Jonathan już pracował, dziękuję bardzo! – user2821370

+1

@ k0pernikus: To głównie cukier syntaktyczny. Jonathan najpierw ustawia swój lokalny "master" na poprawne zatwierdzenie, a następnie wymusza jego przesunięcie do początku/wzorca, podczas gdy ta siła przesyła referencję bezpośrednio do początku/wzorca, bez uprzedniego ustawienia lokalnej gałęzi "master". – xbonez

Powiązane problemy