1776 votes

Comment défaire "git commit --amend" fait au lieu de "git commit" ?

J'ai accidentellement modifié mon précédent commit. Le commit aurait dû être séparé pour conserver l'historique des modifications que j'ai apportées à un fichier particulier.

Y a-t-il un moyen d'annuler cette dernière livraison ? 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)

0 votes

si vous voulez confirmer les effets de chacune des étapes que vous avez suivies (soit avant d'essayer les réponses ci-dessous, soit si votre tête commence à tourner pendant l'exécution de l'une d'entre elles) essayez git log --reflog -p -- {{name-of-the-dir-or-file-in-question}} . Il montre à la fois les changements réels et les messages de validation pour chaque action.

26voto

Justin Schulz Points 319

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 cela interrompra le processus de validation. git commit --amend commandement.

25voto

Arkaitz Jimenez Points 10651

Vous pouvez toujours diviser un commit, à partir de la manuel

  • Démarrez un rebasement interactif avec git rebase -i commit^, où commit est le commit que vous voulez diviser. En fait, n'importe quelle plage de commit fera l'affaire, tant qu'elle contient ce commit.
  • Marquez le commit que vous voulez diviser avec l'action "edit".
  • Quand il s'agit de modifier ce commit, exécutez git reset HEAD^. L'effet est que le HEAD est remonté d'une unité, 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 de manière interactive) ou git-gui (ou les deux) pour faire cela.
  • Livrer l'index actuel avec le message de livraison approprié.
  • Répétez les deux dernières étapes jusqu'à ce que votre arbre de travail soit propre.
  • Continuez le rebasement avec git rebase --continue.

32 votes

Bien trop compliqué. git reflog c'est tout ce dont vous avez besoin

2 votes

Beaucoup d'étapes, certes, mais chaque étape est simple et facile à réaliser. Cela a fonctionné pour moi et obtient mon vote.

5 votes

De plus, cette réponse vous permet de sélectionner les modifications que vous avez accidentellement "modifiées", afin de fournir une valeur supplémentaire à l'approche git reset --soft HEAD@{1} (qui a résolu mon problème).

21voto

utzcoz Points 491

On peut peut-être utiliser git reflog pour obtenir deux engagements avant modification et après modification.

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

Utilisation suivante git checkout before_commit_id à dos à avant de commettre

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

Cela résout mon problème.

11voto

Pratik Points 546

Vous pouvez faire ce qui suit 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 changements sont les mêmes que précédemment. Donc, vous avez terminé avec l'annulation pour git commit —amend

Maintenant, vous pouvez faire git push origin <your_branch_name> pour pousser vers la branche.

7voto

garrettmac Points 4292

Presque 9 ans de retard, mais je n'ai pas vu cette variante mentionnée pour accomplir la même chose (c'est une sorte de combinaison de quelques-unes de ces variantes, similaire à la première réponse ( https://stackoverflow.com/a/1459264/4642530 ).

Rechercher toutes les têtes détachées sur la branche

git reflog show origin/BRANCH_NAME --date=relative

Ensuite, trouvez le hachage SHA1

Remise à l'ancien SHA1

git reset --hard SHA1

Puis poussez-le vers le haut.

git push origin BRANCH_NAME

C'est fait.

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

(y compris la date de l'écrasement précédent de la tête de commit détachée)

4 votes

Oui, mais je veux généralement réinitialiser --soft pour conserver mes changements. Je veux juste qu'il soit engagé séparément

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X