Usuń zatwierdzenia z oddziału w Git

3230

Chciałbym wiedzieć, jak usunąć zatwierdzenie.

Przez delete, mam na myśli to tak jakby nie sprawiają, że zobowiązują się, a kiedy zrobić push w przyszłości, moje zmiany nie będą naciskać na pilocie zdalnego oddziału.

Czytam git help i myślę, że powinienem użyć tego polecenia git reset --hard HEAD. Czy to jest poprawne?

hap497
źródło
41
Myślę, że nie jest to duplikat Git cofnij ostatnie zatwierdzenie, ponieważ pyta, jak usunąć dowolny zatwierdzenie z gałęzi. Myślę też, że żadna z odpowiedzi nie dotyczy tego pytania. Wszystkie przewijają ostatnie zatwierdzenia, cherry-picka nie deletepojedyncze zatwierdzenie, które może nastąpić jakiś czas temu.
Chris
12
@Chris, odpowiedź z git rebase -i HEAD~10zawiera odpowiedź na pytanie, ponieważ pozwala ci dowolnie wybierać zatwierdzenia do usunięcia. Git stosuje zatwierdzenia w zakresie, który określisz jeden po drugim, ignorując zatwierdzenia usunięte z dziennika. Użyłem tego polecenia dzisiaj, aby pozbyć się drugiego i trzeciego ostatniego zatwierdzenia mojego repozytorium, zachowując najwyższy. Zgadzam się, że żadna z pozostałych odpowiedzi nie jest zadowalająca.
MST
@MST tak, powinienem powiedzieć, że żadna z opcji w zaakceptowanej odpowiedzi nie dotyczy tego pytania, ale masz całkowitą rację - to polecenie wydaje się działać
Chris

Odpowiedzi:

4123

Ostrożnie: git reset --hard USUNIĘCIE ZMIANY W KATALOGU PRACY . Przed uruchomieniem tego polecenia pamiętaj o ukryciu wszelkich zmian lokalnych, które chcesz zachować .

Zakładając, że siedzisz na tym zatwierdzeniu, to polecenie go zwali ...

git reset --hard HEAD~1

W HEAD~1oznacza popełnić zanim głowę.

Możesz też spojrzeć na dane wyjściowe git log, znaleźć identyfikator zatwierdzenia zatwierdzenia, dla którego chcesz utworzyć kopię zapasową, a następnie wykonaj następujące czynności:

git reset --hard <sha1-commit-id>

Jeśli już go nacisnąłeś, będziesz musiał użyć siły, aby się go pozbyć ...

git push origin HEAD --force

Jeśli jednak inni go wyciągnęli, lepiej byłoby założyć nową gałąź. Ponieważ kiedy pociągną, po prostu połączy to w swoją pracę, a ty ponownie ją wypchniesz.

Jeśli już wypchnąłeś, może być lepiej użyć git revert, aby utworzyć zatwierdzenie „obrazu lustrzanego”, które cofnie zmiany. Oba zatwierdzenia będą jednak znajdować się w dzienniku.


FYI - git reset --hard HEADjest świetny, jeśli chcesz się pozbyć PRACY W TRAKCIE. Zresetuje cię z powrotem do ostatniego zatwierdzenia i usunie wszystkie zmiany w twoim drzewie roboczym i indeksie.


Na koniec, jeśli musisz znaleźć zatwierdzenie, które „usunąłeś”, zwykle jest ono obecne, git reflogchyba że śmieci zostały zebrane w repozytorium.

gahooa
źródło
59
HEAD~1lub po prostu HEAD^. Jeśli naciskałeś, powinieneś użyć git revertzamiast tego.
Jakub Narębski
13
Oczywiście możesz także użyć HEAD~ndo „cofnięcia” nzatwierdzeń z głowy. Być może od tego momentu można interpretować ... --hard HEADrównież jako HEAD~0=> usuwanie trwającej pracy.
nuala
13
@ beamrider9 imho git rebase jest prawie zawsze lepszym sposobem usuwania zatwierdzeń (jak opisano w odpowiedzi Grega Hewgilla) - zwłaszcza dlatego, że rebase zawiera duże ostrzeżenie, że usuniesz rzeczy 4realz.
Noah Sussman
20
to jednak nie usuwa zmian z drzewa zatwierdzeń. OP poprosił o już dokonane zatwierdzenie. Jeśli reset --hardi sprawdzisz log --oneline --all, zatwierdzenia nadal pozostają w drzewie. Jak usuwamy te zatwierdzenia z drzewa? Dzięki.
iGbanam
17
służy reset --softdo usuwania zatwierdzenia lokalnego BEZ cofania trwającej pracy!
704

