git reflog
può venire in tuo soccorso.
Inseriscilo nella tua console e otterrai un elenco della tua cronologia git insieme a SHA-1 che li rappresenta.
Esegui semplicemente il checkout di qualsiasi SHA-1 che desideri ripristinare
Prima di rispondere aggiungiamo alcune informazioni di base, spiegando di cosa si tratta HEAD
.
First of all what is HEAD?
HEAD
è semplicemente un riferimento al commit corrente (il più recente) sul ramo corrente.
Ci può essere solo un singolo HEAD
in un dato momento. (escluso git worktree
)
Il contenuto di HEAD
è memorizzato all'interno .git/HEAD
e contiene i 40 byte SHA-1 del commit corrente.
detached HEAD
Se non sei sul commit più recente, il che significa che HEAD
punta a un commit precedente nella cronologia, viene chiamato detached HEAD
.
Sulla riga di comando, sarà simile a questo: SHA-1 invece del nome del ramo poiché HEAD
non punta alla punta del ramo corrente
Alcune opzioni su come recuperare da una HEAD staccata:
git checkout <commit_id>
git checkout -b <new branch> <commit_id>
git checkout HEAD~X // x is the number of commits t go back
Questo controllerà il nuovo ramo che punta al commit desiderato.
Questo comando eseguirà il checkout di un determinato commit.
A questo punto, puoi creare un ramo e iniziare a lavorare da questo punto in poi.
# Checkout a given commit.
# Doing so will result in a `detached HEAD` which mean that the `HEAD`
# is not pointing to the latest so you will need to checkout branch
# in order to be able to update the code.
git checkout <commit-id>
# create a new branch forked to the given commit
git checkout -b <branch name>
Puoi sempre usare reflog
anche il file.
git reflog
mostrerà tutte le modifiche che hanno aggiornato il HEAD
e il check out della voce reflog desiderata riporterà HEAD
indietro a questo commit.
Ogni volta che la TESTA viene modificata ci sarà una nuova voce nel file reflog
git reflog
git checkout HEAD@{...}
Questo ti riporterà al commit desiderato
"Sposta" di nuovo la TESTA sul commit desiderato.
# This will destroy any local modifications.
# Don't do it if you have uncommitted work you want to keep.
git reset --hard 0d1d7fc32
# Alternatively, if there's work to keep:
git stash
git reset --hard 0d1d7fc32
git stash pop
# This saves the modifications, then reapplies that patch after resetting.
# You could get merge conflicts if you've modified things which were
# changed since the commit you reset to.
"Annulla" il commit specificato o l'intervallo di commit.
Il comando reset "annullerà" tutte le modifiche apportate al commit dato.
Verrà eseguito il commit di un nuovo commit con la patch di annullamento mentre anche il commit originale rimarrà nella cronologia.
# add new commit with the undo of the original one.
# the <sha-1> can be any commit(s) or commit range
git revert <sha-1>
Questo schema illustra quale comando fa cosa.
Come puoi vedere, reset && checkout
modifica il file HEAD
.