Moje repozytorium git w jakiś sposób nie działa - załadowałem msysgit dziś rano i zamiast nazwy gałęzi wyświetlanej po bieżącym katalogu, wyświetla się "((ref: re ...))", 'git status' zgłasza wszystko jako new file, 'git log' i 'git reflog' powiedz mi "fatal: zła domyślna wersja 'HEAD'" i tak dalej.
Wykonanie polecenia „git reflog --all” lub „gitk --all” pokazuje mi, że reszta repozytorium jest nienaruszona, ale wygląda na to, że gałąź, nad którą pracowałem, właśnie zniknęła, co wyjaśnia, dlaczego HEAD nie wydaje się istnieć / wskazywać na cokolwiek.
Wiem, że git przechowuje wszystkie rodzaje informacji i zakładam, że moje zatwierdzenia zostały w jakiś sposób osierocone, więc czy jest jakieś polecenie, które pokaże mi te zatwierdzenia, abym mógł zresetować do nich HEAD?
EDYCJA: Ojej. Odkryłem „git fsck”, a „git fsck --full” zgłasza „fatal: obiekt 03ca4 ... jest uszkodzony”. Co do diabła mogę z tym zrobić?
EDYCJA: Ojej oh kochany. Sprawdziłem inną gałąź, a następnie próbowałem odtworzyć oryginalną gałąź o tej samej nazwie, używając 'git checkout -b lostbranchname', a git mówi: „błąd: nie można rozwiązać referencji refs / heads / lostbranchname: brak błędu, krytyczny: niepowodzenie aby zablokować odniesienie do aktualizacji: brak błędu ”. „Brak błędu” musi być szczególnie paskudnym błędem. Wygląda więc na to, że wciąż się kręci, ale nie można go użyć ani zabić.
EDYCJA: Super duper ojej. Zrobiłem mnóstwo rozpakowywania, przepakowywania i wymiany rzeczy, jak zasugerowałem tutaj: Jak odzyskać obiekty Gita uszkodzone przez awarię dysku twardego? , ale teraz otrzymuję kolejny hash zgłaszany jako uszkodzony, dla czegoś tak nieszkodliwego jak „status gita”. Myślę, że wszystko jest wężem. Git jest uroczy iw ogóle, ale nie powinienem mieć do czynienia z takimi rzeczami.
git checkout -b lostbranchname
- jeśli zależy Ci tylko na nazwie gałęzi (a nie na jej zawartości), możesz ręcznie usunąć (lub zmienić nazwę).git/refs/heads/lostbranchname
- mam nadzieję, że załatwi sprawę.Odpowiedzi:
Zamiast zostawiać to otwarte, myślę, że udzielę odpowiedzi na moje własne pytanie. Używanie
git reflog --all
to dobry sposób na przeglądanie osieroconych zatwierdzeń - i używanie skrótów SHA1, które pozwalają na rekonstrukcję historii.Jednak w moim przypadku repozytorium było uszkodzone, więc to nie pomogło;
git fsck
może pomóc Ci znaleźć, a czasem naprawić błędy w samym repozytorium.źródło
[alias] orphank = !gitk --all --date-order ``git reflog | cut -c1-7``&
(edytuj: wyobraź sobie te podwójne grawerunki, w których pojedyncze - ucieczka nie wydaje się działać tutaj)Z git 2.9.x / 2.10 (Q3 2016), nie będziesz już musiał używać
git reflog --all
,git reflog
wystarczy.Zobacz zatwierdzenie 71abeb7 (03 czerwca 2016) autorstwa SZEDER Gábor (
szeder
) .(Połączone przez Junio C Hamano -
gitster
- w zobowiązaniu 7949837 , 06 lipca 2016 r.)źródło
Jedną z dobrych cech git jest to, że wykrywa korupcję. Jednak nie obejmuje korekcji błędów w celu ochrony przed korupcją.
Mam nadzieję, że przesłałeś zawartość tego repozytorium na inny komputer lub masz kopie zapasowe do odzyskania uszkodzonych części.
Nie mam żadnego doświadczenia z git w systemie Windows, ale nigdy nie widziałem tego rodzaju zachowania z git w systemie Linux lub OS X.
źródło
Zwykle wydaje mi się, że dane
git reflog
wyjściowe są mylące. Znacznie łatwiej jest mi zrozumieć wykres zmian zgit log --graph --reflog
. Zastąpienie formatu, aby wyświetlać tylko podsumowania zatwierdzeń, również może ułatwić śledzenie wykresu:Od tego jest jasne, że
e3124bf
i6a7a52e
to bez odnośników sierotami, a tam od kontekstu ich zatwierdzeń przodka.źródło
git reflog --all
nie pokazuje ich,git log --graph --reflog
ponieważ były bardzo widoczne ...