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?
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
.
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.
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é
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.
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
.
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.
vous êtes en tête détachée
(c’est-à-dire tapez git status
; vous voyez HEAD detached at <commit_id>
)
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)
vérifiez simplement cette branche (c’est-à-dire tapez git checkout <branch_name>
; vous voyez Switched to branch <branch_name>
).
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.
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
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.
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.
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.
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