Comment annuler les plus récents commits locaux dans Git ?

J'ai accidentellement commis les mauvais fichiers sur [Git][1], mais je n'ai pas encore poussé le commit sur le serveur.

Comment puis-je annuler ces livraisons à partir du référentiel local ?

[1] : https://en.wikipedia.org/wiki/Git

Solution

Annuler un commit et le refaire

$ git commit -m "Something terribly misguided"             # (1)
$ git reset HEAD~                                          # (2)
>                              # (3)
$ git add ...                                              # (4)
$ git commit -c ORIG_HEAD                                  # (5)
  1. C'est ce que vous voulez annuler.
  2. Cela ne fait rien à votre arbre de travail (l'état de vos fichiers sur le disque), mais annule le commit et laisse les changements que vous avez commis non indexés (donc ils apparaîtront comme "Changes not staged for commit" dans git status, donc vous devrez les ajouter à nouveau avant de commiter). Si vous voulez seulement ajouter des changements au commit précédent, ou changer le message de commit1, vous pouvez utiliser git reset --soft HEAD~ à la place, ce qui est comme git reset HEAD~2 mais laisse vos changements existants indexés.
  3. Faites des corrections aux fichiers de l'arbre de travail.
  4. git add tout ce que vous voulez inclure dans votre nouveau commit.
  5. Validez les changements, en réutilisant l'ancien message de validation. reset a copié l'ancien head dans .git/ORIG_HEAD ; commit avec -c ORIG_HEAD ouvrira un éditeur, qui contient initialement le message de log de l'ancien commit et vous permet de le modifier. Si vous n'avez pas besoin de modifier le message, vous pouvez utiliser l'option -C.

Attention cependant, si vous avez ajouté de nouveaux changements à l'index, utiliser commit --amend les ajoutera à votre précédent commit.

[2] : https://git-scm.com/docs/git-reset

Si le code est déjà poussé sur votre serveur et que vous avez les permissions d'écraser l'historique (rebase) alors :

git push origin master --force

Vous pouvez également consulter cette réponse :

https://stackoverflow.com/questions/34519665/how-to-move-head-back-to-a-previous-location-detached-head/34519716#34519716

La réponse ci-dessus vous montrera git reflog qui est utilisé pour trouver quel est le SHA-1 auquel vous souhaitez revenir. Une fois que vous avez trouvé le point sur lequel vous souhaitez annuler, utilisez la séquence de commandes expliquée ci-dessus.


1 Notez cependant que vous n'avez pas besoin de revenir à un commit antérieur si vous avez juste fait une erreur dans votre message de commit. L'option la plus simple est de git reset (pour annuler tous les changements que vous avez faits depuis) et ensuite git commit --amend, ce qui ouvrira votre éditeur de messages de commit par défaut pré-rempli avec le dernier message de commit.

2 HEAD~ est le même que HEAD~1

Commentaires (17)

Ajoutez/supprimez des fichiers pour obtenir les choses comme vous le souhaitez :

git rm classdir
git add sourcedir

Puis modifiez le commit :

git commit --amend

Le commit précédent, erroné, sera modifié pour refléter le nouvel état de l'index - en d'autres termes, ce sera comme si vous n'aviez jamais fait d'erreur en premier lieu.

Notez que vous ne devriez faire ceci que si vous n'avez pas encore poussé. Si vous avez poussé, il vous suffit de commiter une correction normalement.

Commentaires (1)
git rm yourfiles/*.class
git commit -a -m "deleted all class files in folder 'yourfiles'"

ou

git reset --hard HEAD~1

Avertissement : La commande ci-dessus supprimera définitivement les modifications des fichiers .java (et tout autre fichier) que vous vouliez commettre.

Le hard reset à HEAD-1 remettra votre copie de travail à l'état de la livraison avant votre mauvaise livraison.

Commentaires (2)