Powrót do starego commita Git w publicznym repo

Jak mogę wrócić do konkretnego commita w git?

Najlepszą odpowiedzią, jaką ktoś mógł mi dać, było użycie git revert x razy, aż osiągnę pożądany commit.

Powiedzmy, że chcę wrócić do commita, który ma 20 commitów, musiałbym go uruchomić 20 razy.

Czy jest na to łatwiejszy sposób?

Nie mogę użyć reset, ponieważ to repozytorium jest publiczne.

Author: David, 2010-01-05

8 answers

Spróbuj tego:

git checkout [revision] .

Gdzie [revision] jest skrótem zatwierdzania (na przykład: 12345678901234567890123456789012345678ab).

Nie zapomnij . na końcu, bardzo ważne. Spowoduje to wprowadzenie zmian do całego drzewa. Powinieneś wykonać to polecenie w katalogu głównym projektu git. Jeśli znajdujesz się w podkatalogu, to polecenie to zmienia tylko pliki w bieżącym katalogu. Więc zaangażuj się i powinieneś być dobry.

Możesz to cofnąć przez

git reset --hard 

Które usunie wszystkie modyfikacje z katalogu roboczego i miejsce postoju.

 926
Author: Alex Reisner,
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
2018-08-19 08:32:39

Aby wycofać się do określonego commita:

git reset --hard commit_sha

To rollback 10 commits back:

git reset --hard HEAD~10

Możesz użyć "git revert" jak w poniższym poście, jeśli nie chcesz przepisywać historii

Jak przywrócić repozytorium Git do poprzedniego commita?

 159
Author: Naga Kiran,
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 11:47:31

Pytanie brzmi, co masz na myśli mówiąc "cofnij się"? Jeśli nie możesz reset, ponieważ jest publiczny i chcesz zachować historię zmian nienaruszoną, masz na myśli, że chcesz, aby Twoja robocza Kopia odzwierciedlała konkretny commit? Użyj git checkout i skrótu commit.

Edit: jak wspomniano w komentarzach, użycie git checkout bez podania gałęzi pozostawi cię w stanie "bez gałęzi". Użyj {[3] } do realizacji transakcji w oddziale lub git checkout <commit> . do realizacji transakcji w bieżącym oddziale.

 76
Author: Ben,
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
2010-01-05 17:26:45

Oryginalny plakat mówi:

Najlepszą odpowiedzią, jaką ktoś mógł mi dać, było użycie git revert X razy, aż osiągnąć żądany commit.

Powiedzmy więc, że chcę powrócić do commita, który ma 20 commitów, żeby uruchomić go 20 razy.

Czy jest na to łatwiejszy sposób?

Nie mogę użyć resetu, ponieważ repo jest publiczne.

Nie trzeba używać git revert x razy. git revert może przyjąć zakres commit jako argument, więc wystarczy użyć go tylko raz, aby przywrócić zakres / align = "left" / na przykład, jeśli chcesz przywrócić ostatnie 20 commitów:

git revert --no-edit HEAD~20..

Zakres commitów HEAD~20.. jest skrótem od HEAD~20..HEAD i oznacza "zacznij od 20th rodzica głównego commita i przywróć wszystkie commity po nim do HEAD".

Który przywróci ostatnie 20 commitów, zakładając, że żaden z nich nie jest scalony / align = "left" / jeśli są commity scalające, to nie można ich wszystkich przywrócić w jedno polecenie, musisz je przywrócić pojedynczo za pomocą

git revert -m 1 <merge-commit>

Zauważ również, że testowałem używając zakresu z git revert używając git w wersji 1.9.0. jeśli używasz starszej wersji Gita, użycie zakresu z git revert może, ale nie musi działać.

git revert Jest Lepszy Niż git checkout

Zauważ, że w przeciwieństwie do tej odpowiedzi, która mówi, aby używać git checkout, git revert usunie pliki, które zostały dodane do commitów odwracanie , co sprawia, że jest to prawidłowy sposób na przywrócenie zakresu zmian.

Dokumentacja

 36
Author: Community,
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 11:55:01

Krok 1: Pobierz listę commitów:

git log

Otrzymasz listę jak w tym przykładzie:

[Comp:Folder User$ git log
commit 54b11d42e12dc6e9f070a8b5095a4492216d5320
Author: author <[email protected]>
Date:   Fri Jul 8 23:42:22 2016 +0300

This is last commit message

commit fd6cb176297acca4dbc69d15d6b7f78a2463482f
Author: author <[email protected]>
Date:   Fri Jun 24 20:20:24 2016 +0300

This is previous commit message

commit ab0de062136da650ffc27cfb57febac8efb84b8d
Author: author <[email protected]>
Date:   Thu Jun 23 00:41:55 2016 +0300

This is previous previous commit message
...

Krok 2: skopiuj potrzebny hash zatwierdzania i wklej go do kasy:

git checkout fd6cb176297acca4dbc69d15d6b7f78a2463482f

To wszystko.

 20
Author: Igor,
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
2016-12-22 11:12:36
git read-tree -um @ $commit_to_revert_to
Zrobię to. Jest to "Git checkout", ale bez aktualizacji HEAD.

Możesz osiągnąć ten sam efekt z

git checkout $commit_to_revert_to
git reset --soft @{1}

Jeśli preferujesz łączenie komend wygody.

Pozostawiają cię z Twoim drzewem roboczym i indeksem w pożądanym stanie, możesz po prostu git commit zakończyć.

 8
Author: jthill,
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
2016-02-06 20:14:32

Nie jestem pewien, co się zmieniło, ale nie jestem w stanie sprawdzić konkretnego commita bez opcji --detach. Pełna Komenda, która mi się sprawdziła, to: git checkout --detach [commit hash]

Aby wrócić ze stanu wolnego musiałem sprawdzić mój lokalny oddział: git checkout master

 1
Author: ken,
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-02-22 11:59:02

Powiedzmy, że pracujesz nad projektem i po jakimś dniu. Zauważysz, że jedna funkcja nadal daje błędy. Ale nie wiesz, jaką zmianę wprowadziłeś, która spowodowała błąd. Więc musisz łowić poprzednie robocze commity. Aby przywrócić konkretny commit:

git checkout 8a0fe5191b7dfc6a81833bfb61220d7204e6b0a9 .

Ok, więc ten commit działa dla Ciebie. Koniec z błędami. Zidentyfikowałeś problem. Teraz możesz wrócić do najnowszego commita:

git checkout 792d9294f652d753514dc2033a04d742decb82a5 .

I sprawdzić konkretny plik, zanim spowodował błąd (w moim przypadku używam przykład Gemfile."lock"): {]}

git checkout 8a0fe5191b7dfc6a81833bfb61220d7204e6b0a9 -- /projects/myproject/Gemfile.lock

I jest to jeden ze sposobów radzenia sobie z błędami utworzonymi w commitach, nie zdając sobie sprawy z błędów dopiero później.

 0
Author: Donato,
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
2018-09-21 21:03:52