GitHub - jak przywrócić zmiany do poprzedniego stanu

Używam Githuba jako zdalnego repozytorium.

Wypchnąłem już 5 commitów na serwer i chcę powrócić do stanu sprzed tych commitów.

Jeśli hash commita wynosi 3425661dba2aadccdbab, Jak przywrócić cały lokalny / zdalny commit do tego commita? Próbowałem

$ reset --hard 3425661dba2aadccdbab
Ale to tylko zresetowało moją roboczą głowę do tej gałęzi i wymagało ode mnie ponownego wykonania. Próbowałem kasy, ale to spowodowało, że wylądowałem w gałęzi "odłączonej głowy".
Author: Sebastian Zartner, 2011-08-07

4 answers

Zasadniczo masz dwie opcje cofania zmian:

  1. utwórz nowy commit, który zastosuje odwrotne zmiany. Jest to preferowana opcja, ponieważ nie zmienia historii w publicznym repozytorium
  2. Usuń commity i wypchnij je siłą.

Pierwszą opcję można uzyskać za pomocą git revert

git-revert-przywraca istniejące commity

Biorąc pod uwagę jeden lub więcej istniejących commitów, Przywróć zmiany, które powiązane łaty wprowadź i nagraj kilka nowych commitów, które je rejestrują.

Przykładem może być git revert -n HEAD~5..HEAD. Polecenie to tworzy 5 nowych commitów, z których każdy anuluje jeden z ostatnich 5 commitów aktualnie sprawdzonej gałęzi.

Drugą opcją byłoby usunięcie commitów. Zauważ, że to zmienia historię w repozytorium. Więc każdy, kto już wyciągnął zmiany, prawdopodobnie będzie raczej zaskoczony, a rzeczy mogą się szybko bałagan. To powiedziawszy, możesz zrobić

git reset --hard HEAD~5
git push --force

The pierwsze polecenie usunie wszelkie niezatwierdzone zmiany w bieżącej kopii roboczej. i zresetuj lokalne repozytorium do stanu bieżącego commitów HEAD-5. Drugie polecenie wymusi - push do domyślnego zdalnego (tj. GitHub) tam, wszelkie zmiany odbiegające od bieżącego lokalnego repozytorium są nadpisywane.

Uwaga z ostrzeżeniem: jeśli tak naprawdę nie wiesz, co robisz, nie używaj tej opcji, ponieważ może to prowadzić do utraty danych dla Ciebie lub innych osób, jeśli nie zrobisz tego dobrze. użyj pierwsza opcja zamiast tego, ponieważ będzie w przejrzysty sposób usuwać zmiany, ale bez nieprzyjemnych skutków ubocznych przepisywania historii.

 59
Author: Holger Just,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-12 16:49:57

Do A git push -f. Nie jest to dobry pomysł, jeśli są inne osoby używające tego samego repo.

 3
Author: Chandra Sekar S,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-08-07 08:59:29

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

To jest czysty sposób, jeśli są inni ludzie dzielący się repo, ale trochę uciążliwy. (Możesz jednak zautomatyzować...?)
 2
Author: Sailesh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-08-07 09:05:41

Wykonaj Git checkout, a następnie zatwierdź go do wybranej gałęzi. Spowoduje to utworzenie nowego commita ze starym kodem (więc będziesz miał 6 commitów).

git checkout HEAD~3, gdzie 3 to liczba commitów, do których chcesz powrócić.

Jeszcze lepiej, możesz pobrać pojedynczy plik do obecnej głowy:

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

Zmniejszy to prawdopodobieństwo złości innych ludzi na to, że wyciągniesz przysłowiowy dywan spod ich stóp.

EDIT:

Jest podobny pytanie tutaj:

Sprawdź Stary commit i zrób z niego nowy commit

 2
Author: beatgammit,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:26:04