2011-08-07 6 views
36

Używam GitHub jako mojego zdalnego repozytorium.GitHub - Jak przywrócić zmiany do poprzedniego stanu?

Pchnąłem już 5 zatwierdzeń na serwer i chcę przywrócić stan przed ich zatwierdzeniem.

Jeśli wartość skrótu zatwierdzenia to 3425661dba2aadccdbab, w jaki sposób mogę przywrócić całe lokalne/zdalne z powrotem do tego zatwierdzenia? Próbowałem

$ reset --hard 3425661dba2aadccdbab 

ale tylko resetują głowę pracy do tego oddziału i wymaga mi zrobić git pull ponownie. Próbowałem kasie, ale to spowodowało, że wylądowałem w gałęzi "odłączonej głowy".

+0

Czy to wymaga tagu github? Wygląda na to, że nie jest specyficzny dla github. – Nick

Odpowiedz

57

Zasadniczo są dwie opcje, aby cofnąć zmiany:

  1. utworzyć nowy popełnić których stosuje się odwrotne zmian. Jest to preferowana opcja, ponieważ nie zmienia historii w publicznym repozytorium.
  2. Usuń zatwierdzenia i wymuś je.

Pierwsza opcja może zostać osiągnięty za pomocą git revert

git-Przywróć - Przywróć niektóre istniejące zobowiązuje

dla jednej lub więcej istniejących zobowiązuje, cofnąć zmiany, które powiązane łaty przedstawić i nagrać kilka nowych zatwierdzeń, które je nagrywają.

Przykładem może być git revert -n HEAD~5..HEAD. To polecenie tworzy 5 nowych zatwierdzeń, z których każdy cofa jedno z ostatnich 5 zatwierdzeń aktualnie wyrejestrowanego oddziału.

Drugą opcją byłoby faktycznie usunięcie zatwierdzeń. Zauważ, że zmienia to historię w repozytorium. Tak więc każdy, kto już wprowadził zmiany, prawdopodobnie będzie raczej zaskoczony, a rzeczy mogą się szybko upaść.Powiedział, że możesz zrobić

git reset --hard HEAD~5 
git push --force 
Pierwsze polecenie wyczyści wszelkie niezatwierdzone zmiany w bieżącej kopii roboczej. i zresetuj lokalne repozytorium do stanu bieżących ostrzeżeń HEAD - 5. Drugie polecenie wymusi wypchnięcie do domyślnego pilota (tj. GitHub). Tam wszelkie zmiany odbiegające od bieżącego lokalnego repozytorium zostaną nadpisane.

Notatka z ostrzeżeniem: jeśli nie wiesz, co robisz, nie korzystaj z tej opcji, ponieważ może to prowadzić do utraty danych przez Ciebie lub innych, jeśli nie zostanie wykonana prawidłowo. Zamiast tego użyj pierwszej opcji, ponieważ spowoduje to usunięcie zmian w przejrzysty sposób, ale bez nieprzyjemnych skutków ubocznych przepisywania historii.

+0

Czy możesz wyjaśnić, co robi HEAD ~ 5..HEAD? –

+2

@RutgerHofste Opisał zakres zatwierdzeń między 'HEAD' (to znaczy obecnie zatwierdzanie kas) i 5 zatwierdzeń przed' HEAD'. Zwrot 'git revert' spowodowałby zatem cofnięcie zatwierdzenia dla ostatnich 5 zatwierdzeń. Podobnie polecenie 'git reset' spowodowałoby przeniesienie aktualnej gałęzi 5. Zobacz [ten post na blogu] (http://www.paulboxley.com/blog/2011/06/git-caret-and-tilde), aby uzyskać dobre wyjaśnienie, w jaki sposób określać relatywne zatwierdzenia dla poleceń. –

3

Wykonaj git push -f. Nie jest to dobry pomysł, jeśli są inne osoby korzystające z tego samego repo.

+0

Uważam, że OP ma innych ludzi używających tego samego repo –

+0

Git również go odbije, zanim popchniesz, co sprawi, że będą jeszcze bardziej szaleni. =) – tjameson

+0

Czy można wymusić wypychanie tylko do określonej gałęzi? – cynistersix

2

Wykonaj zamówienie git, a następnie przekaż je do wybranej gałęzi. Spowoduje to nowe zatwierdzenie ze starym kodem (więc będziesz mieć 6 zatwierdzeń).

git checkout HEAD~3, gdzie 3 to liczba kopii, które chcesz przywrócić.

Jeszcze lepiej, można kasie pojedynczy plik do obecnego Głowa:

git checkout 3425661dba2aadccdbab:path/to/file/from/base

To zmniejszy prawdopodobieństwo podejmowania inni na ciebie zły ciągnąc przysłowiowy dywan spod ich stóp.

EDIT:

Jest podobne pytanie tutaj:

Checkout old commit and make it a new commit

+0

hmmm, ale jak powiedział OP, jeśli checkout git, on kończy się w gałęzi "odłączony głowy". mam to również przedtem;) –

2

Możesz zrobić git revert <commit> dla wszystkich zatwierdzeń, które zostały wykonane po Twoim wymaganym stanie. (W odwrotnej kolejności, aby uniknąć konfliktów.)

To jest czysty sposób, jeśli istnieją inne osoby, które dzielą się repo, ale trochę wysiłku. (Możesz zautomatyzować chociaż ...?)