Czy można cofnąć zmiany spowodowane następującym poleceniem? Jeśli tak to jak?
git reset --hard HEAD~1
git
version-control
git-reset
Paul Wicks
źródło
źródło
--hard
odrzuca niezatwierdzone zmiany. Ponieważ nie są one śledzone przez git, nie ma możliwości ich przywrócenia za pomocą git.Odpowiedzi:
Pat Notz ma rację. Możesz odzyskać zatwierdzenie, o ile upłynęło kilka dni. git tylko śmieci są zbierane po około miesiącu, chyba że wyraźnie powiesz mu, aby usunąć nowsze obiekty BLOB.
Możesz zobaczyć w przykładzie, że plik2 został usunięty w wyniku twardego resetu, ale został przywrócony na miejscu, gdy zresetowałem przez dziennik reflog.
źródło
git log -g
może być nieco ładniejszym sposobem na przeglądanie dziennika niżgit reflog
.git reflog
pogit log -g
prostu dlatego, że masz wszystkie informacje w jednym wierszu z sha1, HEAD info i zatwierdzasz wiadomości w jednej linii. O wiele łatwiejszy do odczytania.To, co chcesz zrobić, to określić sha1 zatwierdzenia, które chcesz przywrócić. Możesz uzyskać sha1, sprawdzając reflog (
git reflog
), a następnie wykonując poleceniegit reset --hard <sha1 of desired commit>
Ale nie czekaj zbyt długo ... po kilku tygodniach git w końcu zobaczy to zatwierdzenie jako niepowiązane i usunie wszystkie obiekty BLOB.
źródło
Odpowiedź jest ukryta w szczegółowej odpowiedzi powyżej, możesz po prostu zrobić:
(Zobacz wyniki git reflog show )
źródło
Można go odzyskać, jeśli Git nie zebrał jeszcze śmieci.
Uzyskaj przegląd zwisających zatwierdzeń dzięki
fsck
:Odzyskaj zwisające zatwierdzenie z rebase:
źródło
Jeśli masz szczęście, tak jak ja, możesz wrócić do edytora tekstu i nacisnąć „cofnij”.
Wiem, że to nie jest właściwa odpowiedź, ale zaoszczędziło mi to pół dnia pracy, więc mam nadzieję, że zrobi to samo dla kogoś innego!
źródło
o ile wiem,
--hard
odrzuca niezaangażowane zmiany. Ponieważ nie są one śledzone przez git. ale możesz cofnąćdiscarded commit
.wyświetli:
gdzie
4bac331
jestdiscarded commit
.Teraz wystarczy przesunąć głowę do tego zatwierdzenia:
źródło
Przykład przypadku IRL:
$ git fsck --lost-found
$ git show f6ce1a403399772d4146d306d5763f3f5715cb5a
$ git rebase f6ce1a403399772d4146d306d5763f3f5715cb5a
źródło
W większości przypadków tak.
W zależności od stanu, w jakim znajdowało się Twoje repozytorium, gdy uruchomiłeś polecenie, efekty
git reset --hard
mogą być różne: od trywialnego do cofania, w zasadzie niemożliwe.Poniżej wymieniłem szereg różnych możliwych scenariuszy i sposoby ich odzyskania.
Wszystkie moje zmiany zostały zatwierdzone, ale teraz zobowiązania zniknęły!
Taka sytuacja zwykle występuje, gdy uruchamiasz
git reset
z argumentem, jak wgit reset --hard HEAD~
. Nie martw się, łatwo to odzyskać!Jeśli po prostu pobiegłeś
git reset
i od tamtej pory nie zrobiłeś nic więcej, możesz wrócić do miejsca, w którym byłeś, dzięki tej linijce:Spowoduje to zresetowanie bieżącej gałęzi bez względu na jej stan przed ostatnią modyfikacją (w twoim przypadku najnowszą modyfikacją gałęzi będzie twardy reset, który próbujesz cofnąć).
Jeśli jednak użytkownik nie dokonano innych zmian w swojej branży od resetu, jedno-liner powyżej nie będą działać. Zamiast tego powinieneś uruchomić, aby zobaczyć listę wszystkich ostatnich zmian dokonanych w oddziale (w tym resetów). Ta lista będzie wyglądać mniej więcej tak:
git reflog
<branchname>
Znajdź operację na tej liście, którą chcesz „cofnąć”. W powyższym przykładzie byłby to pierwszy wiersz, który mówi „reset: przejście do HEAD ~”. Następnie skopiuj reprezentację zatwierdzenia przed (poniżej) tą operacją. W naszym przypadku będzie to
master@{1}
(lub3ae5027
oba reprezentują ten sam zatwierdzenie) i uruchomi się,git reset --hard <commit>
aby przywrócić bieżącą gałąź do tego zatwierdzenia.Zainscenizowałem swoje zmiany
git add
, ale nigdy się nie popełniłem. Teraz moje zmiany zniknęły!Jest to nieco trudniejsze do odzyskania. git nie mają kopie plików dodanych, ale ponieważ kopie te nie były związane z żadnym konkretnym popełnić nie można przywrócić zmian naraz. Zamiast tego musisz zlokalizować poszczególne pliki w bazie danych git i przywrócić je ręcznie. Możesz to zrobić za pomocą
git fsck
.Aby uzyskać szczegółowe informacje na ten temat, zobacz Cofnij resetowanie git - twarde z nieproszonymi plikami w obszarze przemieszczania .
Miałem zmiany w plikach w moim katalogu roboczym, z którymi nigdy nie wystawiałem
git add
i nigdy nie popełniłem. Teraz moje zmiany zniknęły!O o. Nie chcę ci tego mówić, ale prawdopodobnie nie masz szczęścia. git nie przechowuje zmian, których nie dodajesz ani nie zatwierdzasz, i zgodnie z dokumentacją dla
git reset
:Jest możliwe, że może być w stanie odzyskać swoje zmiany z pewnego rodzaju narzędzia do odzyskiwania dysku lub profesjonalnych usług odzyskiwania danych, ale w tym momencie to chyba więcej kłopotów niż to warte.
źródło
Jeśli jeszcze nie wyrzuciłeś śmiecia ze swojego repozytorium (np. Używając
git repack -d
lubgit gc
, ale zauważ, że zbieranie śmieci może również nastąpić automatycznie), to twoje zatwierdzenie wciąż tam jest - po prostu nie jest już dostępne przez HEAD.Możesz spróbować znaleźć swoje zatwierdzenie, przeglądając dane wyjściowe
git fsck --lost-found
.Nowsze wersje Gita mają coś, co nazywa się „reflog”, który jest dziennikiem wszystkich zmian, które są dokonywane w refach (w przeciwieństwie do zmian, które są dokonywane w zawartości repozytorium). Na przykład za każdym razem, gdy zmieniasz HEAD (tj. Za każdym razem, gdy zmieniasz
git checkout
gałęzie), które będą rejestrowane. I, oczywiście,git reset
manipulowałeś również HEAD, więc też został zalogowany. Możesz uzyskać dostęp do starszych stanów swoich referencji w podobny sposób, jak możesz uzyskać dostęp do starszych stanów swojego repozytorium, używając@
znaku zamiast znaku~
, jakgit reset HEAD@{1}
.Trochę czasu zajęło mi zrozumienie, jaka jest różnica między HEAD @ {1} a HEAD ~ 1, więc oto małe wyjaśnienie:
HEAD~1
Oznacza to , że „przejdź do zatwierdzenia przed zatwierdzeniem, na które HEAD obecnie wskazuje”, natomiastHEAD@{1}
oznacza „przejdź do zatwierdzenia, na które HEAD wskazał, zanim wskazał, gdzie aktualnie wskazuje”.To z łatwością pozwoli ci znaleźć utracone zatwierdzenie i je odzyskać.
źródło
Przed odpowiedzią dodajmy tło, wyjaśniając, co to jest
HEAD
.First of all what is HEAD?
HEAD
jest po prostu odniesieniem do bieżącego zatwierdzenia (najnowszego) w bieżącej gałęzi.W
HEAD
danym momencie może być tylko jeden . (z wyłączeniemgit worktree
)Zawartość
HEAD
jest przechowywana w środku.git/HEAD
i zawiera 40 bajtów SHA-1 bieżącego zatwierdzenia.detached HEAD
Jeśli nie korzystasz z ostatniego zatwierdzenia, co oznacza, że
HEAD
nazywa się to wcześniejszym zatwierdzeniem w historiidetached HEAD
.W wierszu polecenia będzie to wyglądać tak: SHA-1 zamiast nazwy gałęzi, ponieważ
HEAD
nie wskazuje ona końca wierzchołka bieżącej gałęziKilka opcji odzyskiwania po odłączeniu HEAD:
git checkout
Spowoduje to pobranie nowej gałęzi wskazującej żądany zatwierdzenie.
To polecenie pobierze do danego zatwierdzenia.
W tym momencie możesz utworzyć gałąź i od tego momentu zacząć pracować.
git reflog
Zawsze możesz również użyć
reflog
.git reflog
wyświetli każdą zmianę, która zaktualizowałaHEAD
i sprawdzenie żądanego wpisu ponownego logowania spowodujeHEAD
powrót do tego zatwierdzenia.Za każdym razem, gdy HEAD zostanie zmodyfikowany, pojawi się nowy wpis w
reflog
Spowoduje to powrót do żądanego zatwierdzenia
git reset HEAD --hard <commit_id>
„Przesuń” głowę z powrotem do żądanego zatwierdzenia.
możesz również korzystać z nich
git rebase --no-autostash
.git revert <sha-1>
„Cofnij” podany zakres zatwierdzania lub zatwierdzania.
Polecenie reset spowoduje „cofnięcie” wszelkich zmian dokonanych w danym zatwierdzeniu.
Nowe zatwierdzenie z łatką cofania zostanie zatwierdzone, podczas gdy oryginalne zatwierdzenie pozostanie również w historii.
Ten schemat ilustruje, które polecenie robi co.
Jak widać,
reset && checkout
zmodyfikujHEAD
.źródło
git reset HEAD --hard <commit_id>
przykład pochodzi z stackoverflow.com/questions/4114095/... - Jeśli tak jest, czy możesz edytować atrybucję?git reflog
git cherry-pick <the sha>
źródło
Wiem, że to stary wątek ... ale ponieważ wiele osób szuka sposobów na cofnięcie rzeczy w Git, nadal uważam, że dobrym pomysłem może być dalsze udzielanie wskazówek tutaj.
Gdy wykonujesz „dodawanie git” lub przenosisz cokolwiek z lewego górnego do lewego dolnego w git gui, zawartość pliku jest przechowywana w obiekcie blob, a zawartość pliku można odzyskać z tego obiektu blob.
Można więc odzyskać plik, nawet jeśli nie został on zatwierdzony, ale należy go dodać.
Teraz obiekt blob został utworzony, ale jest do niego odwoływany przez indeks, więc nie będzie wymieniony w git fsck, dopóki nie zresetujemy. Więc resetujemy ...
dostaniesz wiszącą kroplę ce013625030ba8dba906f756967f9e9ca394464a
przywróci zawartość pliku „cześć”
Aby znaleźć niereferencyjne zatwierdzenia, znalazłem wskazówkę sugerującą to.
Mam to jako narzędzie w git gui i jest to bardzo przydatne.
źródło
git fsck --lost-found
może pomóc.Jeśli korzystasz z JetBrains IDE (cokolwiek opartego na IntelliJ), możesz odzyskać nawet niezaangażowane zmiany za pomocą funkcji „Historii lokalnej”.
Kliknij prawym przyciskiem myszy katalog najwyższego poziomu w drzewie plików, znajdź „Historię lokalną” w menu kontekstowym i wybierz „Pokaż historię”. Otworzy się widok, w którym można znaleźć ostatnie zmiany, a gdy znajdziesz wersję, do której chcesz wrócić, kliknij ją prawym przyciskiem myszy i kliknij „Przywróć”.
źródło
Właśnie wykonałem twardy reset niewłaściwego projektu. Tym, co uratowało mi życie, była lokalna historia Eclipse. Mówi się, że IntelliJ Idea też go ma, podobnie jak twój edytor, warto sprawdzić:
źródło
Stworzono mały skrypt, aby nieco łatwiej było znaleźć zatwierdzenie, którego szuka:
git fsck --lost-found | grep commit | cut -d ' ' -f 3 | xargs -i git show \{\} | egrep '^commit |Date:'
Tak, można go znacznie upiększyć za pomocą awk lub czegoś podobnego, ale jest to proste i właśnie tego potrzebowałem. Może uratować kogoś innego 30 sekund.
źródło
Mój problem jest prawie podobny. Mam nieprzypisane pliki przed wejściem
git reset --hard
.Na szczęście Udało mi się pominąć wszystkie te zasoby. Po tym, jak zauważyłem, że mogę po prostu cofnąć (
ctrl-z
). Just Chcę tylko dodać to do wszystkich powyższych odpowiedzi.Uwaga. Nie można
ctrl-z
otworzyć nieotwartych plików.źródło
To uratowało mi życie:
https://medium.com/@CarrieGuss/how-to-recover-from-a-git-hard-reset-b830b5e3f60c
Zasadniczo musisz uruchomić:
Następnie ręcznie przechodząc przez ból, aby ponownie uporządkować pliki do właściwej struktury.
Na wynos: nigdy nie używaj,
git reset --hard
jeśli nie do końca w 100% rozumiesz, jak to działa, najlepiej go nie używać.źródło