web-dev-qa-db-fra.com

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

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)

1134
Jesper Rønn-Jensen

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}
1985
CB Bailey

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

118
knittl

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
56
kenorb

Vous pouvez toujours diviser un commit, à partir du manuel

  • Démarrez une base interactive avec git rebase -i commit ^, où commit est la validation que vous souhaitez scinder. En fait, toute plage de validation conviendra, à condition qu'elle contienne cette validation.
  • 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 la HEAD est rembobinée d'une unité et que l'index fait de même. Cependant, l’arbre de travail reste le même.
  • Ajoutez maintenant les modifications à l'index que vous souhaitez inclure dans la première validation. Vous pouvez utiliser git add (éventuellement de manière interactive) ou git-gui (ou les deux) pour le faire.
  • Commencez l'index maintenant en vigueur avec le message de validation approprié.
  • Répétez les deux dernières étapes jusqu'à ce que votre arbre de travail soit propre.
  • Continuez la rebase avec git rebase --continue.
23
Arkaitz Jimenez

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.

13
utzcoz

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.

13
Justin Schulz

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

3
Pratik

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
3
David Sopko

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)

2
garrettmac
  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 du commit précédent. Vérifier l'état de tous les fichiers.

    git status

  4. Réinitialisez vos fichiers de commit à partir de git stage.

    git reset myfile1.js (ainsi de suite)

  5. Rattachez ce commit

    git commit -C HEAD@{1}

  6. Ajoutez et validez vos fichiers dans un nouveau commit.

1