Przypadkowo przesłałem niewłaściwe pliki do Git , ale jeszcze nie wysłałem zatwierdzenia na serwer.
Jak mogę cofnąć te zatwierdzenia z lokalnego repozytorium?
git
version-control
git-commit
undo
pre-commit
Peter Mortensen
źródło
źródło
git undo
, Otóż to. Wtedy git ma reputację za radzenie sobie z błędami popełnianymi przez nas, zwykli śmiertelnicy znika. Zaimplementuj, wypychając bieżący stan na stos git przed wykonaniem jakiegokolwiekgit
polecenia. Wpłynęłoby to na wydajność, więc najlepiej byłoby dodać flagę config, aby włączyć.alias
funkcji Gita : git-scm.com/book/en/v2/Git-Basics-Git-Aliasesgit reflog
jest już blisko tego, co opisujesz, ale daje użytkownikowi większą kontrolę nad tym, co należy (nie) zrobić. Ale proszę, nie, „cofnij” nie działa wszędzie tak samo, a ludzie oczekiwaliby wielu różnych rzeczy do osiągnięcia przez tę funkcję. Cofnąć ostatnie zatwierdzenie? Cofnąć ostatnią akcję? Jeśli ostatnią czynnością było push, cofnij jak dokładnie (reset i push) lub (cofnij i push)?Odpowiedzi:
Cofnij zatwierdzenie i ponów
git status
, więc musisz dodaj je ponownie przed zatwierdzeniem). Jeśli tylko chcesz dodać więcej zmian do poprzedniego popełnić, lub zmienić popełnić wiadomość 1 , można użyćgit reset --soft HEAD~
zamiast tego, który jest jakgit reset HEAD~
2 , ale pozostawia istniejące zmiany wystawił.git add
wszystko, co chcesz dołączyć do nowego zatwierdzenia.reset
skopiował starą głowę.git/ORIG_HEAD
;commit
za pomocą-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 skorzystać z tej-C
opcji.Pamiętaj jednak, że jeśli dodałeś jakieś nowe zmiany do indeksu, użycie
commit --amend
spowoduje dodanie ich do poprzedniego zatwierdzenia.Jeśli kod został już przesłany na Twój serwer i masz uprawnienia do zastąpienia historii (rebase), to:
Możesz także spojrzeć na tę odpowiedź:
Jak mogę przenieść HEAD z powrotem do poprzedniej lokalizacji? (Odłączona głowa) i Cofnij zatwierdza
Powyższa odpowiedź pokaże,
git reflog,
który służy do ustalenia, czym jest SHA-1, który chcesz cofnąć. Po znalezieniu punktu, do którego chcesz cofnąć, użyj sekwencji poleceń, jak wyjaśniono powyżej.1 Pamiętaj jednak, że nie musisz resetować do wcześniejszego zatwierdzenia, jeśli popełniłeś błąd w komunikacie zatwierdzenia .
git reset
Najłatwiejszą opcją jest (aby odetrzeć wszelkie zmiany, które wprowadziłeś od tego czasu), a następniegit commit --amend
, który otworzy domyślny edytor komunikatów zatwierdzania wypełniony ostatnią wiadomością zatwierdzenia.2
HEAD~
to to samo coHEAD~1
. Zobacz także Co to jest HEAD w git? . Jest to przydatne, jeśli chcesz anulować wiele zatwierdzeń.źródło
git checkout theRightBranch
ze wszystkimi etapami zmian. Tak jak musiałem to zrobić.git reset --soft HEAD^
musisz użyćgit reset --soft HEAD~1
. ^ To znak kontynuacji w DOS, więc nie będzie działał poprawnie. Ponadto,--soft
jest domyślne, dzięki czemu można go pominąć, jeśli chcesz i po prostu powiedziećgit reset HEAD~1
.zsh: no matches found: HEAD^
- musisz uciec ^ iegit reset --soft HEAD\^
git commit -a
gdy-a
została pominięta. W takim przypadku lepiej nie pomijać--soft
(co spowoduje, że będzie--mixed
to ustawienie domyślne), a następnie możesz zrezygnować ze zmian, które chciałeś zatwierdzić.git add [--verbose | -v] [--dry-run | -n] [--force | -f] [--interactive | -i] [--patch | -p] [--edit | -e] [--[no-]all | --[no-]ignore-removal | [--update | -u]] [--intent-to-add | -N] [--refresh] [--ignore-errors] [--ignore-missing] [--chmod=(+|-)x] [--] [<pathspec>…]
Cofanie zatwierdzenia jest trochę przerażające, jeśli nie wiesz, jak to działa. Ale to naprawdę niezwykle proste, jeśli rozumiesz.
Powiedzmy, że masz to, gdzie C to HEAD, a (F) to stan twoich plików.
Chcesz nuke zatwierdzić C i nigdy więcej go nie widzieć i stracić wszystkie zmiany w lokalnie zmodyfikowanych plikach . Robisz to:
Wynik to:
Teraz B jest GŁOWĄ. Ponieważ użyłeś
--hard
, twoje pliki są resetowane do stanu w zatwierdzeniu B.Ach, ale załóżmy, że popełnienie C nie było katastrofą, ale tylko odrobiną. Chcesz cofnąć zatwierdzenie, ale zachowaj zmiany w celu trochę edycji przed wykonaniem lepszego zatwierdzenia. Zaczynając odtąd od nowa, z C jako GŁOWĄ:
Możesz to zrobić, pomijając
--hard
:W takim przypadku wynikiem jest:
W obu przypadkach HEAD jest tylko wskaźnikiem do ostatniego zatwierdzenia. Kiedy zrobisz a
git reset HEAD~1
, każesz Gitowi przesunąć wskaźnik HEAD do tyłu o jeden zatwierdzenie. Ale (chyba że używasz--hard
) pozostawiasz swoje pliki takie, jakie były. Terazgit status
pokazuje zmiany, które zameldowałeś w C. Nic nie straciłeś!Dla najlżejszego dotyku możesz nawet cofnąć zatwierdzenie, ale zostawić swoje pliki i indeks :
To nie tylko pozostawia pliki w spokoju, ale nawet sam indeks . Gdy to zrobisz
git status
, zobaczysz, że te same pliki znajdują się w indeksie jak poprzednio. W rzeczywistości, zaraz po tym poleceniu, możesz to zrobićgit commit
i będziesz powtarzać to samo zatwierdzenie, które właśnie wykonałeś.Jeszcze jedno: Załóżmy, że niszczysz zatwierdzenie jak w pierwszym przykładzie, ale potem odkryłeś, że w końcu go potrzebujesz ? Pech, prawda?
Nie, wciąż istnieje sposób na odzyskanie go. Wpisz,
git reflog
a zobaczysz listę (częściowych) zatwierdzeń shas (czyli skrótów ), w których się przeprowadzałeś. Znajdź zniszczone zatwierdzenie i zrób to:Wskrzesiłeś to zatwierdzenie. Zobowiązania w rzeczywistości nie są niszczone w Git przez około 90 dni, więc zazwyczaj możesz wrócić i uratować jeden, którego nie chciałeś się pozbyć.
źródło
git reset --hard~1
skieruje gałąź master do ostatniego zatwierdzenia w gałęzi feature. W takim przypadku zamiast polecenia względnego należy użyć konkretnego identyfikatora zatwierdzenia.--hard
ale nie zdawałem sobie sprawy, że wszystkie moje nieustawione zmiany w moim drzewie roboczym również zostały zniszczone! Zamierzałem zatwierdzić te pliki w ramach późniejszego zatwierdzenia. Teraz odzyskanie tych plików wydaje się niemożliwe - próbowałem nawet rozwiązania, o którym napisałeś,reflog
ale nie przywróciło to wcześniej nieustawionych zmian.Istnieją dwa sposoby „cofnięcia” ostatniego zatwierdzenia, w zależności od tego, czy opublikowałeś już swoje zatwierdzenie (przekazane do zdalnego repozytorium):
Jak cofnąć zatwierdzenie lokalne
Powiedzmy, że popełniłem lokalnie, ale teraz chcę usunąć to zatwierdzenie.
Aby przywrócić wszystko do stanu sprzed ostatniego zatwierdzenia, musimy
reset
wykonać zatwierdzenie przedHEAD
:Teraz
git log
pokaże, że nasze ostatnie zatwierdzenie zostało usunięte.Jak cofnąć publiczne zatwierdzenie
Jeśli już opublikowałeś swoje zatwierdzenia, będziesz chciał utworzyć nowe zatwierdzenie, które „cofnie” zmiany, które wprowadziłeś w poprzednim zatwierdzeniu (bieżący HEAD).
Twoje zmiany zostaną teraz przywrócone i będą gotowe do zatwierdzenia:
Aby uzyskać więcej informacji, zobacz Git Basics - Undoing Things .
źródło
git revert HEAD^
nie jest poprzedni, jest poprzedni z poprzednich. Zrobiłem:git revert HEAD
a potem ponownieDodaj / usuń pliki, aby uzyskać pożądany efekt:
Następnie zmień zatwierdzenie:
Poprzednie, błędne zatwierdzenie zostanie edytowane w celu odzwierciedlenia nowego stanu indeksu - innymi słowy, będzie tak, jakbyś nigdy nie popełnił błędu.
Pamiętaj, że powinieneś to zrobić tylko wtedy, gdy jeszcze nie naciskałeś. Jeśli nacisnąłeś, musisz po prostu naprawić normalnie.
źródło
git rm --cached
do przechowywania plików w systemie plików i usuwania ich tylko z indeksu git!lub
Ostrzeżenie: powyższe polecenie spowoduje trwałe usunięcie modyfikacji
.java
plików (i wszelkich innych plików), które chcesz zatwierdzić.hard reset
AbyHEAD-1
ustawi swoją kopię roboczą do stanu popełnić zanim źle popełnić.źródło
git commit -a -m ""
lubgit commit -am ""
naturalnie! :]git stash
, a następniegit stash pop
Aby zmienić ostatnie zatwierdzenie
Zamień pliki w indeksie:
Następnie, jeśli jest to oddział prywatny, zmień zatwierdzenie:
Lub, jeśli jest to gałąź współdzielona, dokonaj nowego zatwierdzenia:
( Aby zmienić poprzednie zatwierdzenie , użyj niesamowitej interaktywnej bazy .)
ProTip ™: Dodaj
*.class
do gitignore, aby przestało się to powtarzać.Aby cofnąć zatwierdzenie
Zmiana zatwierdzenia jest idealnym rozwiązaniem, jeśli chcesz zmienić ostatnie zatwierdzenie, ale bardziej ogólne jest rozwiązanie
reset
.Możesz zresetować Git do dowolnego zatwierdzenia za pomocą:
Gdzie
N
jest liczba wcześniejszych zatwierdzeńHEAD
i@~
resetuje się do poprzedniego zatwierdzenia.Zamiast zmiany zatwierdzenia możesz użyć:
Sprawdź
git help reset
, w szczególności sekcje--soft
--mixed
i--hard
, aby lepiej zrozumieć, co to robi.Zarejestruj się
Jeśli się zepsujesz, zawsze możesz użyć dziennika, aby znaleźć odrzucone zatwierdzenia:
źródło
git revert
jest to osobne polecenie - które w zasadzie „resetuje” pojedyncze polecenie.Zastosowanie
git revert <commit-id>
.Aby uzyskać identyfikator zatwierdzenia, po prostu użyj
git log
.źródło
git revert commit-id
działał jak urok. Oczywiście wtedy będziesz musiał wprowadzić zmiany.git cherry-pick <<erroneous-commit-sha>>
@astronomerdave. Od pana prawie 2 lata spóźnionego na przyjęcie.Jeśli planujesz całkowicie cofnąć zatwierdzenie lokalne, cokolwiek zmieniłeś, zrobiłeś to, a jeśli nie martwisz się tym, po prostu wykonaj następujące polecenie.
(To polecenie zignoruje całe zatwierdzenie, a zmiany zostaną całkowicie utracone z lokalnego drzewa roboczego). Jeśli chcesz cofnąć zatwierdzenie, ale chcesz zmiany w obszarze testowym (przed zatwierdzeniem, podobnie jak po
git add
), wykonaj następujące polecenie.Teraz zatwierdzone pliki trafiają do obszaru przejściowego. Załóżmy, że chcesz zmodyfikować pliki, ponieważ musisz edytować niewłaściwą zawartość, a następnie wykonaj następujące polecenie
Teraz zatwierdzono pliki, które mają pochodzić z obszaru przejściowego do obszaru niestopowego. Teraz pliki są gotowe do edycji, więc bez względu na to, co zmienisz, chcesz edytować i dodać go i dokonać nowego / nowego zatwierdzenia.
Więcej
źródło
Jeśli masz zainstalowane Git Extras , możesz uruchomić,
git undo
aby cofnąć ostatnie zatwierdzenie.git undo 3
cofnie ostatnie trzy zmiany.źródło
Chciałem cofnąć ostatnie pięć zatwierdzeń w naszym wspólnym repozytorium. Odszukałem identyfikator wersji, do której chciałem przywrócić. Następnie wpisałem następujące.
źródło
Wolę używać
git rebase -i
do tego zadania, ponieważ pojawia się ładna lista, w której mogę wybrać zatwierdzenia do pozbycia się. To może nie być tak bezpośrednie jak niektóre inne odpowiedzi tutaj, ale wydaje się właściwe .Wybierz, ile zatwierdzeń chcesz wyświetlić, a następnie wywołaj w ten sposób (aby zapisać ostatnie trzy)
Przykładowa lista
Następnie Git usunie zatwierdzenia dla każdej linii, którą usuniesz.
źródło
Jak naprawić poprzedni lokalny zatwierdzenie
Użyj git-gui (lub podobnego), aby wykonać
git commit --amend
. Z GUI można dodawać lub usuwać pojedyncze pliki z zatwierdzenia. Możesz także zmodyfikować komunikat zatwierdzenia.Jak cofnąć poprzednie zatwierdzenie lokalne
Po prostu zresetuj swój oddział do poprzedniej lokalizacji (na przykład za pomocą
gitk
lubgit rebase
). Następnie ponownie zastosuj zmiany z zapisanej kopii. Po wyrzuceniu elementów bezużytecznych w lokalnym repozytorium będzie tak, jakby niechciane zatwierdzenie nigdy się nie wydarzyło. Aby zrobić to wszystko w jednym poleceniu, użyjgit reset HEAD~1
.Słowo ostrzeżenia : Nieostrożne użycie
git reset
jest dobrym sposobem na wprowadzenie w błąd kopii roboczej. Zalecam, aby nowicjusze Git unikali tego, jeśli mogą.Jak cofnąć publiczne zatwierdzenie
Wykonaj odwrotne wybieranie cherry ( git-revert ), aby cofnąć zmiany.
Jeśli nie wprowadziłeś jeszcze innych zmian w swoim oddziale, możesz po prostu zrobić ...
Następnie przekaż zaktualizowaną gałąź do wspólnego repozytorium.
Historia zatwierdzeń pokaże oba zatwierdzenia, osobno .
Zaawansowane: Korekta oddziału prywatnego w publicznym repozytorium
Może to być niebezpieczne - upewnij się, że masz lokalną kopię oddziału, aby ją obsadzić.
Uwaga: nie chcesz tego robić, jeśli ktoś inny może pracować nad oddziałem.
Oczyść swój oddział lokalnie, a następnie powtórz ...
W normalnym przypadku prawdopodobnie nie musisz się martwić, że historia zatwierdzeń w prywatnym oddziale jest nieskazitelna. Po prostu wciśnij uzupełniające zatwierdzenie (patrz „Jak cofnąć publiczne zatwierdzenie” powyżej), a następnie wykonaj scalanie squash, aby ukryć historię.
źródło
gitk --all $(git reflog | cut -c1-7)&
może być pomocny w znalezieniu poprzedniej wersji, jeśli chcesz cofnąć zatwierdzenie „--amend”.git reset
git push origin (branch_name) --force
Jeśli chcesz go trwale cofnąć i sklonowałeś pewne repozytorium
Identyfikator zatwierdzenia może być widoczny przez
Następnie możesz zrobić -
źródło
git reset --hard
, ale jeśli musisz mocno usunąć ostatnie „n” zobowiązania, określ SHAJeśli popełniłeś śmieci, ale nie wypchnąłeś ich,
LUB
źródło
HEAD~1
ciebie możesz użyć rzeczywistego skrótu wyświetlanego przezgit log --stat
lub przezgit reflog
- przydatne, gdy musisz „cofnąć” więcej niż jeden zatwierdzenie.W SourceTree (GUI dla GitHub) możesz kliknąć zatwierdzenie prawym przyciskiem myszy i wykonać polecenie „Odwróć zatwierdzenie”. To powinno cofnąć twoje zmiany.
Na terminalu:
Możesz alternatywnie użyć:
Lub:
źródło
Jedno polecenie:
Świetnie działa cofnięcie ostatniego zatwierdzenia lokalnego!
źródło
Po prostu zresetuj go wykonując poniższe polecenie, używając
git
:Wyjaśnij: co
git reset
robi, to w zasadziereset
do każdego zatwierdzenia, do którego chcesz wrócić, a następnie, jeśli połączysz go z--soft
kluczem, wróci, ale zachowaj zmiany w swoich plikach, abyś wrócił na scenę który właśnie został dodany plik,HEAD
jest głową gałęzi, a jeśli połączysz się z~1
(w tym przypadku również użyjeszHEAD^
), cofnie tylko jedno zatwierdzenie, które chcesz ...Kroki na obrazku poniżej tworzę bardziej szczegółowo, w tym wszystkie kroki, które mogą się zdarzyć w rzeczywistych sytuacjach i zatwierdzenie kodu:
źródło
Jak cofnąć ostatnie zatwierdzenie Git?
Aby przywrócić wszystko do stanu sprzed ostatniego zatwierdzenia, musimy zresetować do zatwierdzenia przed HEAD.
Jeśli nie chcesz zachować wprowadzonych zmian:
Jeśli chcesz zachować zmiany:
Teraz sprawdź swój dziennik git. Pokaże, że nasze ostatnie zatwierdzenie zostało usunięte.
źródło
„Zresetuj działające drzewo do ostatniego zatwierdzenia”
„Wyczyść nieznane pliki z działającego drzewa”
patrz - Git Quick Reference
UWAGA: To polecenie spowoduje usunięcie poprzedniego zatwierdzenia, więc używaj go ostrożnie!
git reset --hard
jest bezpieczniejszy.źródło
Użyj reflog, aby znaleźć poprawny stan
REFLOG PRZED RESETOWANIEM
Wybierz prawidłowy dziennik rejestrowania (w moim przypadku f3cb6e2) i wpisz
Po tym GŁOWICA repo zostanie zresetowana do REJESTRATORA PO ZERECIE
Wreszcie dziennik wygląda jak na poniższym obrazku
OSTATECZNY REFLOG
źródło
Pierwszy bieg:
Wyświetli wszystkie możliwe działania, które wykonałeś w swoim repozytorium, na przykład zatwierdzenie, scalenie, ściągnięcie itp.
Następnie wykonaj:
źródło
Cofnij ostatnie zatwierdzenie:
git reset --soft HEAD^
lubgit reset --soft HEAD~
Spowoduje to cofnięcie ostatniego zatwierdzenia.
Tutaj
--soft
oznacza reset do inscenizacji.HEAD~
lubHEAD^
oznacza przejście do zatwierdzenia przed HEAD.Zamień ostatnie zatwierdzenie na nowe zatwierdzenie:
Zastąpi ostatnie zatwierdzenie nowym zatwierdzeniem.
źródło
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ę:
Spowoduje to usunięcie wszystkich zatwierdzeń po bieżącym w lokalnym repozytorium, ale tylko dla tego jednego oddziału.
źródło
Wpisz
git log
i znajdź kod skrótu ostatniego zatwierdzenia, a następnie wprowadź:źródło
W moim przypadku przypadkowo popełniłem niektóre pliki, których nie chciałem. Więc zrobiłem następujące i zadziałało:
Sprawdź wyniki za pomocą gitk lub git log --stat
źródło
Proste, uruchom to w linii poleceń:
źródło
Można to zrobić na wiele sposobów:
Polecenie Git, aby cofnąć ostatnie zatwierdzenie / poprzednie zatwierdzenie:
Ostrzeżenie: Nie używaj - twarde, jeśli nie wiesz, co robisz. --hard jest zbyt niebezpieczny i może usunąć twoje pliki.
Podstawowe polecenie przywrócenia zatwierdzenia w Git to:
lub
COMMIT-ID : identyfikator zatwierdzenia
n: jest liczbą ostatnich zatwierdzeń, które chcesz przywrócić
Możesz uzyskać identyfikator zatwierdzenia, jak pokazano poniżej:
gdzie d81d3f1 i be20eb8 są identyfikatorami zatwierdzeń.
Zobaczmy teraz kilka przypadków:
Załóżmy, że chcesz cofnąć ostatnie zatwierdzenie „d81d3f1”. Oto dwie opcje:
lub
Załóżmy, że chcesz cofnąć zatwierdzenie „be20eb8”:
Aby uzyskać bardziej szczegółowe informacje, możesz odwołać się i wypróbować również inne polecenia do resetowania głowicy do określonego stanu:
źródło
git reset --hard HEAD~1
jest zbyt niebezpieczne ! To nie tylko „anuluje ostatnie zatwierdzenie”, ale całkowicie przywróci repo z powrotem do poprzedniego zatwierdzenia. W ten sposób utracisz wszystkie zmiany wprowadzone w ostatnim zatwierdzeniu!git push -f <remote> HEAD@{1}:<branch>
Do zatwierdzenia lokalnego
lub jeśli nie pamiętasz dokładnie, w jakim to jest zatwierdzeniu, możesz użyć
Dla wciśniętego zatwierdzenia
Stosuje się właściwy sposób usuwania plików z historii repozytorium
git filter-branch
. To jest,Ale zalecam ostrożne używanie tego polecenia. Czytaj więcej na stronie podręcznika git-filter-branch (1) .
źródło
Istnieją dwa główne scenariusze
Nie nacisnąłeś jeszcze zatwierdzenia
Jeśli problemem były dodatkowe pliki, które zatwierdziłeś (i nie chcesz ich w repozytorium), możesz je usunąć za pomocą,
git rm
a następnie zatwierdzić za pomocą--amend
Możesz także usuwać całe katalogi
-r
, a nawet łączyć się z innymi poleceniami BashPo usunięciu plików możesz zatwierdzić, używając opcji --amend
Spowoduje to przepisanie ostatniego lokalnego zatwierdzenia usunięcia dodatkowych plików, więc pliki te nigdy nie będą wysyłane w trybie wypychania, a także zostaną usunięte z lokalnego repozytorium .git przez GC.
Przesunąłeś już zatwierdzenie
Możesz zastosować to samo rozwiązanie z drugiego scenariusza, a następnie zrobić to
git push
z-f
opcją, ale nie jest to zalecane, ponieważ zastępuje ono zdalną historię rozbieżną zmianą (może zepsuć repozytorium).Zamiast tego musisz wykonać zatwierdzenie bez
--amend
(pamiętaj o tym -amend`: Ta opcja przepisuje historię ostatniego zatwierdzenia).źródło
Aby przywrócić poprzednią wersję, trwale usuwając wszystkie niezatwierdzone zmiany:
źródło
--soft
aby zachować zmiany jakouncommitted changes
,--hard
aby całkowicie anulować zatwierdzenie i cofnąć się o jedną. Pamiętaj, aby wykonywać takie operacje tylko na zmianach, które nie zostały jeszcze wprowadzone.git reset --hard
.git
zapisuje jego zawartość w swojej bazie danych obiektów. Zapisana zawartość jest usuwana tylko wtedy, gdy wykonywane jest czyszczenie pamięci. Dlatego możliwe jest odzyskanie ostatniej wersji pliku, który nie był aktualnie przemieszczany w momenciegit reset --hard
wykonania (więcej informacji znajduje się w linkach powyżej).