2013-03-18 15 views
5

Chciałem wyczyścić katalog roboczy niektórych niezatwierdzonych plików, ale przypadkowo uruchomiłem git reset --hard.Git commit lost po resecie --hard. Nie znaleziono go przez fsck, nie w reflogu

Uświadomiłem sobie, że utraciłem poprzednie (niezapchnięte) zatwierdzenie, więc uruchomiłem git reset --hard ORIG_HEAD. To nie doprowadziło mnie do mojego straconego zobowiązania.

Uruchomiłem git reflog, ale zatwierdzenie nie było tam wymienione. Zrobiłem też git fsck --lost-found, ale na liście nie było żadnych zatwierdzeń, tylko kilka niepowiązanych obiektów typu blob i drzew.

Ponieważ nie mogę znaleźć żadnego odniesienia do utraconego zatwierdzenia (z wyjątkiem .git/COMMIT_EDITMSG, który wciąż zawiera odpowiedni komunikat zatwierdzenia i listę zmian), nie jestem pewien, jak odzyskać zatwierdzenie.

Czy istnieje sposób na odzyskanie utraconego zwrotu lub czy powinienem przygotować się na wszystko?

+0

Dlaczego sądzisz, że masz zatwierdzenie git dla swoich lokalnych zmian? reset git nie utraciłby go. Jeśli masz tylko niezatwierdzone zmiany, te zniknęły. – fche

+3

'git reset --hard' bez argumentu commit-toh jest równoważne' git reset --hard HEAD', który nie utraci zatwierdzeń, nie będzie pchnięty ani nie będzie się unosił. To po prostu zresetuje indeks i katalog roboczy z powrotem do stanu ostatniego zatwierdzenia, które zostały zrobione, tracąc zmiany etapowe i niezarządzane (ale jeszcze nie zatwierdzone). "Reset git - hard ORIG_HEAD" prawdopodobnie będzie problemem, w zależności od tego, jakie dokładnie było ostatnie polecenie, które faktycznie zaktualizowało ORIG_HEAD, i jak dawno temu było i co zrobiłeś pomiędzy ... – twalberg

+0

Dzięki, utracony commit został wykonany około pół godziny przed "git reset --hard". –

Odpowiedz

9

Nie wiem, dlaczego nie możesz znaleźć zatwierdzenia, ponieważ komentarz @ twalberg na temat git reset --hard jest poprawny. Oto kilka rzeczy do wypróbowania.

Masz wiadomość o zatwierdzeniu, którego szukasz (.git/COMMIT_EDITMSG). Jeśli napisano COMMIT_EDITMSG, to to konkretne zatwierdzenie powinno być gdzieś. Wyłowić jakiś tekst z wiadomości, że jest dość wyjątkowa i spróbuj tego:

git log -g --grep="<something specific from your commit message>"

będzie przejść przez reflog i znaleźć zobowiązuje pasujących tekst ze swojej utraconej wiadomości popełnienia tych.

Jeśli nie ma szczęścia z tym, można spróbować patrząc przez wszystkich zatwierdzeń na każdej gałęzi:

git log --all --grep="<something specific from your commit message>"

Po znalezieniu hash popełnić, można to sprawdzić, zrobić nowy oddział, połączenie go z powrotem do aktualnej gałęzi, itp.

Jednakże, jeśli wszystko zawiedzie, możesz spróbować przeszukać obiekty znajdujące się w repozytorium, ale nie są częścią żadnego zatwierdzenia (np. dodane do indeksu, ale nie zatwierdzone.) Ta odpowiedź może ci w tym pomóc:

https://stackoverflow.com/a/7376959/845716

+1

Dzięki Rob. Przeszukałem dzienniki git zanim opublikowałem pytanie, ale twój ostatni link ["Cofnij git reset --hard"] (http://stackoverflow.com/a/7376959/845716), aby przejrzeć wszystkie obiekty działa!Nie mam pojęcia, dlaczego nie mogę znaleźć zatwierdzenia. Mogę znaleźć poszczególne pliki. –

Powiązane problemy