78 Pytanie: Jak cofnąć ostatnie lokalne zatwierdzenia w Git?

pytanie utworzone w Wed, May 29, 2019 12:00 AM

Przypadkowo popełniłem złe pliki na Git , ale nie popchnąłem zobowiązania do serwer jeszcze.

Jak mogę cofnąć te zatwierdzenia z lokalnego repozytorium?

    
19738
  1. Ostrzeżenie: powinieneś to zrobić tylko wtedy, gdy jeszcze nie przesunąłeś zatwierdzenia na pilota, w przeciwnym razie zepsujesz historię innych, którzy już pobrali zatwierdzenie pilot!
    2015-05-13 21: 18: 57Z
  2. Oto bardzo jasny i dokładny post na temat cofania rzeczy w git, prosto z Githuba.
    2015-06-08 19: 39: 17Z
  3. Zanim opublikujesz nową odpowiedź, zastanów się, czy na to pytanie jest już ponad 65 odpowiedzi. Upewnij się, że Twoja odpowiedź przyczynia się do tego, czego nie ma wśród istniejących odpowiedzi.
    2017-06-15 15: 26: 36Z
  4. Wiesz, czego potrzebuje git? git undo, to wszystko. Wtedy reputacja ma na celu radzenie sobie z błędami popełnianymi przez nas zwykli śmiertelnicy znikają. Zaimplementuj, przesuwając bieżący stan na stosie git przed wykonaniem dowolnego polecenia git. Wpłynęłoby to na wydajność, więc najlepiej byłoby dodać flagę konfiguracyjną, aby ją włączyć.
    2018-03-20 01: 45: 28Z
  5. @ YiminRong Można to zrobić za pomocą funkcji alias Gita: git-scm.com/book/en/v2/Git-Basics-Git-Aliases
    2018-10-05 14: 50: 08Z
30 odpowiedzi                              30                         

Cofnij zatwierdzenie i ponów

 
$ git commit -m "Something terribly misguided"             # (1)
$ git reset HEAD~                                          # (2)
<< edit files as necessary >>                              # (3)
$ git add ...                                              # (4)
$ git commit -c ORIG_HEAD                                  # (5)
  1. To jest to, co chcesz cofnąć.
  2. Pozostawia to twoje drzewo robocze (stan twoich plików na dysku) bez zmian, ale cofa zatwierdzenie i pozostawia zmiany, które popełniłeś bez scenariusza (więc pojawią się jako „Zmiany niezorganizowane do zatwierdzenia” w git status, więc będziesz trzeba je dodać przed zatwierdzeniem). Jeśli tylko chcesz dodać więcej zmian do poprzedniego zatwierdzenia lub zmienić komunikat zatwierdzenia 1 , możesz zamiast tego użyć git reset --soft HEAD~ git reset HEAD~ (gdzie HEAD~ jest taki sam jak HEAD~1), ale pozostawia już istniejące zmiany.
  3. Poprawiaj pliki drzewa roboczego.
  4.  git add wszystko, co chcesz dołączyć do nowego zatwierdzenia.
  5. Zatwierdź zmiany, ponownie wykorzystując stary komunikat zatwierdzenia. reset skopiowało starą głowicę do .git/ORIG_HEAD; commit z -c ORIG_HEAD otworzy edytor, który początkowo zawiera komunikat dziennika ze starego zatwierdzenia i pozwala go edytować. Jeśli nie musisz edytować wiadomości, możesz użyć opcji -C.

Pamiętaj jednak, że jeśli dodałeś jakieś nowe zmiany do indeksu, użycie commit --amend doda je do poprzedniego zatwierdzenia.

Jeśli kod jest już wypchnięty na twój serwer i masz uprawnienia do nadpisywania historii (rebase), to:

 
git push origin master --force

Możesz również spojrzeć na tę odpowiedź:

Jak się poruszać Wrócisz do poprzedniej lokalizacji? (Odłączona głowa) i Cofnij zatwierdzenia

Powyższa odpowiedź pokaże ci git reflog, który służy do sprawdzenia, do czego jest SHA-1, do którego chcesz wrócić. Po znalezieniu punktu, w którym chcesz cofnąć użycie sekwencji poleceń, jak wyjaśniono powyżej.


1 Pamiętaj jednak, że nie musisz resetować do wcześniejszego zatwierdzenia, jeśli właśnie popełniłeś błąd w komunikacie zatwierdzenia . Łatwiejszą opcją jest git reset (aby usunąć zmiany wprowadzone od tego czasu), a następnie git commit --amend , whIch otworzy domyślny edytor wiadomości zatwierdzania wypełniony ostatnio komunikatem zatwierdzenia.

    
21340
2019-05-20 20: 06: 45Z
  1. A jeśli zatwierdzenie było w niewłaściwej gałęzi, możesz git checkout theRightBranch ze wszystkimi etapami zmian. Tak jak musiałem to zrobić.
    2010-10-05 15: 44: 20Z
  2. Jeśli pracujesz w DOS, zamiast git reset --soft HEAD^ musisz użyć git reset --soft HEAD~1. ^ Jest postacią kontynuującą w DOS, więc nie będzie działać poprawnie. --soft jest również domyślne, więc możesz je pominąć, jeśli chcesz i powiedz tylko git reset HEAD~1.
    2011-04-13 14: 15: 10Z
  3. Ponadto w zsh musisz cytować ^, więc git reset --soft 'HEAD^' ... przynajmniej ja
    2011-10-27 18: 24: 16Z
  4. (Korekta do tego, co napisałem powyżej; domyślnie --mixed. --mixed oznacza zachowanie zmienionych plików, ale nie trzymanie ich w indeksie. --soft zachowałoby zmienione pliki i zachowaj je w indeksie tak, jak były tuż przed zmienionym zatwierdzeniem. Przepraszamy za zamieszanie.)
    2011-11-17 02: 40: 53Z
  5. użytkownicy zsh mogą otrzymać: zsh: no matches found: HEAD^ - musisz uciec ^ tj. git reset --soft HEAD\^
    2013-02-21 17: 47: 56Z

