Avant de répondre, ajoutons un peu de contexte, expliquant ce que HEAD
c'est.
First of all what is HEAD?
HEAD
est simplement une référence au commit actuel (le plus récent) sur la branche courante.
Il ne peut y en avoir qu'un seul HEAD
à la fois (excluant git worktree
).
Le contenu de HEAD
est stocké à l'intérieur .git/HEAD
et contient les 40 octets SHA-1 de la validation actuelle.
detached HEAD
Si vous n'êtes pas sur le dernier commit - c'est-à-dire qu'il HEAD
pointe vers un commit antérieur dans l'historique, il est appelé detached HEAD
.
Sur la ligne de commande, cela ressemblera à ceci - SHA-1 au lieu du nom de la branche car le HEAD
ne pointe pas vers la pointe de la branche actuelle:
Quelques options sur la façon de récupérer à partir d'un HEAD détaché:
git checkout <commit_id>
git checkout -b <new branch> <commit_id>
git checkout HEAD~X // x is the number of commits t go back
Cela va extraire une nouvelle branche pointant vers le commit souhaité.
Cette commande récupérera un commit donné.
À ce stade, vous pouvez créer une branche et commencer à travailler à partir de ce point.
# 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>
Vous pouvez également utiliser le reflog
.
git reflog
affichera tout changement qui a mis à jour le HEAD
et la vérification de l'entrée de reflog souhaitée rétablira HEAD
cette validation.
Chaque fois que le HEAD est modifié, il y aura une nouvelle entrée dans le reflog
git reflog
git checkout HEAD@{...}
Cela vous ramènera à votre engagement souhaité
"Déplacez" votre HEAD vers le commit souhaité.
# 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.
- Remarque: ( depuis Git 2.7 ), vous pouvez également utiliser le
git rebase --no-autostash
.
"Annuler" la plage de validation ou de validation donnée.
La commande de réinitialisation "annulera" toutes les modifications apportées au commit donné.
Un nouveau commit avec le correctif d'annulation sera validé tandis que le commit original restera également dans l'historique.
# 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>
Ce schéma illustre quelle commande fait quoi.
Comme vous pouvez le voir, reset && checkout
modifiez le fichier HEAD
.
git checkout 23b6772
devrait faire.