Git uszkodzony oddział master


9

Otwieram moje repozytorium Git za pomocą gitExtensions w systemie Windows 7 dla projektu Visual Studio. Nagle jest pusta. Repozytorium istnieje, ale wszystkie moje zobowiązania zniknęły.

Korzystam z interfejsu graficznego i uważam, że po raz pierwszy go otworzyłem od czasu jego aktualizacji.

Nie jestem pewien, co zrobić, aby odzyskać swoje zobowiązania.

Kiedy piszę

git log 

Otrzymałem

fatal: zła wersja domyślna „HEAD”

Aktualizacja
Po przejrzeniu /programming/1545407/recovering-broken-git-repository próbowałem

git fsck

zwrócił:

błąd: nieprawidłowy HEAD
fatal: loose object 36b7d9e1ca496bcb864c0b9c8671fcec97fbda31 (przechowywany w .git / obj ects / 36 / b7d9e1ca496bcb864c0b9c8671fcec97fbda31) jest uszkodzony

Zatwierdzanie zwrotów:

błąd: nie można rozpoznać odwołania HEAD: Brak pliku lub katalogu
krytyczny: nie można zablokować HEAD ref

i rejestrowanie zwrotów gałęzi master

Ostrzeżenie git log master: ignorowanie uszkodzonych referencji / heads / master. ostrzeżenie: ignorowanie zepsutych referencji / heads / master. fatal: dwuznaczny argument „master”: nieznana wersja lub ścieżka nie znajduje się w działającym drzewie. Użyj „-”, aby oddzielić ścieżki od wersji

Po prostu wklejam rzeczy, które mogą być istotne


Ostrzeżenie git reflog master : ignorowanie uszkodzonych referencji / heads / master.
ostrzeżenie: ignorowanie zepsutych referencji / heads / master.
fatal: dwuznaczny argument „master”: nieznana wersja lub ścieżka nie znajduje się w działającym drzewie.
Użyj „-”, aby oddzielić ścieżki od wersji

Bardziej przydatne informacje: za każdym razem, gdy usuwam uszkodzony plik, inny zajmuje jego miejsce. Zaczynam myśleć, że to ma coś wspólnego z gałęzią master wskazującą na niewłaściwą rzecz lub coś. ponieważ zakładam, że głowa wskazuje na mistrza.

Dzień później:
Więc wciągnąłem na to mojego kolegę, był w stanie przejrzeć dzienniki i powiedział, że skróty w dziennikach nie pasują do obiektów w folderze. Próbował zresetować gałąź master do dzienników lub coś w tym rodzaju, trochę się zgubiłem. Mam nadzieję, że to pomocne



1
@heavyd sprawdź aktualizację
MrJD

Odpowiedzi:


3

Repozytorium istnieje, ale wszystkie moje zobowiązania zniknęły.

Co dokładnie masz na myśli? Czy działające drzewo wciąż tam jest? Czy .git/istnieje Czy są w nim jakieś pliki?

Opublikowane wiadomości sugerują, że plik .git/HEADnie istnieje. Określa oczekiwany stan działającego drzewa (to, co sprawdziłeś). Jeśli ten plik zniknie, git nie wie, gdzie byłeś.

Możesz spróbować utworzyć plik samodzielnie, korzystając z tej zawartości: ref: refs/heads/master

Jeśli pracujesz w innej gałęzi, po prostu zamień „master” na nazwę gałęzi. Gdybyś nie był na gałęzi, byłoby to bardziej skomplikowane.

.git/logs/HEADrejestruje przeszłe stany HEAD, z późniejszymi wierszami na dole. Ten przykładowy wiersz pokazuje kasę: 25f2a6099fb5f9f2192a510c42f704f9fc4bcecb 65abb1a3dc102e2498860f01fb179cda4c51decb Rainer Blome <rainer.blome@wherever.you.are.com> 1346938344 +0200 checkout: moving from master to MySuperBranch

SHA1 z przodu odnoszą się do zatwierdzeń. Powinieneś być w stanie je znaleźć na przykład w dzienniku oddziału .git/logs/refs/heads/master.

refs/heads/masterBrakuje również danych wyjściowych git reflog, które podałeś . Jego jedyną zawartością ma być SHA1 najnowszego zatwierdzenia na nim (i nowego wiersza). Na przykład najnowszy SHA1 znajduje się na końcu dziennika oddziału .git/logs/refs/heads/master.


2

Jeśli .git / HEAD istnieje, a jego zawartość jest ref: refs/heads/masternastępnie sprawdzana w pliku refs / heads / master, musi on zawierać sha1 ostatniego zatwierdzenia.

Jeśli ten plik jest uszkodzony i zawiera znaki NULL, edytuj ten plik i umieść sha1 ostatniego zatwierdzenia z .git/logs/HEADlub przed ostatnim zatwierdzeniem.

Więc zrób git reset --hard 'sha1 of the commit that you selected'


rzeczywiście był pełen znaków NULL, więc wrzuciłem sha1 poprzedniego zatwierdzenia, ale potem zresetowanie git spowodowało „błąd: update_ref nie powiodło się dla ref„ HEAD ”: nie można zablokować ref„ HEAD ”: nie można rozwiązać odniesienia HEAD: Niepoprawny argument „
fantastyczny

1

Wygląda na to, że Twoje repozytorium zostało uszkodzone. Najłatwiej jest odzyskać swoje repozytorium z kopii zapasowej lub ponownie sklonować repozytorium z oryginalnego źródła (zakładając, że nie masz mnóstwo pracy w repozytorium).

Jeśli resotring / klonowanie nie jest możliwe, poleciłbym przeczytanie Pro Git (darmowa książka online lub wersja papierowa ). Cała książka jest bardzo pouczająca, ale szczególnie spójrz na ostatni rozdział, aby zrozumieć, jak działa Git wewnętrznie. Kiedy już zrozumiesz, jak działa Git, spójrz na instrukcje Linusa dotyczące odzyskiwania uszkodzonych obiektów .


Niestety nie tworzyłem kopii zapasowych ukrytych plików .git był ukryty. Naprawdę nie mam wystarczająco dużo czasu na przeczytanie całej książki. Czy sądzisz, że mógłbym spróbować?
MrJD

„Przeczytaj książkę o wnętrznościach” może być dobrą ogólną radą, ale nie pomaga rozwiązać konkretnego problemu i pytania.
Burhan Ali

0

Po pewnym czasie surfowania w sieci znalazłem to i zadziałało.

git fetch origin
git reset --hard origin/master

Dostaje to wszelkie zmiany od origin(mam nadzieję, że nie za dużo pracy wykonanej lokalnie), a następnie zmusza lokalny masteroddział do uzgodnienia ze zdalnym. Ostrożnie, --resetoznacza odrzuć wszelkie lokalne zmiany! Poza tym, gdyby nie był zbyt uszkodzony, po prostu git reset origin/masterprzywróciłby ostatni znany (zarejestrowany) stan masteroddziału.
vonbrand
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.