Avant de répondre, ajoutons un peu de contexte, expliquant ce que c'est HEAD
. car certaines des options ci-dessous entraîneront une tête détachée
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
à un moment donné. (à l'exclusiongit worktree
)
Le contenu de HEAD
est stocké à l'intérieur .git/HEAD
et contient les 40 octets SHA-1 de la validation en cours.
detached HEAD
Si vous n'êtes pas sur le dernier commit - ce qui signifie qu'il HEAD
pointe vers un commit antérieur dans l'historique, c'est appelé detached HEAD
.
Sur la ligne de commande, il 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'une tête détachée:
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 extrait 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 toujours utiliser le reflog
.
git reflog
affichera tout changement qui a mis à jour le HEAD
et vérifier l'entrée de reflog souhaitée mettra le HEAD
dos à ce commit.
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éplacer" 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 validation ou la plage de validation donnée.
La commande de réinitialisation "annulera" toutes les modifications apportées au commit donné.
Un nouveau commit avec le patch d'annulation sera validé tandis que le commit d'origine restera également dans l'historique.
# 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>
Ce schéma illustre quelle commande fait quoi.
Comme vous pouvez le voir, reset && checkout
modifiez le HEAD
.