Ce que vous devez faire est de créer un nouveau commit avec les mêmes détails que le HEAD
commit actuel , mais avec le parent comme la version précédente de HEAD
. git reset --soft
déplacera le pointeur de branche de sorte que le prochain commit se produise au-dessus d'un commit différent de celui où se trouve la tête de 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}
git reflog
pour trouver le bon numéro, par exemple{2}
.git commit --amend
. Le 2ème est un "refaire" dans un nouveau commit. Cela fonctionne pour tout le mondegit commit
, pas seulement--amend
.git commit
.git reset --soft HEAD@{1}
:fatal: ambiguous argument 'HEAD@1': unknown revision or path not in the working tree. Use '--' to separate paths from revisions
. Lorsque j'ai remplacéHEAD@{1}
par le hachage de validation équivalent indiqué dansgit reflog
(merci JJD!), Cette réponse a fonctionné à merveille!HEAD@{1}
. Si je lanceecho HEAD@{1}
dans tcsh par exemple, la sortie estHEAD@1
due au fait que les accolades ont été interprétées par tcsh. Si j'utilise des guillemets simples, les accolades sont préservées.utilisez le ref-log :
vous devez alors avoir toutes vos modifications précédemment modifiées uniquement dans votre copie de travail et vous pouvez recommencer
pour voir une liste complète des types d'indices précédents
git reflog
la source
HEAD@{1}
etHEAD~1
?HEAD~1
est exactement le même queHEAD^
et identifie le parent du commit actuel.HEAD@{1}
d'autre part, fait référence au commit auquel HEAD a fait référence avant celui-ci, c'est-à-dire qu'ils signifient des commits différents lorsque vous extrayez une branche différente ou modifiez un commit.git reset HEAD@{1}
suffit.Trouvez vos engagements modifiés en:
Remarque: vous pouvez ajouter
--patch
pour voir le corps des commits pour plus de clarté. Identique àgit reflog
.puis réinitialisez votre HEAD à n'importe quel commit précédent au point où cela allait:
Remarque: remplacez SHA1 par votre véritable hachage de validation. Notez également que cette commande perdra toutes les modifications non validées, vous pouvez donc les cacher auparavant. Vous pouvez également utiliser à la
--soft
place pour conserver les dernières modifications , puis les valider.Choisissez ensuite l'autre commit dont vous avez besoin:
la source
git reset SHA1 --soft
, vous pouvez conserver les dernières modifications, puis les valider.Vous pouvez toujours diviser un commit, à partir du manuel
la source
git reflog
est tout ce dont vous avez besoingit reset
au lieu degit reset --soft
, puis faitesgit add --patch
.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 il abandonnera la
git commit --amend
commande.la source
Peut être utilisé
git reflog
pour obtenir deux commit avant de modifier et après modifier.Ensuite, utilisez
git diff before_commit_id after_commit_id > d.diff
pour obtenir une différence entre avant modification et après modification.Utilisation suivante
git checkout before_commit_id
pour revenir à avant de validerEt dernière utilisation
git apply d.diff
pour appliquer le vrai changement que vous avez fait.Cela résout mon problème.
la source
Si vous avez poussé le commit à distance puis modifié par erreur les modifications apportées à ce commit, cela résoudra votre problème. Émettez un
git log
pour trouver le SHA avant le commit. (cela suppose que la télécommande est nommée origine). Émettez maintenant ces commandes en utilisant ce SHA.la source
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 les mêmes que précédemment. Vous avez donc terminé avec l'annulation pour
git commit —amend
Maintenant, vous pouvez le faire
git push origin <your_branch_name>
, pour pousser à la branche.la source
Près de 9 ans de retard, mais cette variation n'a pas été mentionnée comme accomplissant la même chose (c'est une sorte de combinaison de quelques-uns d'entre eux, similaire à la première réponse ( https://stackoverflow.com/a/1459264/4642530 ) .
Rechercher toutes les têtes détachées sur une branche
git reflog show origin/BRANCH_NAME --date=relative
Trouvez ensuite le hachage SHA1
Réinitialiser à l'ancien SHA1
git reset --hard SHA1
Poussez-le ensuite vers le haut.
git push origin BRANCH_NAME
Terminé.
Cela vous ramènera entièrement à l'ancien commit.
(Y compris la date de la tête de validation détachée remplacée précédente)
la source
--soft
pour conserver mes modifications. Je veux juste qu'il soit engagé séparémentPaiement vers une 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 le commit précédent. Vérifiez l'état de tous les fichiers.
git status
Réinitialisez vos fichiers de validation à partir de l'étape git.
git reset myfile1.js
(bientôt)Rattacher ce commit
git commit -C HEAD@{1}
Ajoutez et validez vos fichiers dans une nouvelle validation.
la source