Cofanie zatwierdzenia jest trochę przerażające, jeśli nie wiesz, jak to działa. Ale to naprawdę zadziwiająco łatwe, jeśli rozumiesz.

Powiedzmy, że masz to, gdzie C to twoja HEAD i (F) to stan twoich plików.

 
   (F)
A-B-C
    ↑
  master

Chcesz nuke commit C i nigdy więcej go nie zobaczyć . Robisz to:

 
git reset --hard HEAD~1

Rezultatem jest:

 
 (F)
A-B
  ↑
master

Teraz B jest HEAD. Ponieważ użyłeś --hard, twoje pliki są resetowane do stanu w commit B.

Ach, ale załóżmy, że commit C nie był katastrofą, ale trochę odstąpił. Chcesz cofnąć zatwierdzenie, ale zachowaj zmiany w celu edycji, zanim zrobisz to lepiej. Zaczynając od nowa, z C jako HEAD:

 
   (F)
A-B-C
    ↑
  master

Możesz to zrobić, pozostawiając --hard:

 
git reset HEAD~1

W tym przypadku wynikiem jest:

 
   (F)
A-B-C
  ↑
master

W obu przypadkach HEAD jest tylko wskaźnikiem do ostatniego zatwierdzenia. Kiedy zrobisz git reset HEAD~1, powiesz Gitowi, aby przesunął wskaźnik HEAD z powrotem o jedno zatwierdzenie. Ale (chyba że używasz --hard) zostawiasz swoje pliki tak, jak były. Tak więc git status pokazuje zmiany, które sprawdziłeś w C. Nie straciłeś nic!

Dla najlżejszego dotyku możesz nawet cofnąć zatwierdzenie, ale zostaw swoje pliki i swój shas (które to jest hashe), w które się poruszyliście. Znajdźcie zatwierdzone przez was zniszczenie i zróbcie to:

 
git checkout -b someNewBranchName shaYouDestroyed

Teraz wskrzesiłeś to zatwierdzenie. Zobowiązania nie są w rzeczywistości niszczone w Git przez około 90 dni, więc zazwyczaj możesz wrócić i uratować jednego, którego nie chciałeś pozbyć się.

    
10293
2018-12-07 09: 56: 29Z
  1. @ dma_k, tak. Albo możesz zrobić git reset --hard HEAD^^ raz. Używam notacji tyldy (~), ponieważ notacja caret (^) nie działa w DOS.
    2012-02-25 15: 02: 44Z
  2. Kolejna miła wskazówka: Możesz ponownie dołączyć gałąź do zatwierdzenia, z którego ją usunąłeś za pomocą git branch -f <branch> <commit-id>. Oszczędza konieczność ponownego tworzenia zatwierdzeń!
    2012-06-22 13: 11: 11Z
  3. Dla początkującego gita nie jest oczywiste, jaka jest różnica między dwiema ostatnimi opcjami (--soft i ta powyżej). Wspomnienie indeksu nie pomaga, tak naprawdę nie wiemy jeszcze, co to oznacza. Połączenie @ nessur między soft a Ctrl-Z naprawdę pomogło! Ale wciąż nie rozumiem różnicy między tymi dwiema opcjami.
    2012-06-26 15: 56: 52Z
  4. Znacznie lepiej jest powiedzieć „dlaczego” coś działa, niż po prostu otrzymać odpowiedź. Kudos do tego opisu - pomógł być 'get' git.
    2012-07-03 19: 13: 35Z
  5. Brakuje istotnego punktu: jeśli wspomniane zatwierdzenie zostało wcześniej „wypchnięte” do pilota, każda „cofnięta” operacja, bez względu na to, jak prosta, spowoduje ogromny ból i cierpienie reszcie użytkowników, którzy mają to zatwierdzenie w swojej lokalnej kopii, gdy w przyszłości wykonają „git pull”. Jeśli więc zatwierdzenie było już „wciśnięte”, zrób to zamiast tego: git revert < bad-commit-sha1-id > git push origin:
    2013-11-08 23: 43: 18Z

Zajęło mi to trochę czasu, więc może to pomoże komuś ...

Istnieją dwa sposoby „cofnięcia” ostatniego zatwierdzenia, w zależności od tego, czy dokonałeś już publicznego zatwierdzenia (wypchnięty do zdalnego repozytorium):

