Powinieneś być w stanie odzyskać wszystkie pliki, które dodałeś do indeksu (np. Tak jak w twojej sytuacji git add .
), chociaż może to wymagać trochę pracy. Aby dodać plik do indeksu, git dodaje go do bazy danych obiektów, co oznacza, że można go odzyskać, o ile jeszcze nie nastąpiło czyszczenie pamięci. Oto przykład, jak to zrobić, podany w odpowiedzi Jakuba Narębskiego :
Jednak wypróbowałem to w repozytorium testowym i było kilka problemów - --cached
powinno być --cache
i stwierdziłem, że w rzeczywistości nie utworzyło .git/lost-found
katalogu. Jednak następujące kroki zadziałały dla mnie:
git fsck --cache --unreachable $(git for-each-ref --format="%(objectname)")
Powinno to wyprowadzić wszystkie obiekty w bazie danych obiektów, które nie są osiągalne przez żaden ref, w indeksie ani przez reflog. Wynik będzie wyglądał mniej więcej tak:
unreachable blob 907b308167f0880fb2a5c0e1614bb0c7620f9dc3
unreachable blob 72663d3adcf67548b9e0f0b2eeef62bce3d53e03
... i dla każdego z tych plamek możesz:
git show 907b308
Aby wyświetlić zawartość pliku.
Za dużo produkcji?
Aktualizacja w odpowiedzi na sehe „s komentarz poniżej:
Jeśli zauważysz, że masz wiele zatwierdzeń i drzew wyświetlonych w danych wyjściowych tego polecenia, możesz chcieć usunąć z wyniku wszelkie obiekty, do których istnieją odniesienia z zatwierdzeń bez odniesienia. (Zazwyczaj i tak możesz wrócić do tych zatwierdzeń przez reflog - interesują nas tylko obiekty, które zostały dodane do indeksu, ale nigdy nie można ich znaleźć za pomocą zatwierdzenia).
Najpierw zapisz dane wyjściowe polecenia, używając:
git fsck --cache --unreachable $(git for-each-ref --format="%(objectname)") > all
Teraz nazwy obiektów tych nieosiągalnych zatwierdzeń można znaleźć za pomocą:
egrep commit all | cut -d ' ' -f 3
Możesz więc znaleźć tylko drzewa i obiekty, które zostały dodane do indeksu, ale w żadnym momencie nie zostały zatwierdzone, za pomocą:
git fsck --cache --unreachable $(git for-each-ref --format="%(objectname)") \
$(egrep commit all | cut -d ' ' -f 3)
To ogromnie zmniejsza liczbę obiektów, które musisz wziąć pod uwagę.
Aktualizacja: Philip Oakley poniżej sugeruje inny sposób ograniczenia liczby obiektów do rozważenia, czyli po prostu uwzględnienie ostatnio zmodyfikowanych plików w ramach .git/objects
. Możesz je znaleźć za pomocą:
find .git/objects/ -type f -printf '%TY-%Tm-%Td %TT %p\n' | sort
(Znalazłem to find
wywołanie tutaj .) Koniec tej listy może wyglądać następująco:
2011-08-22 11:43:43.0234896770 .git/objects/b2/1700b09c0bc0fc848f67dd751a9e4ea5b4133b
2011-09-13 07:36:37.5868133260 .git/objects/de/629830603289ef159268f443da79968360913a
W takim przypadku możesz zobaczyć te obiekty za pomocą:
git show b21700b09c0bc0fc848f67dd751a9e4ea5b4133b
git show de629830603289ef159268f443da79968360913a
(Zauważ, że musisz usunąć /
na końcu ścieżki, aby uzyskać nazwę obiektu.)