Comment annuler "git commit --modifier "done" au lieu de " git commit"

j'ai accidentellement modifié ma précédente Commission. La validation doit avoir été séparé de conserver l'historique des modifications que j'ai apportées à un fichier particulier.

y a-t-il un moyen de défaire ce dernier engagement? Si je fais quelque chose comme git reset --hard HEAD^ , le premier commit est également annulé.

(Je n'ai pas encore poussé vers les répertoires distants)

978
demandé sur alex 2009-09-22 13:56:19

9 réponses

ce que vous devez faire est de créer une nouvelle propagation avec les mêmes détails que l'actuelle propagation HEAD , mais avec le parent comme version précédente de HEAD . git reset --soft déplacera le pointeur de la branche pour que la prochaine propagation se fasse sur une propagation différente de celle où se trouve actuellement la tête de la branche.

# 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}
1720
répondu CB Bailey 2015-12-17 04:43:13

utiliser le ref-journal :

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

vous devriez alors avoir toutes vos modifications précédemment modifiées seulement dans votre copie de travail et pouvez commettre à nouveau

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

107
répondu knittl 2009-09-22 10:14:20

Trouvez vos commits amendés par:

git log --reflog

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

puis réinitialisez votre tête à tout précédent commit au point qu'il était très bien par:

git reset SHA1 --hard

Note: remplacer SHA1 avec votre vrai hash de commit. Notez également que cette commande va perdre tout changement non engagé, donc vous pouvez les cacher avant. Alternativement, utilisez --soft à la place.

puis choisir l'autre commit dont vous avez besoin en plus de celui-ci:

git cherry-pick SHA1
34
répondu kenorb 2018-08-21 03:55:37

vous pouvez toujours diviser un commit, Du manuel

"
  • lancez un rebase interactif avec git rebase-i commit^, où commit est le commit que vous voulez partager. En fait, n'importe quelle plage de propagation fera l'affaire, tant qu'elle contient cette propagation.
  • marquez le commit que vous voulez partager avec l'action"edit".
  • quand il s'agit d'éditer ce commit, exécutez git reset HEAD^. L'effet est que le La tête est rebondie par un, et l'index suit la même voie. Cependant, l'arbre de travail reste la même.
  • Maintenant, ajoutez les modifications à l'index que vous voulez avoir dans la première propagation. Vous pouvez utiliser git add (éventuellement de manière interactive) ou git-gui (ou les deux) pour faire cela.
  • Commettre l'indice actuel avec ce message de commit est approprié maintenant.
  • répétez les deux dernières étapes jusqu'à ce que votre arbre de travail soit propre.
  • Continue le rebase avec git rebase -- continue.
21
répondu Arkaitz Jimenez 2009-09-22 10:01:22

peut-être peut-être utiliser git reflog pour obtenir deux propagation avant Modifier et après modifier.

puis utiliser git diff before_commit_id after_commit_id > d.diff pour obtenir diff entre avant Modifier et après modifier.

utilisation suivante git checkout before_commit_id retourner à avant de commettre

et dernière utilisation git apply d.diff pour appliquer le changement réel que vous avez fait.

ça résout mon problème.

13
répondu utzcoz 2017-01-19 07:34:51

vaut peut-être la peine de noter que si vous êtes toujours dans votre éditeur avec le message de propagation, vous pouvez supprimer le message de propagation et il annulera la commande git commit --amend .

12
répondu Justin Schulz 2017-03-03 18:45:09

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

  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. Si vous avez terminé avec l'annulation de "git commit -modifier" Maintenant, vous pouvez faire "git push origin", pousser la branche

2
répondu Pratik 2018-06-25 11:46:23

presque 9 ans de retard à cela, mais n'a pas vu cette variation mentionné accomplir la même chose (c'est une sorte de combinaison de quelques-uns de ces, similaire à la réponse de haut ( 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

puis trouver le hash SHA1

revenir à la vieille SHA1

git reset --hard SHA1

alors poussez-le vers le haut.

git push origin BRANCH_NAME

fait.

cela vous ramènera entièrement à l'ancienne commit.

(y compris la date de la tête de commit détachée antérieure)

1
répondu garrettmac 2018-06-17 21:55:20
  1. passer à la Caisse pour temporaire de la direction, 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 de la commit précédente. Vérifier l'état de tous les fichiers.

    git status

  4. réinitialiser votre commit les fichiers de l'étape git.

    git reset myfile1.js (ainsi de suite)

  5. Rattacher à ce commit

    git commit -C HEAD@{1}

  6. Ajoutez et propagez vos fichiers vers new commit.

0
répondu Priyanshu Chauhan 2016-03-04 07:28:58