D'abord, "votre branche est en avance sur origine / master par 3 validations", puis mon application est revenue à une date antérieure avec des modifications antérieures.
Comment récupérer ce que j'ai passé les 11 dernières heures à faire?
D'abord, "votre branche est en avance sur origine / master par 3 validations", puis mon application est revenue à une date antérieure avec des modifications antérieures.
Comment récupérer ce que j'ai passé les 11 dernières heures à faire?
Réponses:
git reflog
est votre ami. Recherchez le commit sur lequel vous souhaitez figurer dans cette liste et vous pouvez le réinitialiser (par exemple:) git reset --hard e870e41
.
(Si vous n'avez pas validé vos modifications ... vous pourriez avoir des problèmes - engagez-vous tôt et engagez-vous souvent!)
git log HEAD@{1}
. Si cela ressemble à la bonne série de validations, vous pouvez git reset HEAD@{1}
.
git fsck --lost-found
.
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
à un moment donné (à l'exclusion git worktree
).
Le contenu de HEAD
est stocké à l'intérieur .git/HEAD
et contient les 40 octets SHA-1 du commit actuel.
detached HEAD
Si vous n'êtes pas sur le dernier commit - ce qui signifie qu'il HEAD
pointe vers un commit précédent dans l'historique, il 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:
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 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>
git reflog
Vous pouvez toujours utiliser le reflog
aussi.
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é
git reset --hard <commit_id>
"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.
git rebase --no-autostash
.git revert <sha-1>
"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 a 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
.
git reset --hard <commit_id>
enlevant HEAD
travaillé! +1 pour la représentation graphique !!.
git reflog <branchname>
peut être très utile, car vous voyez les changements d'une seule branche.
Une autre façon d'accéder au commit supprimé est avec la git fsck
commande.
git fsck --lost-found
Cela produira quelque chose comme à la dernière ligne:
dangling commit xyz
Nous pouvons vérifier qu'il s'agit du même commit en utilisant reflog
comme suggéré dans d'autres réponses. Maintenant, nous pouvons faire ungit merge
git merge xyz
Remarque:
Nous ne pouvons pas récupérer la validation avec fsck
si nous avons déjà exécuté une git gc
commande qui supprimera la référence à la validation suspendue.