Prima di rispondere, aggiungiamo alcuni retroscena, spiegando di cosa si HEAD
tratta.
First of all what is HEAD?
HEAD
è semplicemente un riferimento al commit corrente (più recente) sul ramo corrente.
Può essercene solo uno HEAD
in qualsiasi 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 si esegue l'ultimo commit, ovvero HEAD
viene chiamato un commit precedente nella cronologia detached HEAD
.
Sulla riga di comando, sarà simile al seguente: 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 verificherà il nuovo ramo che punta al commit desiderato.
Questo comando eseguirà il checkout per 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 quello.
git reflog
visualizzerà qualsiasi modifica che ha aggiornato il HEAD
e il checkout della voce di reflog desiderata HEAD
riporterà questo commit.
Ogni volta che HEAD viene modificato, ci sarà una nuova voce in reflog
git reflog
git checkout HEAD@{...}
Questo ti riporterà al commit desiderato
"Sposta" HEAD indietro al 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.
- Nota: ( da Git 2.7 ) puoi anche usare
git rebase --no-autostash
anche questo.
"Annulla" l'intervallo di commit o commit specificato.
Il comando reset "annulla" tutte le modifiche apportate nel commit dato.
Verrà eseguito il commit di un nuovo commit con la patch di annullamento mentre il commit originale rimarrà anche nella cronologia.
# Add a 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 lì, reset && checkout
modifica il HEAD
.
git checkout 23b6772
dovresti ... dovrebbe.