Jak cofnąć zatwierdzenie lokalne

Powiedzmy, że popełniłem lokalnie, ale teraz chcę usunąć to zatwierdzenie.

 
git log
    commit 101: bad commit    # latest commit, this would be called 'HEAD'
    commit 100: good commit   # second to last commit, this is the one we want

Aby przywrócić wszystko do stanu sprzed ostatniego zatwierdzenia, musimy reset do zatwierdzenia przed HEAD:

 
git reset --soft HEAD^     # use --soft if you want to keep your changes
git reset --hard HEAD^     # use --hard if you don't care about keeping the changes you made

Teraz git log pokaże, że nasze ostatnie zatwierdzenie zostało usunięte.

Jak cofnąć publiczne zatwierdzenie

Jeśli już zatwierdziłeś swoje zatwierdzenia, będziesz chciał utworzyć nowe zatwierdzenie, które „przywróci” zmiany wprowadzone w poprzednim zatwierdzeniu (bieżąca HEAD).

 
git revert HEAD

Twoje zmiany zostaną teraz cofnięte i gotowe do zatwierdzenia:

 
git commit -m 'restoring the file I removed by accident'
git log
    commit 102: restoring the file I removed by accident
    commit 101: removing a file we don't need
    commit 100: adding a file that we need

Aby uzyskać więcej informacji, sprawdź Git Basics - Undoing Things

    
1966
2018-01-30 23: 27: 24Z
  1. Uważam, że odpowiedź jest najczystsza. git revert HEAD^ nie jest poprzednim, to poprzednie poprzednie. Zrobiłem: git revert HEAD i ponownie nacisnąłem i zadziałało :)
    2011-07-14 08: 32: 53Z

Dodawaj /usuwaj pliki, aby uzyskać rzeczy, które chcesz:

 
git rm classdir
git add sourcedir

Następnie zmień zatwierdzenie:

 
git commit --amend

Poprzednie, błędne zatwierdzenie będzie edytowane w celu odzwierciedlenia nowego stanu indeksu - innymi słowy, będzie tak, jakbyś nigdy nie popełnił błędu.

Zauważ, że powinieneś to robić tylko wtedy, gdy jeszcze tego nie zrobiłeś. Jeśli pchnąłeś, musisz po prostu zatwierdzić poprawkę normalnie.

    
1685
2016-10-12 06: 45: 55Z
  1. Czy to działa, gdy zrobiłem git commit --amend i naprawdę chciałem zrobić git commit?
    2011-05-18 13: 07: 31Z
  2. @ dbm, jeśli przypadkowo zmieniłeś, użyj git reset --soft <oldref>, gdzie oldref to identyfikator zatwierdzenia przed zmianą. Możesz użyć git reflog, aby zidentyfikować stary identyfikator zatwierdzenia. Spowoduje to cofnięcie skutków zmiany, ale pozostawi zmiany. Następnie zrób git commit, aby zatwierdzić jako zwykłe zatwierdzenie.
    2011-05-18 14: 20: 48Z
  3. @ Dennis, git commit --amend zamienia bieżące drzewo (tj. zmiany etapowe) w zatwierdzenie, nadpisując bieżącą HEAD. Po tym punkcie nie są już uważani za inscenizowanych, ponieważ są częścią zatwierdzenia (tzn. Git diff - cached jest pusty), ale nie są one „usuwane” ani „tracone”.
    2012-02-01 03: 08: 06Z
  4. Opcja --amend była sztuczką, aby uniknąć fałszywego zatwierdzenia!
    2019-03-22 19: 58: 29Z
 
