2011-07-09 15 views
182

Mi impegno in un repository git per la prima volta; Poi rimpiango il commit e voglio ripristinarlo. ProvoCome ripristinare il commit git iniziale?

# git reset --hard HEAD~1 

ottengo questo messaggio:

fatal: ambiguous argument 'HEAD~1': unknown revision or path not in the working tree. 

Questa commettere è il primo commit del repository. Qualche idea su come annullare il commit iniziale di git?

risposta

307

Hai solo bisogno di cancellare il ramo su cui ti trovi. Non è possibile utilizzare git branch -D in quanto questo ha un controllo di sicurezza contro questo. È possibile utilizzare update-ref per farlo.

git update-ref -d HEAD 

fare non uso rm -rf .git o qualcosa di simile come questo sarà completamente cancellare l'intero archivio inclusi tutti gli altri rami, nonché il ramo che si sta tentando di ripristinare.

+1

Ho provato questo in un rebase - volevo dividere il primo commit - poi ho fatto 'git status', e con mia sorpresa, git ha detto' fatale: non un repository git (o un genitore fino al mount point ...) '! –

+0

stesso - soluzione? –

+1

questo non ha funzionato per me. Crea file che includono alcuni che dovrebbero essere ignorati ma non '.gitignore'. 'git add .',' git commit -m "commit iniziale" ',' git update-ref -D HEAD', crea un '.gitignore', nota che git sta ancora vedendo i file aggiunti in precedenza che dovrebbero essere ignorati. In altre parole 'git update-ref -d HEAD' non mi ha riportato allo stato precedente al commit iniziale. – gman

5

Il modo più semplice sarebbe:

rm -fr .git 

dalla directory in cui avete fatto git init.

Non hai nulla da mantenere, quindi non stai perdendo nulla. Tuttavia, fare ciò è sicuro solo se non hai nient'altro nel tuo repository. Nelle circostanze descritte nella domanda "Memorizza deposito prima volta — poi rimpiangere", è sicuro. Molto spesso, però, non è sicuro.

+7

Questo è un cattivo consiglio. Cosa succede se ci sono altre cose nel repository che non vuoi perdere? –

+4

Quindi non sarebbe il commit iniziale, lo farebbe. C'è solo un commit iniziale. –

+8

"Quindi non sarebbe il commit iniziale" - in realtà, sì lo sarebbe. Stai trascurando il caso molto comune di più filiali. Vedi la risposta di Charles. –

3

Non è possibile. Quindi:

rm -rf .git/ 
git init 
git add -A 
git commit -m 'Your new commit message' 
+0

Ha provato a dire 'git reset --hard', quindi perché dovrebbe' git add -A'? –

0

git azzerato --hard apportare modifiche, quindi fare

git add -A 
git commit --amend --no-edit 

o

git add -A 
git commit --amend -m "commit_message" 

e poi

git push origin master --force 

--force riscriverà che impegnano hai reimpostato nel primo passaggio.

Non farlo, perché stai per andare contro l'intera idea dei sistemi VCS e git in particolare. L'unico buon metodo è creare un nuovo ramo ed eliminarlo. Vedi git help branch per informazioni.

28

È possibile eliminare la HEAD e ripristinare il repository per un nuovo stato, in cui è possibile creare un nuovo iniziale commit:

git update-ref -d HEAD 

Dopo aver creato un nuovo commit, se si è già spinto a distanza, è sarà necessario forzarlo al telecomando al fine di sovrascrivere l'iniziale commit precedente:

git push --force origin 
+0

Vale la pena notare ... questo è il comando corretto ma non elimina l'HEAD ... cancella il ref (che si trova sotto .git \ refs \ heads) che il file .git \ HEAD ha estratto. Dopo aver eseguito questo comando puoi ancora trovare il file HEAD che punta al file refs/heads/ che hai cancellato ma se segui quel percorso vedrai che il ref di testa non esiste più. – DanK

7

la domanda è stata legata da this blog post e una soluzione alternativa è stata proposta per le nuove versioni di Git:

git branch -m master old_master 
git checkout --orphan master 
git branch -D old_master 

Questa soluzione presuppone che:

  1. Hai solo un commit sul ramo master
  2. Non v'è alcun ramo chiamato old_master quindi sono liberi di usare quel nome

Rinominerà il ramo esistente a old_master e creerà un nuovo ramo, orfano, master(come se fosse creato per nuovi repository) dopo di che è possibile eliminare liberamente old_master ... oppure no. Sta a te.

0

Tutto quello che devi fare è ripristinare il commit.

git revert {commit_id}' 

quindi spingerla

git push origin -f 
Problemi correlati