Jeśli jeszcze nigdzie nie wysłałeś zatwierdzenia, możesz użyć go git rebase -ido usunięcia. Najpierw dowiedz się, jak daleko wstecz jest to zatwierdzenie (w przybliżeniu). Następnie wykonaj:

git rebase -i HEAD~N

Te ~Nśrodki rebase ostatnie Nrewizje ( Nmusi być liczbą, na przykład HEAD~10). Następnie możesz edytować plik, który przedstawia ci Git, aby usunąć niepoprawne zatwierdzenie. Po zapisaniu tego pliku Git przepisze wszystkie poniższe zatwierdzenia, tak jakby usunięty nie istniał.

Git Book ma dobrą sekcję na temat rebasingu ze zdjęciami i przykładami.

Bądź ostrożny z tym jednak, bo jeśli coś zmienić, że popychane gdzie indziej, inne podejście będzie potrzebna, chyba że planujesz zrobić push force.

Greg Hewgill
źródło
2
Uwaga: Jeśli zdarzy Ci się, że jakieś --no-ff scali się w ostatniej partii zatwierdzeń, rebase rozbije je :( Jest to wspomniane w -p na tej stronie . Problem polega na tym, że jeśli zamienisz -i na -p, nie ma już tego wyskakującego okienka z opcjami „edytuj to zatwierdzenie, sqush tamte” itp. Ktoś zna rozwiązanie?
Bukov
4
Co jeśli go nacisnąłeś? (tylko ja używam zdalnego repo)
Costa
6
@Costa możesz użyć, push -faby wymusić wypchnięcie i zastąpić zdalną gałąź lokalną. Jeśli to tylko Twoje zdalne repozytorium, nie ma problemu. Kłopoty zaczynają się, jeśli ktoś tymczasem się udało.
Greg Hewgill
3
Dodałem i zatwierdziłem plik danych, który był zbyt duży dla GitHub (tak, prawdopodobnie i tak nie powinien znajdować się w repozytorium źródłowym; No cóż). Kiedy próbowałem pchać, GitHub odmówił z powodu zbyt dużego pliku. Wszystko, co chciałem zrobić, to cofnąć to zatwierdzenie, jednocześnie zapisując kilka innych niepowiązanych zatwierdzeń. git rebase -i HEAD~5Polecenie było dokładnie to, co potrzebne, aby całkowicie usunąć to commit z mojego lokalnego repo! Dzięki!
aldo
4
@dumbledad: Za rebase -ipomocą zmiany odpowiadające usuniętemu zatwierdzeniu nie są zachowywane.
Greg Hewgill
517

Inną możliwością jest jedno z moich ulubionych ulubionych poleceń:

git rebase -i <commit>~1

Spowoduje to uruchomienie bazy w trybie interaktywnym -iw punkcie tuż przed zatwierdzeniem, które chcesz bić. Edytor uruchomi listę wszystkich zatwierdzeń od tego czasu. Usuń wiersz zawierający zatwierdzenie, które chcesz zatrzeć i zapisz plik. Rebase wykona resztę pracy, usuwając tylko to zatwierdzenie i odtwarzając wszystkie pozostałe z powrotem do dziennika.

1800 INFORMACJI
źródło
3
dzięki, jeśli napotkasz jakieś problemy (takie jak puste zatwierdzenia), których możesz użyćgit rebase --continue
realgt
8
Jeszcze łatwiej: git rebase -i HEAD~1
mmell
2
Wowzers. git rebase -i HEAD~1naprawdę wyczyściłem repo! Trudno powiedzieć dokładnie, co się stało, ale całość wygląda znacznie ładniej. Właściwie to trochę niepokojące.
Charles Wood,
7
Myślę, że warto zauważyć, że zatwierdzenie nie jest zatarte, a jedynie usunięte z listy. Jeśli się zepsujesz, możesz odzyskać zatwierdzenie za pomocą refloga .
Zaz
6
Czy usunięcie wiersza jest takie samo jak d / drop?
Leo
344

Dołączam tę odpowiedź, ponieważ nie rozumiem, dlaczego ktokolwiek, kto właśnie próbował zlecić pracę, chciałby usunąć całą tę pracę z powodu błędu przy użyciu Git!

Jeśli chcesz kontynuować pracę i po prostu „cofnij” to polecenie zatwierdzenia (złapałeś przed wypychaniem repo):

git reset --soft HEAD~1

Nie używaj flagi --hard, chyba że chcesz zniszczyć trwające prace od ostatniego zatwierdzenia.

Obrabować
źródło
5
Oto przykład: wykonujesz niewielką pracę na serwerze programistycznym, który popełniasz. Potem okazuje się, że ten serwer nie ma wychodzącego dostępu HTTPS, więc nigdzie nie można wypchnąć zatwierdzenia. Najłatwiej jest po prostu udawać, że to się nigdy nie wydarzyło, i powtórzyć łatkę z lokalnego komputera.
Steve Bennett,
1
@KarthikBose zawsze będzie reflog. nawet po tym, jak git reset --hard HEAD~1poprzednie ostatnie zatwierdzenie będzie dostępne poprzez reflog (aż do jego wygaśnięcia); patrz również tutaj: gitready.com/intermediate/2009/02/09/…
kodowanie
4
Dzięki. Ta odpowiedź powinna być oceniana wyżej lub zostać uwzględniona w zaakceptowanej odpowiedzi. Usuwanie zatwierdzenia! = Cofnięcie zatwierdzenia.
Alsciende
2
@RandolphCarter: nadal będziesz tracić wszelkie nieprzyjęte zmiany.
naught101
7
@Rob, jednym z przykładów jest przypadkowe zatwierdzenie pliku zawierającego klucz tajny (np. Hasło), który nigdy nie powinien podlegać kontroli źródła. Lokalne zatwierdzenie musi zostać zniszczone , a nie tylko cofnięte, aby nigdy nie zostało wypchnięte na serwer.
Bob Meyers
141

Usuwanie całego zatwierdzenia

git rebase -p --onto SHA^ SHA

Oczywiście zastąp „SHA” odniesieniem, którego chcesz się pozbyć. „^” W tym poleceniu jest dosłowne.

http://sethrobertson.github.io/GitFixUm/fixup.html#change_deep

rodzynki
źródło
26
jak mogę głosować więcej na tę odpowiedź? inne rozwiązania pokazują tylko, jak to zrobić interaktywnie lub jak usunąć najwyższe zatwierdzenia.
ribamar
5
-p, --preserve-merges Odtwarzaj zatwierdzenia scalania zamiast spłaszczać historię, odtwarzając zatwierdzenia wprowadzone przez zatwierdzenie scalania. Scal konflikty lub ręczne zmiany w celu scalenia zatwierdzeń nie są zachowywane.
raittes
5
To jest prawdziwa dokładna odpowiedź
Hamman Samuel
9
Mówi: „zamień SHA na odwołanie, którego chcesz się pozbyć”, ale linia zawiera tam SHA dwa razy. Oto co zrobiłem. git rebase -p --onto 5ca8832c120 ^ 5ca8832c120 Ale nic się nie zmieniło. Czy mam używać tego samego SHA dwa razy? Jeśli nie, to jaki jest SHA do usunięcia zatwierdzenia i jaki powinien być drugi SHA?
Rubicksman
3
WOW, działało bezbłędnie! To powinna być zaakceptowana odpowiedź!
Liran H
51

Jeśli nie opublikowałeś zmian, możesz usunąć najnowsze zatwierdzenie, możesz to zrobić

$ git reset --hard HEAD^

(pamiętaj, że spowoduje to również usunięcie wszystkich niezaangażowanych zmian; używaj ostrożnie).

Jeśli już opublikowałeś zatwierdzenie do usunięcia, użyj git revert

$ git revert HEAD
Jakub Narębski
źródło
To nie zadziałało. Kiedy git loguję, wszystko wciąż tam jest, bez względu na to, dlaczego to robię, po prostu dodaje więcej zatwierdzeń. Chcę posprzątać historię.
Costa
@Costa: Co nie działało (tj. Z której wersji korzystałeś) i jak zalogowałeś się?
Jakub Narębski
Próbowałem prawie wszystkiego w tym pytaniu. (Ostatnio próbowałem git revert HEAD) Mój dziennik git:tree = log --all --graph --format=format:'%C(bold blue)%h%C(reset) %C(dim black)%s%C(reset)%C(bold red)%d%C(reset) %C(green)by %an, %ar%C(reset)'
Costa
1
Chcę tylko usunąć zatwierdzenia (tak jakby nigdy nie istniały). Wyruszyłem na jakąś dziwną przygodę z kodowaniem, z kilkoma nowymi zobowiązaniami, a wszystko to skończyło się śmieciem. Jak mogę usunąć te z mojego dziennika git?
Costa
2
Cholera jasna, coś magicznie zrobiło dokładnie to, czego chciałem ... które z tych poleceń to zrobiło? !!?!
Costa
44

Powiedzmy, że chcemy usunąć zatwierdzenia 2 i 4 z repozytorium.

commit 0 : b3d92c5
commit 1 : 2c6a45b
commit 2 : <any_hash>
commit 3 : 77b9b82
commit 4 : <any_hash>

Uwaga: Musisz mieć uprawnienia administratora do repozytorium, ponieważ używasz --hardi -f.

  • git checkout b3d92c5 Kasa z ostatniego użytecznego zatwierdzenia.
  • git checkout -b repair Utwórz nowy oddział do pracy.
  • git cherry-pick 77b9b82 Uruchom przez zatwierdzenie 3.
  • git cherry-pick 2c6a45b Uruchom przez zatwierdzenie 1.
  • git checkout master Mistrz kasy.
  • git reset --hard b3d92c5 Resetuj master do ostatniego użytecznego zatwierdzenia.
  • git merge repair Połącz nasz nowy oddział w master.
  • git push -f origin master Wciśnij master do zdalnego repozytorium.
tk_
źródło
1
ostatnim krokiem powinno być git push -f origin masterto, że nie ma opcji--hard
Vivex
2
Chyba commit 0jest starszy niż commit 1. Czy mógłbyś mi powiedzieć, dlaczego najpierw biegniesz commit 3(przez cherry-pick), a potem przez commit 1? Po wymeldowaniu z b3d92cd( commit 0) spodziewałbym cherry-pick commit 1, a następnie commit 3. Dzięki.
Jarek C
@JarekC Myślę, że najwyższym zatwierdzeniem jest tutaj najnowsze zatwierdzenie, chyba że widzę coś złego ...
Jeff Huijsmans
41
git reset --hard commitId

git push <origin> <branch> --force

PS: CommitId odnosi się do tego, do którego chcesz przywrócić

sun34
źródło
git push --force <nazwa pochodzenia> <nazwa oddziału>. ponieważ nie wspominając o nazwie oddziału, może zmienić cały plik na pilocie.
sheelpriy
39

Wymuszaj zmianę historii

Zakładając, że nie chcesz tylko usunąć ostatniego zatwierdzenia, ale chcesz usunąć określone zatwierdzenia z ostatnich n zatwierdzeń, użyj:

git rebase -i HEAD~<number of commits to go back>, więc git rebase -i HEAD~5jeśli chcesz zobaczyć ostatnie pięć zatwierdzeń.

Następnie w edytorze tekstowym zmienić słowo pickaby dropobok każdego popełnić chciałbyś usunąć. Zapisz i zamknij edytor. Voila!

Dodatkowa zmiana historii

Spróbować git revert <commit hash>. Cofnij utworzy nowe zatwierdzenie, które cofnie określone zatwierdzenie.

IliasT
źródło
dropsłowo kluczowe nie jest zdefiniowane. Aby usunąć zatwierdzenie, po prostu usuń całą linię.
Shayan Salehian,
1
Dla mnie upuszczenie zostało zdefiniowane jako słowo kluczowe, ale zrobienie upuszczenia nie usuwało zatwierdzenia z historii. Jednak usunięcie linii z interaktywnego bazy danych zrobiło to.
Adam Parkin,
Właśnie tego potrzebowałem. Działa świetnie; dzięki!
diekunstderfuge
30

Jeśli chcesz naprawić swój ostatni zatwierdzenie, możesz cofnąć zatwierdzenie i wycofać z niego pliki, wykonując:

git reset HEAD~1

Spowoduje to przywrócenie repozytorium do stanu przed poleceniami git add, które przygotowały pliki. Twoje zmiany będą w twoim katalogu roboczym. HEAD ~ 1 odnosi się do zatwierdzenia poniżej bieżącego wierzchołka gałęzi.

Jeśli chcesz anulować zatwierdzenie N, ale zachowaj zmiany kodu w katalogu roboczym:

git reset HEAD~N

Jeśli chcesz pozbyć się ostatniego zatwierdzenia i nie chcesz zachować zmian w kodzie, możesz wykonać „twardy” reset.

git reset --hard HEAD~1

Podobnie, jeśli chcesz odrzucić ostatnie N zatwierdzeń i nie chcesz zachować zmian w kodzie:

git reset --hard HEAD~N
Anurag-Sharma
źródło
22
git rebase -i HEAD~2

W tym przypadku „2” oznacza liczbę zatwierdzeń, które chcesz zmienić.

'git rebase -i HEAD`

jeśli chcesz zmienić podstawę wszystkich zatwierdzeń.

Następnie będziesz mógł wybrać jedną z tych opcji.

p, pick = use commit

r, reword = use commit, but edit the commit message

e, edit = use commit, but stop for amending

s, squash = use commit, but meld into previous commit

f, fixup = like "squash", but discard this commit's log message

x, exec = run command (the rest of the line) using shell

d, drop = remove commit

Linie te można ponownie zamówić; są wykonywane od góry do dołu. Jeśli usuniesz tutaj linię, KTÓRE ZOBOWIĄZANIE ZOSTANĄ UTRACONE. Jeśli jednak usuniesz wszystko, zmiana bazy zostanie przerwana. Zauważ, że puste zatwierdzenia są komentowane

Możesz po prostu usunąć ten zatwierdzenie, używając opcji „d” lub Usuwając wiersz z twoim zatwierdzeniem.

Siva Praveen
źródło
W najnowszej wersji git nie ma już opcji d . Musisz tylko usunąć wiersze z zatwierdzeniami z bazy, aby je usunąć.
Oleg Abrazhaev
17

Aby usunąć w oddziale lokalnym, użyj

git reset --hard HEAD~1

Aby usunąć w zdalnej gałęzi, użyj

git push origin HEAD --force
gwiazda
źródło
12

[Szybka odpowiedź]

Masz wiele alternatyw, na przykład:

  • Alternatywa 1:

    git rebase -i <YourCommitId>~1
    

    Zmień YourCommitId na numer zatwierdzenia, do którego chcesz przywrócić.

  • Alternatywa 2:

    git reset --hard YourCommitId
    git push <origin> <branch> --force
    

    Zmień YourCommitId na numer zatwierdzenia, do którego chcesz przywrócić.

    Nie polecam tej opcji, ponieważ możesz stracić trwającą pracę.

  • Alternatywa 3:

    git reset --soft HEAD~1
    

    Możesz zatrzymać swoją pracę i cofnąć tylko zatwierdzenie.

Javier C.
źródło
thankyou thankyou thankyou thankyou (Y)
Habib Rehman
11

Źródło: https://gist.github.com/sagarjethi/c07723b2f4fa74ad8bdf229166cf79d8

Usuń ostatni zatwierdzenie

Na przykład twój ostatni zatwierdzenie

git push origin + aa61ab32 ^: master

Teraz chcesz usunąć to zatwierdzenie, a następnie łatwy sposób na wykonanie następujących czynności

Kroki

  1. Najpierw zresetuj gałąź do elementu nadrzędnego bieżącego zatwierdzenia

  2. Wciśnij go do pilota.

git reset HEAD^ --hard

git push origin -f

Dla konkretnego zatwierdzenia, którego chcesz zresetować, następuje

git reset bb676878^ --hard

git push origin -f
Sagar Jethi
źródło
9

Oto inny sposób, aby to zrobić:

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”. Myślę, że wiersz poleceń to:

git reset --hard COMMIT_ID

Ponieważ właśnie zdalnie wyewidencjonowałeś swój oddział, nie będziesz musiał wprowadzać żadnych lokalnych zmian, aby martwić się utratą. Ale to by ich straciło, gdybyś to zrobił.

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
9

Błąd, pomyłka:

I git rebase -i --root„ed mój oddział, nieświadomie myśli mogłem przeredagować pierwszym popełnienia różniące się od mistrza (na GitHub for Windows widok domyślny jest porównanie do opanowania, ukrywając go w całości).

Zapuściłem brodę z Doliny Krzemowej, podczas gdy ponad 900 zobowiązań załadowało się do Wzniosłości. Wychodząc bez żadnych zmian, naładowałem akumulator, a następnie przystąpiłem do golenia, ponieważ wszystkie ponad 900 pojedynczych osób nonszalancko wycofuje się - resetując teraz swoje czasy zatwierdzania.

Zdeterminowany, aby pokonać Gita i zachować oryginalne czasy, usunąłem to lokalne repozytorium i ponownie sklonowałem ze zdalnego.

Teraz dodano ponownie ostatnie niepotrzebne zatwierdzenie master, które chciałem usunąć, więc postępowałem tak.

Wyczerpanie opcji:

Nie chciałem git revert- stworzyłoby to dodatkowe zatwierdzenie, dając Git przewagę.

git reset --hard HEADnic nie zrobił, po sprawdzeniu reflogostatniego i jedynegoHEAD był klon - Git wygrywa.

Aby uzyskać najnowszą SHA, sprawdziłem zdalne repozytorium na github.com - niewielka wygrana.

Po zastanowieniu git reset --hard <SHA>zadziałało, zaktualizowałem kolejną gałąź do opanowania i 1 ... 2 ... puf! zatwierdzenie wróciło - Git wygrywa.

Sprawdzanie z powrotem do mistrza, czas spróbować git rebase -i <SHA>, a następnie usuń linię ... bezskutecznie, przykro mi to mówić. „ Jeśli usuniesz tutaj linię, KTÓRE ZOBOWIĄZANIE ZOSTANĄ UTRACONE ”. Ach ... przeświecał nad nową funkcją trollowania n00b w informacjach o wersji 2.8.3 .

Rozwiązanie:

git rebase -i <SHA> następnie d, drop = remove commit .

Aby to sprawdzić, wymeldowałem się do innej gałęzi i voila - brak ukrywania zatwierdzenia pobierania / ściągania z mastera.

https://twitter.com/holman/status/706006896273063936

Miłego dnia.

Lew
źródło
8

Wszystkie powyższe polecenia przywracają stan twojego drzewa roboczego i indeksu, jakie były przed dokonaniem zatwierdzenia, ale nie przywracają stanu repozytorium. Jeśli na to spojrzysz, zatwierdzenie „usunięte” nie jest faktycznie usuwane, po prostu nie znajduje się na końcu bieżącej gałęzi.

Myślę, że nie ma sposobu na usunięcie zatwierdzenia za pomocą porcelanowych poleceń . Jedynym sposobem jest usunięcie go z dziennika i ponowne zalogowanie, a następnie wykonanie git prune --expire -now.

Angelo Borsotti
źródło
1
Kolejność wyświetlania odpowiedzi w StackOverflow nie jest ustalona. Proszę nie odnosić się do „Wszystkie powyższe polecenia”. Stwórz własną odpowiedź samodzielnie.
Pascal Cuoq
Ta odpowiedź nie jest do końca poprawna. git prune jest właściwie jednym z poleceń „porcelany” . Ponadto rzadko zdarza się, że chcesz całkowicie wyczyścić swój dziennik logowania (jednym z przypadków użycia jest usunięcie poufnych informacji z repozytorium, ale jak powiedziałem, jest to rzadki przypadek użycia). Częściej niż nie, będziesz chciał zachować stare zatwierdzenia w rejestrze, na wypadek, gdybyś musiał odzyskać dane. Zobacz Pro Git: 9.7 Git Internal - Konserwacja i odzyskiwanie danych .
8

Jeśli chcesz zachować historię, pokazując zatwierdzenie i cofnięcie, powinieneś użyć:

git revert GIT_COMMIT_HASH

wprowadź komunikat wyjaśniający, dlaczego cofasz, a następnie:

git push  

Podczas wydawania git logpojawi się zarówno „zły” komunikat zatwierdzenia, jak i cofnięcie dziennika.

Paulo Fidalgo
źródło
Tak, ale PO było jasne, że nie tego chcą.
Steve Bennett,
7

Jeśli właśnie pomieszałeś swój ostatni zatwierdzenie (zły komunikat, zapomniałeś dodać kilka zmian) i chcesz go naprawić przed przekazaniem go do publicznego repozytorium, dlaczego nie użyć:

git commit --amend -m "New message here"

Jeśli masz nowo wprowadzone zmiany, zostaną one połączone z ostatnim zatwierdzeniem (którego próbujesz się pozbyć) i zastąpią to zatwierdzenie.

Oczywiście, jeśli zmienisz zatwierdzenie po jego wypchnięciu, przepisujesz historię, więc jeśli to zrobisz, pamiętaj o konsekwencjach.

Możesz również przekazać opcję „--no-edit” zamiast „-m”, jeśli wolisz użyć wiadomości z poprzedniego zatwierdzenia.

Dokumenty: http://git-scm.com/docs/git-commit.html

Pwnrar
źródło
2
O to nie prosi OP.
Steve Bennett,
5

Jeśli już wypchnąłeś, najpierw znajdź zatwierdzenie, które chcesz mieć w HEAD ($ GIT_COMMIT_HASH_HERE) , a następnie uruchom następujące polecenie:

git reset --hard $GIT_COMMIT_HASH_HERE
git push origin HEAD --force

Następnie każde miejsce, w którym repo zostało sklonowane, uruchom:

git reset --hard origin/master
Justin
źródło
5

Co zwykle robię, gdy zatwierdzam i wypycham (jeśli ktoś popchnie jego zatwierdzenie, rozwiąże to problem):

git reset --hard HEAD~1

git push -f origin

Mam nadzieję, że to pomoże

Chris Sim
źródło
5

Już naciskałem. Musisz zwrócić niektóre zobowiązania zdalnie. Próbowałem wielu odmian, ale tylko to od Justina przez git bush działa dla mnie dobrze:

git reset --hard $GIT_COMMIT_HASH_HERE
git push origin HEAD --force
Serg Burlaka
źródło
4

Zresetuj w lokalnym oddziale

git reset --hard HEAD~<Number of commit> So git reset --hard HEAD~3

Siła push to origin

git push -f origin
Ashish Singh
źródło
3

Wykonaj kopię zapasową kodu w folderze tymczasowym. Następujące polecenie zresetuje się tak samo jak serwer.

git reset --hard HEAD
git clean -f
git pull

Jeśli chcesz zachować zmiany i usunąć ostatnie zatwierdzenia

git reset --soft HEAD^
git pull
Lava Sangeetham
źródło
2

usuń zatwierdzenie lokalne

Jak widać na powyższym obrazku, chcę usunąć przywróć „zatwierdzenie zmiany testowej 2” (identyfikator SHA1: 015b5220c50e3dfbb1063f23789d92ae1d3481a2 (identyfikator SHA1 można uzyskać za pomocągitk polecenia w git bash)).

Do tego mogę użyć (wszystkie poniższe polecenia działają tylko lokalnie. Musisz nacisnąć po usunięciu):

  1. git reset --hard 515b5220c50e3dfbb1063f23789d92ae1d3481a2// tworzy kopię zapasową tego zatwierdzenia (SHA1 ID zmiany testowej 4 zatwierdzenie to 515b5220c50e3dfbb1063f23789d92ae1d3481a2 )
  2. git reset --hard HEAD~1 // tworzy kopię zapasową przed jednym zatwierdzeniem.
  3. git reset --hard HEAD^ // Aby usunąć ostatni zatwierdzenie z git

po usunięciu:

po usunięciu zatwierdzenia

ankit
źródło
2

git reset --hard HEAD~1
Będziesz teraz na poprzednim stanowisku. Pociągnij gałąź. Wciśnij nowy kod. Zatwierdzenie zostanie usunięte z git

Jyotirmoy Upadhaya
źródło
Chyba że już wprowadziłeś zmiany. W takim przypadku twardy reset nie wyczyści pilota. W takim przypadku rebase jest dobrą opcją
c0der512
1

git reset --hard

git push origin HEAD --force

Jeśli jedno lub więcej zatwierdzeń jest oznaczonych, najpierw usuń znaczniki. W przeciwnym razie oznaczone zatwierdzenie nie zostanie usunięte.

BillChan
źródło
0

użyj git revert https://git-scm.com/docs/git-revert . Cofnie cały kod, a następnie będziesz mógł wykonać następne zatwierdzenie. Następnie głowa wskaże ostatnie zatwierdzenie. cofnięte zatwierdzenia nigdy nie usuwają, ale nie wpłynie to na ostatnie zatwierdzenie.

Uttam Rahane
źródło
0

W moim przypadku mój magiczny kod dla tego szczenięcia jest następujący:

git reset --hard @{u}

Przetestuj to i powiedz mi. Próbowałem kilku różnych, ale ten był jedyny, który mi pomógł.

Mauro Bilotti
źródło