Comment déplacer HEAD vers un emplacement précédent? (Tête détachée)

En fait, j’essayais de faire un squash en fusionnant dans une autre twig, puis en réinitialisant HEAD à l’emplacement précédent via:

 git reset origin/master 

Mais je dois en sortir. Comment puis-je déplacer HEAD à son emplacement précédent?

J’ai le fragment SHA1 ( 23b6772 ) du commit vers lequel je dois le déplacer.
Comment puis-je revenir à cet engagement?

Avant de répondre, ajoutons un peu de contexte, en expliquant ce qu’est ce HEAD .

First of all what is HEAD?

HEAD est simplement une référence au commit actuel (le plus récent) sur la twig en cours.
Il ne peut y avoir qu’un seul HEAD à un moment donné. (sauf git worktree )

Le contenu de HEAD est stocké dans .git/HEAD et contient les 40 octets SHA-1 du commit en cours.


detached HEAD

Si vous n’êtes pas sur le dernier commit – ce qui signifie que HEAD pointe vers un commit antérieur dans history, il s’appelle detached HEAD .

entrer la description de l'image ici

Sur la ligne de commande, cela ressemblera à ceci: SHA-1 au lieu du nom de la twig car le HEAD ne pointe pas vers le bout de la twig actuelle

entrer la description de l'image ici


Quelques options sur la façon de récupérer d’un HEAD détaché:


git checkout

 git checkout  git checkout -b   git checkout HEAD~X // x is the number of commits t go back 

Cela va extraire la nouvelle twig pointant vers le commit souhaité.
Cette commande va extraire un commit donné.
À ce stade, vous pouvez créer une twig et commencer à travailler à partir de là.

 # 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  # create a new branch forked to the given commit git checkout -b  

git reflog

Vous pouvez toujours utiliser le reflog aussi.
git reflog affichera tout changement qui a mis à jour le HEAD et extrait l’entrée de reflog désirée pour remettre le HEAD à 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é

entrer la description de l'image ici


git reset --hard

“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. 
  • Note: ( depuis Git 2.7 )
    Vous pouvez également utiliser le git rebase --no-autostash .


git revert

“Annuler” la plage de validation ou de validation donnée.
La commande de réinitialisation “annulera” les modifications apscopes à la validation donnée.
Un nouveau commit avec le patch d’annulation sera validé pendant que le commit d’origine restra également dans l’historique.

 # add new commit with the undo of the original one. # the  can be any commit(s) or commit range git revert  

Ce schéma illustre quelle commande fait quoi.
Comme vous pouvez le voir, reset && checkout modifie le HEAD .

entrer la description de l'image ici

Voici une approche qui peut être très simple et facile à retenir. Vérifiez 2 conditions et terminez par 1 commande. Ensuite, vous êtes de nouveau sur la bonne voie.

Si

vous êtes en “tête détachée”
(c.-à-d. tapez git status ; vous voyez HEAD detached at )

Et

une succursale existante répond à vos besoins
(c.-à-d. tapez git branch -v ; vous voyez un nom de twig avec un message de livraison associé représentant le travail que vous voulez continuer)

alors

il suffit de vérifier cette twig (c.-à-d. tapez git checkout ; vous voyez Switched to branch ).

Résultats

Vous pouvez maintenant continuer à append et à valider votre travail comme auparavant; les modifications seront suivies sur .

Notez que si vous aviez enregistré le travail alors que HEAD était détaché, dans la plupart des cas, ce travail sera automatiquement fusionné dans le processus ci-dessus. Si vous voyez un message sur un conflit de fusion, ne paniquez pas. Il existe plusieurs excellents tutoriels avec des étapes simples pour résoudre le conflit et terminer la fusion.

La question peut être lue comme suit:

J’étais en état détaché avec HEAD à 23b6772 et typé git reset origin/master (parce que je voulais écraser). Maintenant, j’ai changé d’avis, comment puis-je revenir sur HEAD au 23b6772 ?

La réponse simple: git reset 23b6772

Mais je réponds à cette question parce que j’en ai eu marre de taper (copier-coller) les hashes de validation ou son abréviation chaque fois que je voulais faire référence à la précédente HEAD et que je cherchais un raccourci.

Il se trouve qu’il y en a!

git reset - (ou dans mon cas git cherry-pick - )

Ce qui était d’ailleurs la même chose que cd - pour retourner au précédent répertoire courant sous * nix! Alors, sachez que j’ai appris deux choses avec une pierre.