Jak przywrócić gałąź główną do tagu w git?

89

Mamy gałęzie powstające i rozwijające się. Początkowy stan wzorca został oznaczony jako tag_ABC.

Mamy kilka zmian w rozwijającej się gałęzi i zepchnęliśmy do początku. Następnie przypadkowo połączyliśmy rozwój w mistrza i zepchnęliśmy do początku.

Teraz chcielibyśmy przywrócić mistrza do punktu kontrolnego tag_ABC. Jak możemy to zrobić?

Manjunath Manoharan
źródło

Odpowiedzi:

161

Możesz to zrobić

git checkout master
git reset --hard tag_ABC
git push --force origin master

Należy pamiętać, że spowoduje to nadpisanie istniejącej historii w repozytorium nadrzędnym i może spowodować problemy dla innych programistów, którzy wyewidencjonowali to repozytorium.

Paweł Obrok
źródło
5
W ten sposób wszystkie gałęzie zostaną popchnięte z siłą. Możesz spróbowaćgit push --force origin master
danza,
1
Dla porównania, aby powrócić do poprzedniego zatwierdzenia, możesz zrobićgit reset --hard HEAD^
Geoff
1
BTW git reset --hard HEAD^może być używany wiele razy, aby cofnąć się o jedno zatwierdzenie na raz, a jeśli jest zdalny, git push --force origin mastermożna go użyć.
Luke Wenke
Również, aby zresetować główną gałąź lokalnych kopii innych ludzi do użycia wcześniejszej wersji git pulligit reset --hard origin/master
Luke Wenke
Mała rada po tym przywróceniu, może być dla zespołu: wyciągnij z głównej gałęzi !! Dzięki!!
JRichardsz
89

To nie jest bezpośrednia odpowiedź na pytanie, ale ta strona powraca, gdy szukamy sposobów na przywrócenie kodu gałęzi do wydania znacznika.

Innym sposobem jest utworzenie różnicy między aktualnym stanem gałęzi a znacznikiem, do którego chcesz powrócić, a następnie zastosowanie go do gałęzi. Dzięki temu historia wersji jest poprawna i pokazuje zmiany, które mają zostać wprowadzone, a następnie wrócą ponownie.

Zakładając, że twoja gałąź nazywa się master, a tag, do którego chcesz wrócić, nazywa się 1.1.1

git checkout 1.1.1
git diff master > ~/diff.patch
git checkout master
cat ~/diff.patch | git apply
git commit -am 'Rolled back to version 1.1.1'
git push origin master
Jan
źródło
19
Powinna to być akceptowana odpowiedź, ponieważ zachowuje historię w stanie nienaruszonym i nie powoduje problemów dla innych, którzy mają sprawdzone repozytorium.
OpenUserX03
1
Wydaje się to eleganckie. Ale próbowałem przywrócić gałąź qa do poprzedniego tagu i właśnie otrzymałem komunikaty o niepowodzeniu poprawki. $ cat ../diff_qa.patch | git apply <stdin>: 55: końcowe spacje. <stdin>: 336: końcowe białe znaki. <stdin>: 12692: końcowe białe znaki. <stdin>: 12695: końcowe białe znaki. <li> {{$ tag ['rank'] + 1}}: <stdin>: 12706: końcowe spacje. błąd: aktualizacja nie powiodła się: .env.wholo: 1
rickatech
Wypróbowałem kilka rozwiązań, ale żadne z nich nie zadziałało. Ten działał jak urok. Wielkie dzięki @John
Strabek
To jest właściwy sposób. Jest nieniszczący i zachowuje pełną historię
Nitin Bansal
To nie działa dla mnie. Mogę uruchomić pierwsze 3 polecenia bez problemu, ale kiedy to zrobię cat ~/diff.patch | git apply, to mi powie error: unrecognized input. Dowolny pomysł? @NitinBansal może od czasu, gdy ostatnio skomentowałeś?
Experience