J'ai accidentellement modifié mon commit précédent. Le commit aurait dû être séparé pour conserver l'historique des modifications apportées à un fichier particulier.
Y a-t-il un moyen d'annuler ce dernier commit? Si je fais quelque chose comme git reset --hard HEAD^
, le premier commit est également annulé.
(Je n'ai encore poussé dans aucun répertoire distant)
Ce que vous devez faire est de créer un nouveau commit avec les mêmes détails que le commit actuel HEAD
, mais avec le parent de la version précédente de HEAD
. git reset --soft
déplacera le pointeur de la branche de sorte que la prochaine validation se produise par-dessus une validation différente de celle où se trouve maintenant l'en-tête de la branche actuelle.
# Move the current head so that it's pointing at the old commit
# Leave the index intact for redoing the commit.
# HEAD@{1} gives you "the commit that HEAD pointed at before
# it was moved to where it currently points at". Note that this is
# different from HEAD~1, which gives you "the commit that is the
# parent node of the commit that HEAD is currently pointing to."
git reset --soft HEAD@{1}
# commit the current tree using the commit details of the previous
# HEAD commit. (Note that HEAD@{1} is pointing somewhere different from the
# previous command. It's now pointing at the erroneously amended commit.)
git commit -C HEAD@{1}
utilisez le ref-log :
git branch fixing-things HEAD@{1}
git reset fixing-things
vous ne devriez alors avoir que toutes vos modifications précédemment modifiées dans votre copie de travail et vous pouvez les réengager
pour voir une liste complète des types d’index précédents git reflog
Trouvez vos commits modifiés par:
git log --reflog
Remarque: vous pouvez ajouter --patch
pour afficher le corps des validations par souci de clarté. Identique à git reflog
.
puis réinitialisez votre HEAD à n'importe quel commit précédent au moment où cela s'est bien passé par:
git reset SHA1 --hard
Remarque: Remplacez SHA1 par votre véritable hachage de validation. Notez également que cette commande va perdre toutes les modifications non validées, vous pouvez donc les cacher auparavant. Sinon, tilisez --soft
à la place pour conserver les dernières modifications, puis validez-les.
Puis sélectionnez l’autre commet dont vous avez besoin:
git cherry-pick SHA1
Vous pouvez toujours diviser un commit, à partir du manuel
Peut-être peut-on utiliser git reflog
pour obtenir deux commit avant amende et après amende.
Ensuite, utilisez git diff before_commit_id after_commit_id > d.diff
pour obtenir le diff entre before amend et after amend.
Ensuite, utilisez git checkout before_commit_id
pour revenir à avant commit
Et dernière utilisation git apply d.diff
pour appliquer le changement réel que vous avez fait.
Cela résout mon problème.
Il est peut-être intéressant de noter que si vous êtes toujours dans votre éditeur avec le message de validation, vous pouvez supprimer le message de validation et la commande git commit --amend
sera abandonnée.
Vous pouvez faire ci-dessous pour annuler votre git commit —amend
git reset --soft HEAD^
git checkout files_from_old_commit_on_branch
git pull Origin your_branch_name
====================================
Maintenant, vos modifications sont comme par le passé. Vous avez donc terminé avec l'annulation de git commit —amend
Vous pouvez maintenant faire git Push Origin <your_branch_name>
, Appuyer sur la branche.
Si vous avez poussé le commit vers distant, puis modifié à tort, les modifications apportées à ce commit résolvent votre problème. Émettez un git log
pour trouver le SHA avant la validation. (cela suppose que la télécommande est nommée origine). Maintenant, lancez ces commandes en utilisant ce SHA.
git reset --soft <SHA BEFORE THE AMMEND>
#you now see all the changes in the commit and the amend undone
#save ALL the changes to the stash
git stash
git pull Origin <your-branch> --ff-only
#if you issue git log you can see that you have the commit you didn't want to amend
git stash pop
#git status reveals only the changes you incorrectly amended
#now you can create your new unamended commit
Près de 9 ans de retard, mais je n'ai pas vu cette variante mentionnée accomplir la même chose (c'est en quelque sorte une combinaison de quelques-unes de ces modifications, similaire à top answer ( https://stackoverflow.com/a/ 1459264/46425 ).
Rechercher toutes les têtes détachées sur une branche
git reflog show Origin/BRANCH_NAME --date=relative
Puis trouvez le hash SHA1
Réinitialisation à l'ancien SHA1
git reset --hard SHA1
Puis repoussez-le vers le haut.
git Push Origin BRANCH_NAME
Fait.
Cela vous ramènera entièrement à l'ancien commit.
(Y compris la date de la tête de validation détachée précédemment écrasée)
Passer à la branche temporaire avec le dernier commit
git branch temp HEAD@{1}
Réinitialiser le dernier commit
git reset temp
Maintenant, vous aurez tous les fichiers de votre commit ainsi que du commit précédent. Vérifier l'état de tous les fichiers.
git status
Réinitialisez vos fichiers de commit à partir de git stage.
git reset myfile1.js
(ainsi de suite)
Rattachez ce commit
git commit -C HEAD@{1}
Ajoutez et validez vos fichiers dans un nouveau commit.