git rm yourfiles/*.class
git commit -a -m "deleted all class files in folder 'yourfiles'"

lub

 
git reset --hard HEAD~1

Ostrzeżenie: Powyższe polecenie spowoduje trwałe usunięcie modyfikacji .java plików (i innych plików), które chcesz zatwierdzić.

hard reset do HEAD-1 ustawi kopię roboczą na stan zatwierdzenia przed błędnym zatwierdzeniem.

    
954
2017-12-13 22: 03: 28Z
  1. "- hard" pozbędzie się zmodyfikowanych plików .java w katalogu roboczym, który chciał zatwierdzić.
    2009-05-29 18: 26: 59Z
  2. Możesz "git stash save" zmienić kopię roboczą, wykonać twardy reset, a następnie "git stash pop", aby je odzyskać, chociaż przypuszczam, że miękki reset prostsze.
    2011-04-15 13: 33: 03Z
  3. git commit -a -m "" lub git commit -am "" naturalnie! :]
    2014-06-21 16: 31: 59Z
  4. Kolejne użycie skrótu do przechowywania; jeśli chcesz usunąć wszystko (cofnij dodawanie git), tylko git stash, a następnie git stash pop
    2015-12-08 22: 30: 29Z

Aby zmienić ostatnie zatwierdzenie

Zastąp pliki w indeksie:

 
git rm --cached *.class
git add *.java

Następnie, jeśli jest to gałąź prywatna, zmień zatwierdzenie:

 
git commit --amend

Lub, jeśli jest to gałąź udostępniona, wykonaj nowe zatwierdzenie:

 
git commit -m 'Replace .class files with .java files'


(, aby zmienić poprzednie zatwierdzenie , użyj niesamowitej interaktywnej bazy danych )


ProTip ™: dodaj *.class do gitignore , aby zatrzymać to ponownie.


Aby przywrócić zatwierdzenie

Zmiana zatwierdzenia jest idealnym rozwiązaniem, jeśli musisz zmienić ostatnie zatwierdzenie, ale bardziej ogólne rozwiązanie to reset.

Możesz zresetować git do dowolnego zatwierdzenia za pomocą:

 
git reset @~N

Gdzie N to liczba zatwierdzeń przed HEAD, a @~ resetuje do poprzedniego zatwierdzenia.

Więc zamiast zmieniać zatwierdzenie, możesz użyć:

 
git reset @~
git add *.java
git commit -m "Add .java files"

Sprawdź git help reset, a konkretnie sekcje --soft --mixed i --hard, aby lepiej zrozumieć, co to robi.

Reflog

Jeśli się zepsujesz, zawsze możesz użyć polecenia reflog, aby znaleźć odrzucone polecenia:

 
$ git reset @~
$ git reflog
c4f708b HEAD@{0}: reset: moving to @~
2c52489 HEAD@{1}: commit: added some .class files
$ git reset 2c52489
... and you're back where you started


    
724
2017-05-23 12: 03: 09Z
  1. Dla osób czytających w przyszłości - proszę zauważyć, że git revert to osobne polecenie - które zasadniczo „resetuje” pojedynczy commimt.
    2018-08-08 07: 11: 00Z

Użyj git revert <commit-id>

Aby uzyskać identyfikator zatwierdzenia, użyj git log

    
612
2018-11-10 09: 36: 11Z
  1. Jeśli popełniłeśdo niewłaściwej gałęzi: po przywróceniu przejdź do odpowiedniej gałęzi i wybierz zatwierdzenie.
    2012-06-27 11: 02: 58Z
  2. Co to znaczy, że wiśnia wybiera zatwierdzenie? W moim przypadku byłem na niewłaściwej gałęzi, gdy edytowałem plik. Popełniłem to, a potem zdałem sobie sprawę, że jestem w niewłaściwej gałęzi. Użycie "git reset --soft HEAD ~ 1" przywróciło mnie do tuż przed zatwierdzeniem, ale teraz, jeśli sprawdzę poprawną gałąź, jak mogę cofnąć zmiany w pliku w niewłaściwej gałęzi, ale zamiast tego zrobić je (w tej samej nazwie plik) we właściwej gałęzi?
    2015-01-13 22: 05: 57Z
  3. Właśnie wykorzystałem git revert commit-id zadziałał jak urok. Oczywiście wtedy będziesz musiał wcisnąć swoje zmiany.
    2016-01-25 21: 07: 16Z
  4. Uważam, że będzie to git cherry-pick <<erroneous-commit-sha>> @astronomerdave. Od, Mr. Almost-2-Years-Late-to-the-Party.
    2016-10-20 18: 19: 50Z
  5. @ Kris: Zamiast korzystać z rebase z wiśniowym wyborem. Ponieważ jest to zaawansowany wybór wiśni
    2018-11-10 09: 38: 58Z

Jeśli planujesz całkowicie cofnąć zatwierdzenie lokalne, cokolwiek zmienisz, zrobiłeś w zatwierdzeniu, a jeśli nie będziesz się o to martwić, po prostu wykonaj następujące polecenie.

 
git reset --hard HEAD^1

(To polecenie zignoruje całe zatwierdzenie, a twoje zmiany zostaną całkowicie utracone z lokalnego drzewa roboczego). Jeśli chcesz cofnąć zatwierdzenie, ale chcesz, aby zmiany zostały wprowadzone w obszarze przemieszczania (przed zatwierdzeniem, tak jak po git add), wykonaj następujące polecenie.

 
git reset --soft HEAD^1

Teraz zatwierdzone pliki trafiają do obszaru przemieszczania. Załóżmy, że jeśli chcesz ulepszyć pliki, ponieważ musisz edytować niewłaściwą zawartość, wykonaj następujące polecenie

 
git reset HEAD

Teraz zatwierdzono pliki, które mają pochodzić z obszaru stopniowanego do obszaru niestacjonarnego. Teraz pliki są gotowe do edycji, więc cokolwiek zmienisz, chcesz przejść do edycji i dodać je, a następnie dokonać nowego /nowego zatwierdzenia.

Więcej

    
494
2018-09-28 08: 43: 59Z
  1. @ SMR, W tym przykładzie wszystkie wskazują tylko na bieżącą HEAD. HEAD ^ = HEAD ^ 1. Jak również HEAD ^ 1 = HEAD ~ 1. Kiedy używasz HEAD ~ 2, istnieje różnica między symbolami ~ i ^. Jeśli użyjesz ~ 2, oznacza „pierwszy rodzic pierwszego rodzica” lub „dziadek”.
    2015-12-14 15: 34: 11Z

Jeśli masz zainstalowane Git Extras , możesz uruchomić git undo, aby cofnąć ostatnie zatwierdzenie. git undo 3 cofnie ostatnie 3 zatwierdzenia.

    
466
2011-12-13 10: 18: 31Z

Chciałem cofnąć ostatnie 5 zatwierdzeń w naszym wspólnym repozytorium. Sprawdziłem identyfikator wersji, do którego chciałem wrócić. Potem wpisałem następujące.

 
prompt> git reset --hard 5a7404742c85
HEAD is now at 5a74047 Added one more page to catalogue
prompt> git push origin master --force
Total 0 (delta 0), reused 0 (delta 0)
remote: bb/acl: neoneye is allowed. accepted payload.
To git@bitbucket.org:thecompany/prometheus.git
 + 09a6480...5a74047 master -> master (forced update)
prompt>
    
433
2012-04-06 13: 58: 52Z
  1. Przepisywanie historii w udostępnionym repozytorium jest na ogół bardzo złym pomysłem. Zakładam, że wiesz, co robisz, mam tylko nadzieję, że zrobią to także przyszli czytelnicy.
    2012-12-07 16: 02: 12Z
  2. Yes wycofywanie zmian jest niebezpieczne. Upewnij się, że twójkopia robocza jest w pożądanym stanie przed naciśnięciem. Gdy naciskasz, niechciane zatwierdzenia zostają trwale usunięte.
    2012-12-08 14: 14: 43Z
  3. "Podobnie jak w prawdziwym świecie, jeśli chcesz przepisać historię, potrzebujesz konspiracji: każdy musi być w spisku (przynajmniej wszyscy, którzy wie o historii, czyli o wszystkich, którzy kiedykolwiek wyciągnęli z oddziału). Źródło: stackoverflow.com/a/2046748/334451
    2013-08-07 10: 10: 25Z

Wolę używać git rebase -i do tej pracy, ponieważ pojawia się miła lista, na której mogę wybrać zatwierdzenie, aby się pozbyć. Może nie jest tak bezpośredni, jak niektóre inne odpowiedzi tutaj, ale po prostu jest odpowiedni .

Wybierz liczbę zatwierdzeń, które chcesz wyświetlić, a następnie wywołaj w ten sposób (aby zarejestrować ostatnie trzy)

 
git rebase -i HEAD~3

Przykładowa lista

 
pick aa28ba7 Sanity check for RtmpSrv port
pick c26c541 RtmpSrv version option
pick 58d6909 Better URL decoding support

Następnie Git usunie zatwierdzenia dla każdej usuwanej linii.

    
412
2018-12-06 21: 59: 20Z

Jak naprawić poprzednie lokalne zatwierdzenie

Użyj git-gui (lub podobnego), aby wykonać git commit --amend. Z GUI możesz dodawać lub usuwać pojedyncze pliki z zatwierdzenia. Możesz także zmodyfikować komunikat zatwierdzenia.

Jak cofnąć poprzednie zatwierdzenie lokalne

Po prostu zresetuj oddział do poprzedniej lokalizacji (na przykład używając gitk lub git rebase). Następnie zastosuj zmiany z zapisanej kopii. Po wyrzuceniu śmieci do lokalnego repozytorium będzie tak, że niechciane zatwierdzenie nigdy się nie wydarzyło. Aby zrobić to wszystko za pomocą jednego polecenia, użyj git reset HEAD~1.

Słowo ostrzeżenia : Nieostrożne użycie git reset jest dobrym sposobem na wprowadzenie kopii roboczej w stan dezorientacji. Polecam, aby nowicjusze Git unikali tego, jeśli mogą.

Jak cofnąć publiczne zatwierdzenie

Wykonaj odwrotny wybór wiśni ( git-revert ), aby cofnąć zmiany.

Jeśli nie wprowadziłeś jeszcze innych zmian w swojej gałęzi, możesz po prostu ...

 
git revert --no-edit HEAD

Następnie przesuń zaktualizowaną gałąź do wspólnego repozytorium.

Historia zatwierdzeń pokaże oba zatwierdzenia, oddzielnie .


Zaawansowane: poprawienie gałęzi prywatnej w publicznym repozytorium

To może być niebezpieczne - upewnij się, że masz lokalną kopię oddziału do repush.

Uwaga: nie chcesz tego robić, jeśli ktoś inny może pracować w tej gałęzi.

 
git push --delete (branch_name) ## remove public version of branch

Oczyść gałąź lokalnie, a następnie przeprowadź ...

 
git push origin (branch_name)

W normalnym przypadku prawdopodobnie nie musisz się martwić o to, że historia zatwierdzania w prywatnej gałęzi jest nieskazitelna. Wystarczy nacisnąć zatwierdzenie kontynuacji (patrz „Jak cofnąć publiczne zatwierdzenie” powyżej), a następnie wykonaj łączenie w squasha aby ukryć historię.

    
398
2018-12-07 05: 57: 27Z
  1. gitk --all $(git reflog | cut -c1-7)& może być pomocny w znalezieniu poprzedniej wersji, jeśli chcesz cofnąć zatwierdzenie '--amend'.
    2014-10-18 23: 38: 11Z
  2. Należy zauważyć, że jeśli próbujesz usunąć tajne informacje przed przesunięciem do udostępnionego repozytorium, wykonanie przywrócenia nie pomoże, ponieważ informacje będą nadal być w historii w poprzednim zatwierdzeniu. Jeśli chcesz mieć pewność, że zmiana nigdy nie będzie widoczna dla innych, musisz użyć git reset
    2015-09-04 04: 52: 01Z
  3. 2016-04-05 04: 20: 04Z
  4. Myślę, że 'private' /'public' będzie bardziej poprawnie 'local' /'remote'.
    2018-03-28 14: 59: 27Z
  5. Poprawienie prywatnej gałęzi w zdalnym repozytorium można również wykonać po prostu git push origin (branch_name) --force
    2018-09-07 12: 09: 38Z

Jeśli popełniłeś śmieci, ale nie zostałeś pchnięty,

 
git reset --soft HEAD~1
  

HEAD ~ 1 to skrót od zatwierdzenia przed głową. Alternatywnie możesz odwołać się do SHA-1 skrótu, jeśli chcesz go zresetować. Opcja --soft usunie zatwierdzenie, ale pozostawi wszystkie zmienione pliki „Zmiany do zatwierdzenia”, jak określiłby to stan git.

     

Jeśli chcesz pozbyć się zmian w śledzonych plikach w drzewie roboczym, ponieważ zatwierdzenie przed głową użyj zamiast tego „ --hard ”.

LUB

  

Jeśli już pchnąłeś i ktoś wyciągnął, co jest zazwyczaj moim przypadkiem, nie możesz użyć git reset . Możesz jednak wykonać git revert ,

 
git revert HEAD
  

Spowoduje to utworzenie nowego zatwierdzenia, które odwraca wszystko wprowadzone przez przypadkowe zatwierdzenie.

    
319
2014-09-25 07: 58: 25Z
  1. Jestem w drugim przypadku, ale kiedy robię "git przywróć HEAD" to mówi "błąd: Zatwierdź [ID] to scalenie, ale nie było opcji -m fatal: revert failed ”. Wszelkie sugestie?
    2014-11-12 19: 36: 02Z
  2. Prawdopodobnie warto wspomnieć, że zamiast HEAD~1 można użyć rzeczywistego skrótu wyświetlanego przez git log --stat lub git reflog - przydatne, gdy trzeba „cofnąć” więcej niż jedno zatwierdzenie.
    2014-12-07 00: 38: 49Z

    Jeśli chcesz trwale cofnąć to i sklonowałeś jakieś repozytorium

    Identyfikator zatwierdzenia można zobaczyć za pomocą

     
    git log 
    

    Wtedy możesz to zrobić -

     
    git reset --hard <commit_id>
    
    git push origin <branch_name> -f
    
        
    316
    2015-06-24 09: 34: 15Z
    1. Co jeśli nie użyjesz "< commit_id >" i po prostu użyj „git reset --hard”? Zazwyczaj po prostu chcę pozbyć się moich najnowszych aktualizacji, których jeszcze nie zatwierdziłem, i wróciłem do najnowszego zatwierdzenia, które zrobiłem, i zawsze używam „git reset --hard”.
      2017-09-27 23: 30: 18Z
    2. @ JaimeMontoya Aby cofnąć ostatnie zmiany, możesz użyć git reset --hard, ale jeśli musisz mocno usunąć ostatnie „n”, zatwierdzasz SHA
      2017-09-28 13: 10: 31Z

    Na SourceTree (GUI dla GitHub) możesz kliknąć prawym przyciskiem myszy zatwierdzenie i wykonać „Odwrócenie zatwierdzenia” ” To powinno cofnąć zmiany.

    Na terminalu:

    Możesz też użyć:

     
    git revert
    

    Lub:

     
    git reset --soft HEAD^ # Use --soft if you want to keep your changes.
    git reset --hard HEAD^ # Use --hard if you don't care about keeping your changes.
    
        
    269
    2015-06-24 09: 34: 11Z

    Pojedyncze polecenie:

     
    git reset --soft 'HEAD^' 
    

    Działa świetnie, aby cofnąć ostatnie zatwierdzenie lokalne!

        
    250
    2014-07-21 20: 13: 34Z
    1. Potrzebowałem napisać git reset --soft "HEAD ^" z podwójnymi cudzysłowami, ponieważ piszę to z wiersza poleceń Windows.
      2014-04-23 09: 13: 35Z
    2. Powinien działać bez cytatów.
      2016-11-10 19: 19: 44Z

    Zresetuj go, wykonując poniższe polecenie używając git:

     
    git reset --soft HEAD~1
    

    Wyjaśnij: co robi git reset, to w zasadzie reset dla każdego zatwierdzenia, do którego chcesz wrócić, a jeśli połączysz go z kluczem --soft, to wróci, ale zachowaj zmiany w twój plik (i), więc wracasz do etapu, na którym właśnie został dodany plik, HEAD jest głową oddziału, a jeśli łączysz się z ~1 (w tym przypadku używasz również HEAD^), to powróci tylko jedno zatwierdzenie co chcesz ...

    Tworzę kroki na obrazku poniżej, bardziej szczegółowo, łącznie ze wszystkimi krokami, które mogą się zdarzyć w rzeczywistych sytuacjach i zatwierdzając kod:

     Jak cofnąć ostatnie zatwierdzenia w Git?

        
    241
    2017-10-27 12: 46: 34Z

    Jak cofnąć ostatnie zatwierdzenie Git?

    Aby przywrócić wszystko do stanu sprzed ostatniego zatwierdzenia, musimy zresetować do zatwierdzenia przed HEAD.

    1. Jeśli nie chcesz zachować wprowadzonych zmian:

       
      git reset --hard HEAD^
      
    2. Jeśli chcesz zachować zmiany:

       
      git reset --soft HEAD^
      

    Teraz sprawdź swój dziennik git. Pokaże, że nasze ostatnie zatwierdzenie zostało usunięte.

        
    223
    2017-03-25 08: 14: 01Z

    Użyj reflog, aby znaleźć poprawny stan

     
    git reflog
    

    reflog przed REFLOG BEF RESET

    Wybierz poprawny reflog (w moim przypadku f3cb6e2) i wpisz

     
    git reset --hard f3cb6e2
    

    Po tym repo HEAD zostanie zresetowane do tego HEADid resetowanie efektu ZALOGUJ SIĘ PONOWNIE

    Wreszcie reflog wygląda jak na poniższym obrazku

    reflog after REFLOG FINAL

        
    180
    2014-01-06 22: 34: 06Z

    „Zresetuj drzewo robocze do ostatniego zatwierdzenia„

     
    git reset --hard HEAD^ 
    

    „Wyczyść nieznane pliki z drzewa roboczego”

     
    git clean    
    

    zobacz - Szybki przegląd Git

    UWAGA: to polecenie usunie poprzednie zatwierdzenie, więc używaj go ostrożnie! git reset --hard jest bezpieczniejszy -

        
    173
    2017-12-13 22: 04: 48Z

    Pierwsze uruchomienie:

     
    git reflog
    

    Pokaże ci wszystkie możliwe akcje, które wykonałeś w swoim repozytorium, na przykład zatwierdzanie, scalanie, ściąganie itd.

    Następnie wykonaj:

     
    git reset --hard ActionIdFromRefLog
    
        
    156
    2015-06-24 09: 33: 20Z

    Cofnij ostatnie zatwierdzenie:

    git reset --soft HEAD^ lub git reset --soft HEAD~

    Spowoduje to cofnięcie ostatniego zatwierdzenia.

    Tutaj --soft oznacza zresetowanie do przemieszczania.

    HEAD~ lub HEAD^ oznacza przejście do zatwierdzenia przed HEAD.


    Zastąp ostatnie zatwierdzenie nowym zatwierdzeniem:

     
    git commit --amend -m "message"
    

    Zastąpi ostatnie zatwierdzenie nowym zatwierdzeniem.

        
    148
    2017-12-13 22: 05: 20Z

    Inny sposób:

    Sprawdź gałąź, którą chcesz przywrócić, a następnie zresetuj lokalną kopię roboczą z powrotem do zatwierdzenia, które ma być najnowszą na serwerze zdalnym (wszystko po tym, jak się obejdzie). Aby to zrobić, w SourceTree kliknąłem prawym przyciskiem myszy i wybrałem opcję „Zresetuj BRANCHNAME do tego zatwierdzenia”.

    Następnie przejdź do lokalnego katalogu repozytorium i uruchom to polecenie:

     
    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 tej jednej gałęzi.

        
    143
    2015-06-24 09: 34: 21Z

    Wpisz git log i znajdź ostatni kod skrótu zatwierdzania, a następnie wprowadź:

     
    git reset <the previous co>
    
        
    134
    2015-06-24 09: 34: 18Z

    W moim przypadku przypadkowo popełniłem kilka plików, których nie chciałem. Zrobiłem więc to i zadziałało:

     
    git reset --soft HEAD^
    git rm --cached [files you do not need]
    git add [files you need]
    git commit -c ORIG_HEAD
    

    Zweryfikuj wyniki za pomocą gitk lub git log --stat

        
    130
    2015-06-24 09: 34: 09Z

    Proste, uruchom to w linii poleceń:

     
    git reset --soft HEAD~ 
    
        
    121
    2016-01-18 21: 58: 33Z

    Jest wiele sposobów, aby to zrobić:

    Polecenie Git, aby cofnąć ostatnie zatwierdzenie /poprzednie zatwierdzenia:

    Ostrzeżenie: nie używaj - ciężko, jeśli nie wiesz, co robisz. - Trudne jest zbyt niebezpieczne i może usunąć twoje pliki.

    Podstawowe polecenie przywrócenia zatwierdzenia w Git:

     
    $ git reset --hard <COMMIT -ID>
    

    lub

     
    $ git reset --hard HEAD~<n>
    

    ID COMMIT : identyfikator zatwierdzenia

    n: to liczba ostatnich zatwierdzeń, które chcesz przywrócić

    Możesz uzyskać identyfikator zatwierdzenia, jak pokazano poniżej:

     
    $ **git log --oneline**
    
    d81d3f1 function to subtract two numbers
    
    be20eb8 function to add two numbers
    
    bedgfgg function to mulitply two numbers
    

    gdzie d81d3f1 i be20eb8 to identyfikator zatwierdzenia.

    Zobaczmy teraz kilka przypadków:

    Załóżmy, że chcesz przywrócić ostatnie zatwierdzenie „d81d3f1”. Oto dwie opcje:

     
    $ git reset --hard d81d3f1
    

    lub

     
    $ git reset --hard HEAD~1
    

    Załóżmy, że chcesz przywrócić zatwierdzenie „be20eb8”:

     
    $ git reset --hard be20eb8
    

    Aby uzyskać bardziej szczegółowe informacje, możesz odwołać się i wypróbować inne polecenia, aby zresetować głowę do określonego stanu:

     
    $ git reset --help
    
        
    119
    2018-08-19 14: 00: 16Z
    1. git reset --hard HEAD~1 jest zbyt niebezpieczny ! To nie tylko „anuluje ostatnie zatwierdzenie”, ale przywróci repo całkowicie z powrotem do poprzedniego zatwierdzenia. Będziesz więc LOSUJE wszystkie zmiany wprowadzone w ostatnim zatwierdzeniu!
      2017-03-21 12: 09: 47Z
    2. Masz rację, aby cofnąć to możesz użyć git push -f <remote> HEAD@{1}:<branch>
      2017-04-24 13: 07: 03Z
    3. Niestety używam --hard, a moje pliki są usuwane! Najpierw nie sprawdziłem komentarza, ponieważ został zwinięty. Nie używaj - hard, jeśli nie wiesz, co robisz!
      2018-08-19 13: 53: 17Z

    Dla lokalnego zatwierdzenia

     
    git reset --soft HEAD~1
    

    lub jeśli nie pamiętasz dokładnie, w którym akcie jest, możesz użyć

     
    git rm --cached <file>
    

    For pchane zatwierdzenie

    Właściwym sposobem usuwania plików z historii repozytorium jest użycie git filter-branch. To znaczy

     
    git filter-branch --index-filter 'git rm --cached <file>' HEAD
    

    Zalecam jednak ostrożne używanie tego polecenia. Przeczytaj więcej na git-filter-branch (1) Manual Page .

        
    117
    2014-07-21 20: 15: 08Z

    Istnieją dwa główne scenariusze

    Nie przekazałeś jeszcze zatwierdzenia

    Jeśli problem polegał na dodatkowych plikach, które zatwierdziłeś (a nie chcesz ich w repozytorium), możesz je usunąć za pomocą git rm, a następnie zatwierdzić za pomocą --amend

     
    git rm <pathToFile>
    

    Możesz także usuwać całe katalogi za pomocą -r, a nawet łączyć się z innymi poleceniami Bash

     
    git rm -r <pathToDirectory>
    git rm $(find -name '*.class')
    

    Po usunięciu plików możesz zatwierdzić opcję --amend

     
    git commit --amend -C HEAD # the -C option is to use the same commit message
    

    Spowoduje to przepisanie twojego ostatniego zatwierdzenia lokalnego, usuwając dodatkowe pliki, więc te pliki nigdy nie będą wysyłane w trybie push, a także zostaną usunięte z lokalnego repozytorium .git przez GC.

    Przesunąłeś już zatwierdzenie

    Możesz zastosować to samo rozwiązanie w drugim scenariuszu, a następnie wykonać git push z opcją -f, ale nie jest zalecane , ponieważ nadpisuje zdalną historię z rozbieżną zmianą (może zepsuć Twoje repozytorium ).

    Zamiast tego musisz wykonać zatwierdzenie bez --amend (pamiętaj o tym o -amend`: ta opcja przepisuje historię przy ostatnim zatwierdzeniu).

        
    117
    2016-01-11 23: 50: 47Z

    Aby zresetować poprzednią wersję, trwale usuwając wszystkie niezatwierdzone zmiany:

     
    git reset --hard HEAD~1
    
        
    117
    2016-09-16 07: 25: 01Z
    1. Może mógłbyś zanotować /ostrzec, że jego polecenie wyrzuci commit i zmiany w katalogu roboczym bez zadawania dalszych pytań.
      2014-11-24 22: 35: 29Z
    2. 2014-11-24 22: 40: 57Z
    3. Użyj --soft, aby zachować zmiany jako uncommitted changes, --hard, aby całkowicie zniszczyć zatwierdzenie i cofnąć je o jeden. Pamiętaj, aby wykonywać takie operacje tylko w przypadku zmian, które nie zostały jeszcze wciśnięte.
      2015-03-09 09: 11: 06Z
    4. @ Zaz: Masz rację; może powinienem był to wyjaśnić. Tylko pliki /zmiany, które zostały dodane do indeksu (/staged) lub zostały zatwierdzone, mogą zostać odzyskane. Niezatwierdzone, niezrealizowane zmiany , jak powiedziałeś, całkowicie odrzucone przez git reset --hard.
      2016-09-13 21: 17: 10Z
    5. Jako komentarz: Za każdym razem, gdy plik jest wystawiany, git przechowuje jego zawartość w swojej bazie danych obiektów. Zapisana zawartość jest usuwana tylko podczas wykonywania czyszczenia pamięci. Możliwe jest więc odzyskanie ostatniej wersji pliku, który nie był aktualnie wystawiany, gdy git reset --hard został wykonany (więcej informacji można znaleźć w postach powyżej).
      2016-09-13 21: 22: 52Z
źródło umieszczone tutaj