Comment annuler “git commit –amend” au lieu de “git commit”

J’ai accidentellement modifié mon engagement précédent. Le commit aurait dû être séparé pour conserver l’historique des modifications apscopes à un fichier particulier.

Est-il possible de défaire 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)

Ce que vous devez faire est de créer un nouveau commit avec les mêmes détails que la validation HEAD actuelle, mais avec le parent comme version précédente de HEAD . git reset --soft déplacera le pointeur de twig de sorte que le prochain commit se produise au-dessus d’un commit différent de celui où se trouve le head actuel.

 # 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 devriez alors avoir toutes vos modifications précédemment modifiées uniquement dans votre copie de travail et vous pouvez vous engager à nouveau

pour voir la liste complète des indices précédents, tapez git reflog

Trouvez vos modifications commises par:

 git log --reflog 

Note: Vous pouvez append --patch pour voir le corps des commits pour plus de clarté. Identique à git reflog .

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

 git reset SHA1 --hard 

Remarque: remplacez SHA1 par votre véritable hash de validation. Notez également que cette commande perd toutes les modifications non validées, vous pouvez donc les cacher auparavant. Vous pouvez également utiliser --soft place.

Puis cueillez l’autre article dont vous avez besoin:

 git cherry-pick SHA1 

Vous pouvez toujours diviser un commit, à partir du manuel

  • Lancez un rebase interactif avec git rebase -i commit ^, où commit est le commit que vous souhaitez diviser. En fait, toute plage de validation fera l’affaire, tant qu’elle contient cette validation.
  • Marquez le commit que vous souhaitez partager avec l’action “edit”.
  • Quand il s’agit de modifier cette validation, exécutez git reset HEAD ^. L’effet est que le HEAD est rembobiné de un et que l’index suit. Cependant, l’arbre de travail rest le même.
  • Ajoutez maintenant les modifications à l’index que vous souhaitez avoir dans le premier commit. Vous pouvez utiliser git add (éventuellement interactivement) ou git-gui (ou les deux) pour le faire.
  • Validez l’index maintenant avec n’importe quel 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 – continuez.

Peut-être peut utiliser git reflog pour obtenir deux commit avant de modifier et de modifier.

Ensuite, utilisez git diff before_commit_id after_commit_id > d.diff pour obtenir la diff entre avant modification et après modification.

Ensuite, utilisez git checkout before_commit_id pour revenir à avant de valider

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

Cela résout mon problème.

Peut-être utile de noter que si vous êtes toujours dans votre éditeur avec le message de validation, vous pouvez supprimer le message de validation et il git commit --amend commande git commit --amend .

Presque 9 ans de retard à ce sujet, mais cette variation n’a pas été mentionnée comme accomplissant la même chose (c’est en quelque sorte une combinaison de ceux-ci, similaire à la meilleure réponse: https://stackoverflow.com/a/1459264/4642530 ) .

Rechercher toutes les têtes détachées sur une twig

git reflog show origin/BRANCH_NAME --date=relative

Puis trouvez le hash 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 engagement.

(Y compris la date de la tête d’engagement préalable écrasée antérieure)

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 précédemment. Donc, vous avez fini avec l’annulation pour “git commit —amend” Maintenant, vous pouvez faire “git push origin”, pour pousser à la twig

  1. Paiement à la twig 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 que vous avez validés, ainsi que les validations précédentes. Vérifiez l’état de tous les fichiers.

    git status

  4. Réinitialisez vos fichiers de validation à partir de l’étape git.

    git reset myfile1.js (ainsi de suite)

  5. Rattachez ce commit

    git commit -C HEAD@{1}

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