Dans Git, j'essayais de faire un squash commit
en fusionnant dans une autre branche puis en réinitialisant HEAD
à l'endroit précédent via:
git reset origin/master
Mais j'ai besoin de sortir de ça. Comment puis-je ramener HEAD à l'emplacement précédent?
J'ai le fragment SHA-1 ( 23b6772
) du commit vers lequel je dois le déplacer. Comment puis-je revenir à ce commit?
git checkout 23b6772
devrait faire.Réponses:
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 (excluantgit 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
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.
git reflog
Vous pouvez également utiliser le
reflog
.git reflog
affichera tout changement qui a mis à jour leHEAD
et la vérification de l'entrée de reflog souhaitée rétabliraHEAD
cette validation.Chaque fois que le HEAD est modifié, il y aura une nouvelle entrée dans le
reflog
Cela vous ramènera à votre engagement souhaité
git reset --hard <commit_id>
"Déplacez" votre HEAD vers le commit souhaité.
git rebase --no-autostash
.git revert <sha-1>
"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.
Ce schéma illustre quelle commande fait quoi.
Comme vous pouvez le voir,
reset && checkout
modifiez le fichierHEAD
.la source
Faire
Pour voir si vous êtes sur la bonne position:
Vous verrez quelque chose
Réécrivez ensuite l'historique sur votre télécommande pour refléter le changement:
la source
git push --force
. Dans de nombreuses situations, cela fera de vous la personne la moins populaire de l'équipe pendant un petit moment ....git push --force-with-lease
(article Thoughtbot : thinkingbot.com/blog/git-push-force-with-lease )revert
que les commits, je me suis retrouvé dans une situation incroyablement difficile.force-with-lease
m'a donné la confiance nécessaire pour réécrire l'histoire git de la branche sans affecter le travail des autres. Bravo!Solution la plus rapide possible (juste 1 étape)
Utilisation
git checkout -
Vous verrez
Switched to branch <branch_name>
. Confirmez que c'est la branche que vous voulez.Brève explication: cette commande ramènera HEAD à sa dernière position. Voir la note sur les résultats à la fin de cette réponse.
Mnémonique: cette approche est un peu comme utiliser
cd -
pour revenir à votre répertoire précédemment visité. La syntaxe et les cas applicables correspondent assez bien (par exemple, c'est utile lorsque vous voulez réellement que HEAD revienne là où il était).Solution plus méthodique (2 étapes, mais mémorable)
L'approche rapide résout la question du PO. Mais que se passe-t-il si votre situation est légèrement différente: disons que vous avez redémarré Bash puis vous vous retrouvez avec HEAD détaché. Dans ce cas, voici 2 étapes simples et faciles à retenir.
1. Choisissez la succursale dont vous avez besoin
Utilisation
git branch -v
Vous voyez une liste des succursales locales existantes. Saisissez le nom de la succursale qui correspond à vos besoins.
2. Déplacez HEAD dessus
Utilisation
git checkout <branch_name>
Vous verrez
Switched to branch <branch_name>
. Succès!Résultats
Quelle que soit la méthode, vous pouvez maintenant continuer à ajouter et à valider votre travail comme auparavant: vos prochaines modifications seront suivies
<branch_name>
.Notez que les deux
git checkout -
etgit checkout <branch_name>
donneront des instructions supplémentaires si vous avez validé des modifications pendant que HEAD était détaché.la source
git checkout 8acc968
puisgit branch -v
aMyBranch
dans la liste ci - dessous ... maisgit checkout MyBranch
supprime mes commentaires.git checkout 8acc968
vérifiera un commit, pas une branche. SiMyBranch
vous avez les validations souhaitées, essayezgit checkout MyBranch
. S'il ne contient pas les modifications du commit 8acc968, vous devrez fusionner ces modifications après avoir extrait la branche.git checkout
pour voir un commit précédent et je voulais revenir au dernier commit. Mais sans le dernier hachage de commit, j'étais quasiment perdu. Cette solution est parfaite pour ma situation!La question peut être lue comme suit:
J'étais en état détaché avec
HEAD
at23b6772
et tapégit reset origin/master
(parce que je voulais écraser). Maintenant , j'ai changé d' avis, comment dois - je retourner àHEAD
être à23b6772
?La réponse simple est:
git reset 23b6772
Mais j'ai répondu à cette question parce que j'en avais marre de taper (copier-coller) les hachages de commit ou son abréviation chaque fois que je voulais faire référence au précédent
HEAD
et que je cherchais sur Google pour voir s'il y avait une sorte de raccourci.Il s'avère que oui!
git reset -
(ou dans mon casgit cherry-pick -
)Ce qui était d'ailleurs la même chose que
cd -
de revenir au répertoire courant précédent dans * nix! Alors hourra, j'ai appris deux choses avec une pierre.la source
Lorsque vous exécutez la commande,
git checkout commit_id
HEAD détaché de13ca5593d(say commit-id)
et la branche sera disponible plus longtemps.Revenir à l'emplacement précédent exécutez la commande pas à pas -
git pull origin branch_name
(dites maître)git checkout branch_name
git pull origin branch_name
Vous serez de retour à l'emplacement précédent avec un commit mis à jour depuis le référentiel distant.
la source
Aujourd'hui, j'ai vérifié par erreur un commit et j'ai commencé à travailler dessus, faisant quelques commits sur un état de détachement HEAD. Ensuite, j'ai poussé vers la branche distante en utilisant la commande suivante:
ensuite
ensuite
J'ai finalement obtenu tous mes changements dans ma branche que j'ai faits dans Detach HEAD.
la source
Ce n'est peut-être pas une solution technique, mais cela fonctionne. (si l'un de vos coéquipiers a la même succursale en local)
Supposons que votre nom de branche soit branch-xxx .
Étapes à suivre:
Remarque: Encore une fois, ce n'est pas une solution technique, mais cela aidera à coup sûr.
la source