Question Comment annuler "git commit --amend" fait à la place de "git commit"


J'ai accidentellement modifié mon précédent commit. La validation aurait dû être séparée 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 pas encore poussé vers des répertoires distants)


942
2017-09-22 09:56


origine


Réponses:


Ce que vous devez faire est de créer un nouveau commit avec les mêmes détails que le courant HEAD commettre, mais avec le parent comme la version précédente de HEAD. git reset --soft déplacera le pointeur de branche de sorte que la prochaine validation se produise au-dessus d'un commit différent de celui où la tête de branche actuelle est maintenant.

# 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}

1662
2017-09-22 10:23



Utilisez le ref-log:

git branch fixing-things HEAD@{1}
git reset fixing-things

vous devriez alors avoir tous vos changements précédemment modifiés seulement dans votre copie de travail et pouvez commettre encore

pour voir une liste complète des types d'indices précédents git reflog


101
2017-09-22 10:02



Trouvez vos modifications modifiées par:

git log --reflog

Note: Vous pouvez ajouter --patch voir le corps des commits pour plus de clarté. Pareil que git reflog.

puis réinitialisez votre HEAD à tout commit précédent au moment où il était correct par:

git reset SHA1 --hard

Remarque: Remplacer SHA1 avec votre vrai hash de commit. Notez également que cette commande perdre les modifications non validées, vous pouvez donc les stocker avant.

Ensuite, choisissez l'autre commit dont vous avez besoin:

git cherry-pick SHA1

32
2018-03-27 01:56



Vous pouvez toujours diviser un commit, Du Manuel

  • Démarrez une rebase interactive avec git rebase -i commit ^, où commit est le commit que vous voulez diviser. En fait, toute plage de validation fera l'affaire, tant qu'elle contient ce commit.
  • Marquez le commit que vous voulez scinder avec l'action "edit".
  • Quand il s'agit d'éditer ce commit, exécutez git reset HEAD ^. L'effet est que le HEAD est rembobiné par un, et l'index suit. Cependant, l'arbre de travail reste le même.
  • Maintenant, ajoutez les changements à l'index que vous voulez avoir dans le premier commit. Vous pouvez utiliser git add (éventuellement interactif) ou git-gui (ou les deux) pour le faire.
  • Validez l'index actuel avec le message de validation approprié.
  • Répétez les deux dernières étapes jusqu'à ce que votre arbre de travail soit propre.
  • Continuez le rebase avec git rebase --continue.

20
2017-09-22 10:01



Peut-être utiliser git reflog pour obtenir deux s'engager avant de modifier et après amender.

Ensuite, utilisez git diff before_commit_id after_commit_id > d.diff obtenir diff entre avant modifier et après amender.

Prochaine utilisation git checkout before_commit_id revenir à avant de commettre

Et dernière utilisation git apply d.diff pour appliquer le vrai changement que vous avez fait.

Cela résout mon problème.


13
2017-09-20 12:39



Notez que si vous êtes toujours dans votre éditeur avec le message de validation, vous pouvez supprimer le message de validation et annuler git commit --amend commander.


12
2018-03-03 18:45



Près de 9 ans en retard à cela, mais n'a pas vu cette variation mentionnée accomplissant la même chose (c'est une sorte de combinaison de quelques-uns d'entre eux, semblable à la meilleure 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

Ensuite, trouvez le hachage SHA1

Réinitialiser à l'ancien SHA1

git reset --hard SHA1

Ensuite, repoussez-le.

git push origin BRANCH_NAME

Terminé.

Cela vous ramènera entièrement à l'ancien commit.

(Y compris la date de la tête de commit détachée précédemment écrasée)


1
2018-06-17 21:55



  1. Passer à la branche temporaire avec le dernier commit

    git branch temp HEAD@{1}

  2. Réinitialiser le dernier commit

    git reset temp

  3. 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

  4. Réinitialisez vos fichiers de commit de l'étape git.

    git reset myfile1.js (bientôt)

  5. Rattacher ce commit

    git commit -C HEAD@{1}

  6. Ajoutez et validez vos fichiers à la nouvelle validation.


0
2018-03-04 07:28



Vous pouvez faire ci-dessous pour annuler votre "git commit -amend"

  1. $ git reset --soft HEAD ^
  2. $ git checkout files_from_old_commit_on_branch
  3. $ git pull origine votre_branch_name

==============================

Maintenant, vos modifications sont conformes à la précédente. Donc, vous avez terminé avec l'annulation pour "git commit -amend" Maintenant, vous pouvez faire "git push origine", pour pousser à la branche


0
2018-06-25 11:46