Jak mogę przywrócić repozytorium github do konkretnego zatwierdzenia?

431

Mój github ma teraz 100 zatwierdzeń. Muszę wycofać repozytorium, aby zatwierdzić 80, i usunąć wszystkie kolejne.

Dlaczego? To repo powinno być przeznaczone do łączenia różnych użytkowników. Wiązało się wiele połączeń, jak się ode mnie zgadza, z powodu nadmiernej edycji. Było to spowodowane błędnym oznakowaniem moich odległych gałęzi, w których 3 programistów zostało oznaczonych jako siebie nawzajem. Muszę zresetować do tego punktu, a następnie pociągnąć do przodu.

Chciałem dokonać zmiany bazy, jak w tym przykładzie: Jak mogę usunąć zatwierdzenie w GitHub?

Jednak git chce, żebym dużo zarządzał konfliktami. Czy istnieje prostszy sposób?

Jonathan Vanasco
źródło

Odpowiedzi:

882
git reset --hard <old-commit-id>
git push -f <remote-name> <branch-name>

Uwaga: Jak napisano w komentarzach poniżej, używanie tego jest niebezpieczne w środowisku współpracy: przepisujesz historię

jtdubs
źródło
43
ludzie, róbcie git push -f origin branch. Po prostu miałem zły czas, ponieważ mi tego brakowało.
Sumit M Asok
21
UWAGA! stracisz wszystkie swoje zobowiązania lokalnie, a jeśli będziesz naciskać, nie będzie już odwrotu
Thomas
8
To nie jest prawda, stare zatwierdzenia można uzyskać za pomocą git reflog
Jan Schaefer
27
być może będziesz musiał zrobić git push origin HEAD --forcezamiast tego, git push -f origin branchponieważ dawał mi to error: src refspec branch does not match any.błąd
sprocket12
1
Tak, dziękuję wam. Udało mi się zrobić to, co chciałem. Najpierw stworzyłem oddzielną gałąź od tej, która poprzedza zatwierdzenie, które chciałem wycofać. Sklonował to lokalnie. Następnie zastosowałem twoje zalecenia do tej kopii, w ten sposób nie
naraziłem na
21

Aby cofnąć ostatnie zatwierdzenie, robię to:

Pierwszy:

git log

uzyskaj najnowszy identyfikator SHA do cofnięcia.

git revert SHA

Spowoduje to utworzenie nowego zatwierdzenia, które działa dokładnie przeciwnie do zatwierdzenia. Następnie możesz wcisnąć ten nowy zatwierdzenie, aby doprowadzić aplikację do stanu, w jakim była wcześniej, a historia git odpowiednio pokaże te zmiany.

Jest to dobre w przypadku natychmiastowego ponownego wykonania czegoś, co właśnie popełniłeś, co moim zdaniem jest częstsze.

Jak wspomniał Mike, możesz również to zrobić:

git revert HEAD
Nick Res
źródło
8
git revert HEADcofnie ostatni zatwierdzenie bez konieczności sprawdzania skrótu.
Mike Baranczak
Jest to rozwiązanie, jeśli w ogóle nie chcesz usuwać zatwierdzeń. Jednak w tym przypadku wszystkie zatwierdzenia śmieci nadal będą tam istnieć i umożliwią klonowanie zresetowanie ich lub pobranie z nich. Jeśli chcesz temu zapobiec, będziesz musiał forsować.
cst1992
19

Inny sposób:

Przejdź do gałęzi, którą chcesz przywrócić, a następnie zresetuj lokalną kopię roboczą z powrotem do zatwierdzenia, które chcesz być najnowszym na zdalnym serwerze (wszystko po nim przejdzie do widzenia). Aby to zrobić, w SourceTree kliknąłem prawym przyciskiem myszy i wybrałem „Resetuj BRANCHNAME do tego zatwierdzenia”.

Następnie przejdź do lokalnego katalogu swojego repozytorium i uruchom następującą komendę:

git -c diff.mnemonicprefix=false -c core.quotepath=false push -v -f -- tags REPOSITORY_NAME BRANCHNAME:BRANCHNAME 

Spowoduje to usunięcie wszystkich zatwierdzeń po bieżącym w lokalnym repozytorium, ale tylko dla tego jednego oddziału.

CommaToast
źródło
1
FYI „REPOSITORY_NAME” będzie przypominało https: /[email protected]/me/repo_name.git
tim
3
Przydałoby się złamanie tego polecenia i wyjaśnienie.
cst1992
3

Większość sugestii zakłada, że ​​musisz jakoś zniszczyć 20 ostatnich zatwierdzeń, dlatego oznacza to „przepisywanie historii”, ale nie musisz.

Po prostu utwórz nowy oddział z zatwierdzenia nr 80 i pracuj dalej nad tym oddziałem. Pozostałe 20 zobowiązań pozostanie na starej osieroconej gałęzi.

Jeśli absolutnie chcesz, aby nowy oddział miał tę samą nazwę, pamiętaj, że oddział to w zasadzie tylko etykiety. Po prostu zmień nazwę swojej starej gałęzi na inną, a następnie utwórz nową gałąź przy zatwierdzeniu nr 80 o żądanej nazwie.

Jon Lesan
źródło
Zgaduję, że to również problematycznie miesza się z lokalnymi wersjami historii interesującej nas gałęzi.
ragerdl
2

Kiedy robię aktualizacje gałęzi od mastera, zauważam, że czasami klikam za dużo i powoduję, że gałąź również łączy się z master. Znalazłem sposób, aby to cofnąć.

Jeśli twoje ostatnie zatwierdzenie było fuzją, potrzeba trochę więcej miłości:

git revert -m 1 HEAD

Richard Nader
źródło
1

W github najłatwiej jest usunąć zdalną gałąź w interfejsie użytkownika github, w zakładce gałęzie. Musisz upewnić się, że usuwasz następujące ustawienia, aby gałąź mogła zostać usunięta:

  1. Nie jest domyślną gałęzią
  2. Brak wniosków o otwarcie ankiety.
  3. Oddział nie jest chroniony.

Teraz utwórz go ponownie w lokalnym repozytorium, aby wskazać poprzedni punkt zatwierdzenia. i dodaj go z powrotem do zdalnego repozytorium.

git checkout -b master 734c2b9b   # replace with your commit point

Następnie wypchnij oddział lokalny na zdalny

git push -u origin master

Dodaj z powrotem domyślną ochronę gałęzi i gałęzi itp.

Jianwu Chen
źródło