2013-08-07 9 views
6

Hai 3 commit - uno corretto, e poi due sciocchi puliti, errori di battitura ecc. Quindi voglio schiacciarli. Il fuoco di distanza:"fatale: ref HEAD non è un riferimento simbolico" durante la git rebase interattiva

git rebase -i HEAD~3 

sembra semplice, e dovrebbe funzionare - ho provato dopo l'esecuzione in un problema, in un nuovissimo pronti contro termine, e funziona come previsto. L'editor mostra 3 commit, seleziona la parte superiore, schiaccia gli altri due, salva e chiudi, fatto. Se corro in modalità dettagliata, vedo più dettagli - git entra nello stato di HEAD distaccato controllando il primo commit che ho scelto, quindi esegue "Rebasing 2/3" e "Rebasing 3/3", apparentemente creando alcuni commit temporanei lungo la strada - e poi un messaggio di successo; l'editor si apre di nuovo ad un certo punto, offrendomi di cambiare il messaggio di commit. Va tutto bene

Ma lo stesso comando muore in un repository di lavoro! 3 commette in un editor, pick-squash-squash .. ma questa volta, non vedo 'Rebasing 2/3', invece la primissima riga dopo 'HEAD è ora al mio-SHA-1', si imbatte in un fatale!

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

Ma perché sarebbe git aspettano testa per essere un ref simbolico? Il processo Rebase distacca HEAD - come vedo nel mio esempio esplorativo - quindi perché il fatale in questo secondo esempio, ma non nel primo? cat .git/HEAD dammi lo SHA1 del commit che ho 'scelto' ...

Ho passato diverse ore a leggere e ricercare, ma qualcosa non è proprio qui, e non riesco a trovare cosa sia! Ho il sospetto che forse siano responsabili alcuni ganci (ne sappiamo poco e sanno che il repository problematico ne ha alcuni). Grazie per la tua considerazione nel rispondere a questo!

+1

Se pensi che i ganci potrebbero essere un problema, hai provato a spegnere i ganci? Si trovano sotto '.git/hooks /', basta rinominarli in ' .off'. C'è un hook pre-rebase in particolare, 'pre-rebase.sample'. –

+0

grazie per il suggerimento - i ganci ora sono un po 'demistificati .. non ha avuto alcun effetto sul problema, ma almeno questo ha ucciso un'aringa rossa) – alexakarpov

+1

"ref simbolico" in Git non ha nulla a che fare con i link simbolici su un filesystem: "the ref" in Git parlance è un'entità che punta a un commit: una branch o un tag; questo è l'abbreviazione di "riferimento". Un ref potrebbe puntare direttamente al nome SHA-1 di un commit (ed è diretto) o a * un altro * ref, e quindi è "simbolico". Ad esempio, 'HEAD' in genere punta a qualcosa come' refs/heads/master', non al commit del tip del master. – kostix

risposta

0

Il repository "lavoro" è probabilmente rotto in qualche modo. Vedi I can't git rebase --interactive anymore per i dettagli.

Vorrei provare a eseguire git status nel repository di lavoro per capire cosa sta succedendo. Quindi ad es. git rebase --abort, git merge --abort o qualcosa del genere potrebbe essere richiesto.

Avrei eseguito anche git fsck.

Dopo che il repository e la directory di lavoro sono a posto, il rebase interattivo dovrebbe funzionare correttamente. Si noti inoltre che potrebbe essere necessario git rebase --root --preserve-merges ... nel caso in cui si desideri toccare il primo commit nel repository.