web-dev-qa-db-fra.com

Comment se déplacer HEAD Retour à un emplacement précédent? (Tête détachée) & Annuler commet

Dans git, j'essayais de faire un squash commit en fusionnant dans une autre branche puis en remettant HEAD à la place précédente via:

git reset Origin/master

Mais je dois sortir de ça. Comment puis-je déplacer HEAD à l'emplacement précédent? 

J'ai le SHA1 frag (23b6772) du commit dans lequel je dois le déplacer.
Comment puis-je revenir à ce commit?

95
timpone

Avant de répondre, ajoutons un peu d’arrière-plan, en expliquant quelle est cette HEAD.

First of all what is HEAD?

HEAD est simplement une référence au commit en cours (le plus récent) de la branche en cours.
Il ne peut y avoir qu’un seul HEAD à la fois. (excluant git worktree)

Le contenu de HEAD est stocké dans .git/HEAD et contient les 40 octets SHA-1 de la validation actuelle.


detached HEAD

Si vous n'êtes pas sur la dernière validation - ce qui signifie que HEAD pointe vers une validation précédente de l'historique, elle est appelée detached HEAD.

 enter image description here

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

 enter image description here


Quelques options sur la façon de récupérer d'une tête isolée:


git checkout

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 vérifier la nouvelle branche pointant vers le commit désiré.
Cette commande passera à un commit donné.
À ce stade, vous pouvez créer une branche et commencer à travailler à partir de ce moment.

# 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>

git reflog

Vous pouvez toujours utiliser le reflog également.
git reflog affichera tout changement ayant mis à jour le HEAD et extrayant l'entrée de mise en mémoire souhaitée désirée remettra le 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 commit désiré

 enter image description here


git reset --hard <commit_id>

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


git revert <sha-1>

"Annuler" la validation ou la plage de validation donnée.
La commande reset "annulera" toutes les modifications apportées à la validation donnée.
Un nouveau commit avec le correctif d'annulation sera validé, tandis que le commit original 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.

 enter image description here

238
CodeWizard

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

Si

vous êtes en tête détachée
(c’est-à-dire tapez git status; vous voyez HEAD detached at <commit_id>)

Et

une branche existante répond à vos besoins
(c’est-à-dire, tapez git branch -v; vous voyez un nom de branche avec des messages de validation associés représentant le travail que vous souhaitez continuer)

Ensuite

vérifiez simplement cette branche (c’est-à-dire tapez git checkout <branch_name>; vous voyez Switched to branch <branch_name>).

Les résultats

Vous pouvez maintenant continuer à ajouter et à engager votre travail comme avant; les modifications seront suivies sur <branch_name>

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

9
Kay V

Faire

git reset 23b6772

Pour voir si vous êtes sur la bonne position:

git status

Vous allez voir quelque chose

Sur branche master Votre branche est derrière 'Origin/master' de 17 commits, et peut être expédié rapidement.

Fixez ensuite le HEAD au commit actuel:

git Push --force
4
amuliar

La question peut être lue comme suit:

J'étais en état détaché avec HEAD à 23b6772 et tapé git reset Origin/master (parce que je voulais écraser). Maintenant que j'ai changé d'avis, comment puis-je revenir à HEAD être à 23b6772?

La réponse directe étant: git reset 23b6772

Mais je suis tombé sur cette question parce que j'en avais marre de taper (copier-coller) et de mettre à jour les hachages ou son abréviation chaque fois que je voulais faire référence à la HEAD précédente et que j'étais sur Google pour voir s'il y avait un quelconque sténo.

Il s'avère qu'il y a!

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

Ce qui incidemment était identique à cd - pour revenir au précédent répertoire current dans * nix! Alors, bravo, apprenez deux choses d'une pierre.

3
antak

Lorsque vous exécutez la commande git checkout commit_id, HEAD est détaché de 13ca5593d(say commit-id) et la branche est disponible plus longtemps.

Revenez à l'emplacement précédent, exécutez la commande stepwise -

Vous serez de retour à l'emplacement précédent avec la validation mise à jour à partir du référentiel distant.

0
Deepak Kumar

Aujourd'hui, je valide par erreur un commit et commence à travailler dessus. Il effectue quelques commits sur l'état détaché HEAD. Ensuite, j'ai poussé vers une branche distante à l'aide de la commande suivante

git Push Origin HEAD: <My-remote-branch>

puis

git checkout <My-remote-branch>

puis

git pull 

J'obtiens enfin tous mes changements dans ma branche que j'ai faits en détachement HEAD

0
Zaid Mirza