2013-08-07 10 views
6

Dostałem 3 commits - jeden właściwy, a następnie dwa głupie cleanup, literówki itp. Więc chcę je zgnieść. Mówcie:"fatal: ref HEAD nie jest symbolicznym ref" podczas interaktywnego git rebase

git rebase -i HEAD~3 

Brzmi prosto, a to powinno działać - Próbowałem go po uruchomieniu na problem, w nowym repo i działa zgodnie z oczekiwaniami. Edytor pokazuje 3 zatwierdzenia, wybierz szczyt, zgrupuj pozostałe dwa, zapisz i zakończ, gotowe. Jeśli uruchomię się w trybie szczegółowym, widzę więcej szczegółów - git wchodzi w stan odłączenia HEAD, sprawdzając pierwsze zatwierdzenie, które "wybrałem", następnie robi "Rebasing 2/3" i "Rebasing 3/3", najwyraźniej tworząc pewne tymczasowe zatwierdzenia po drodze - a następnie komunikat o sukcesie; redaktor pojawia się w pewnym momencie, oferując mi zmianę komunikatu zatwierdzenia. Wszystko dobrze.

Ale to samo polecenie umiera w repozytorium pracy! 3 popełnia w edytorze, squash-squash ... ale tym razem nie widzę "Rebasing 2/3", zamiast tego pierwsza linia po "HEAD jest teraz na my-SHA-1", wchodzi w śmiertelny!

HEAD is now at 48a6c3d... <commit message> 
fatal: ref HEAD is not a symbolic ref 

Ale dlaczego byłoby oczekiwać git HEAD być symboliczne ref? Rebase proces odłącza HEAD - tak samo jak widzę w moim przykładzie eksploracyjnym - dlaczego więc to fatalne w tym drugim przykładzie, ale nie w pierwszym? cat .git/HEAD daje mi SHA1 zatwierdzenia, które "wybrałem" ...

Spędziłem kilka godzin na czytaniu i badaniu, ale coś tu jest nie tak i nie mogę znaleźć co to jest! Podejrzewam, że niektóre haki są odpowiedzialne (niewiele o nich wiem i wiem, że problematyczne repo ma jakieś). Dziękuję za uwagę w odpowiedzi na to!

+1

Jeśli uważasz, że haczyki mogą stanowić problem, czy próbowałeś wyłączyć haki? Znajdują się one pod '.git/hooks /', zmień ich nazwę na ' .off'. W szczególności jeden hak pre-rebase, 'pre-rebase.sample'. –

+0

dzięki za sugestię - haki są teraz nieco demistyfikowane .. nie miało to żadnego wpływu na problem, ale przynajmniej to zabiło czerwonego śledzia) – alexakarpov

+1

"symboliczny ref" w Git nie ma nic wspólnego z dowiązaniami symbolicznymi w systemie plików: "ref" w języku Git to podmiot wskazujący na commit - gałąź lub tag; jest to skrót od "odniesienie". Ref może wskazywać bezpośrednio na nazwę SHA-1 commit (a następnie jest bezpośrednia) lub na * inny * ref, a następnie jest "symboliczny". Na przykład 'HEAD' zwykle wskazuje na coś takiego jak' refs/heads/master', a nie na zatwierdzenie końcówki master. – kostix

Odpowiedz

0

Twoje "repozytorium pracy" prawdopodobnie zostało jakoś przerwane. Szczegóły: I can't git rebase --interactive anymore.

Próbuję uruchomić git status w twoim repo pracy, aby dowiedzieć się, co się dzieje. Następnie np. git rebase --abort, git merge --abort lub coś podobnego może być wymagane.

Mogę też uruchomić git fsck.

Po prawidłowym uruchomieniu repozytorium i katalogu roboczym, interaktywny rebase powinien działać dobrze. Pamiętaj również, że możesz potrzebować git rebase --root --preserve-merges ..., jeśli chcesz dotknąć pierwszego zatwierdzenia w repozytorium.

Powiązane problemy