Comment supprimer les n derniers commits sur Github et localement?

127

J'essaye de supprimer les 2 derniers commits de l'un de mes référentiels GitHub. J'ai essayé comme suggéré ici : git push -f origin HEAD^^:master. Il semble que cela fonctionne, car les deux derniers commits sont supprimés.

Ensuite, je les ai supprimés de mon référentiel local avec git rebase -i HEAD~2. Je supprime les lignes liées à ces commits et vérifie git logqu'elles sont correctement supprimées.

Après cela, j'apporte quelques modifications dans mon référentiel local, je fais un nouveau commit et je pousse sur GitHub. Le problème est que, dans mon compte GitHub, j'ai les deux précédents commits que j'ai essayé de supprimer.

Je pense que le problème est dans mon référentiel local, car si je clone mon référentiel Github dans mon référentiel local et que j'apporte des modifications ici, lorsque je pousse un nouveau commit, ces anciens commits ne sont pas poussés vers GitHub.

Une idée?

Ivan Fernandez
la source

Réponses:

199

Pour supprimer les deux derniers commits localement, je suggère d'utiliser:

git reset --hard HEAD^^

Rebase est une opération complètement différente qui ne vous aidera pas ici.

KL-7
la source
23
Si vous avez déjà poussé cette modification vers un référentiel distant. Vous pouvez le supprimer avec git push -f
Ivan Fernandez
Pouvez-vous généraliser cela pour le dernier nombre de commits?
user_19
6
@ user_19 vous pouvez faire des choses comme git reset --hard HEAD^4ou git reset --hard HEAD~4. Cependant, les choses peuvent devenir un peu compliquées si votre historique contient des fusions. Vous pouvez trouver plus d'informations sur la spécification des révisions dans la section correspondante ici .
KL-7
2
Si je voulais supprimer les 7 derniers commits, alors ?? Dois-je mettre 7 fois ^ après HEAD ... s'il vous plaît effacez-moi
Gagan Gami
4
@GaganGami, je pense que vous le feriez git reset --hard HEAD~7, mais corrigez-moi si je me trompe.
Con Antonakos
105

Si vous souhaitez supprimer les 2 (deux) derniers commits, il existe une commande simple pour le faire:

git reset --hard HEAD~2

Vous pouvez modifier le 2pour n'importe quel nombre de derniers validations que vous souhaitez supprimer.

Et pour pousser ce changement vers remote, vous devez faire un git pushavec le paramètre force ( -f):

git push -f

Cependant, je ne recommande pas de faire une gitcommande avec -fou des --hardoptions impliquées s'il y a de nouveaux commits à distance (Github) après ces commits que vous souhaitez supprimer. Dans ce cas, utilisez toujours git revert.

Dherik
la source
Les modifications que j'ai apportées restent-elles?
Zuhayer Tahir
@SymfonyUser, non. Lorsque vous avez effectué la hardcommande, vous perdez ces deux validations. Si vous souhaitez enregistrer les modifications, créez un difffichier de ces validations avant d'appliquer la réinitialisation.
Dherik
3
@ZuhayerTahir si vous voulez simplement annuler la commettre pour les 5 dernières commits puis le faire git reset HEAD~5(ne pas utiliser hard). De cette façon, vous obtiendrez vos modifications dans un état par étapes (c'est-à-dire non validées). Pour moi, voyez cette réponse .
Honey
@Honey Merci pour votre réponse. Je suis arrivé à la même conclusion.
Zuhayer Tahir
29

Ce qui suit fonctionne pour moi

git reset HEAD~n

Il supprime les derniers ncommits du dépôt local, comme HEAD^n'en supprime qu'un seul. Si vous devez supprimer ces modifications de la télécommande, vous devrez peut-être forcer la poussée car vous serez derrière la télécommande.

git push -f origin <branch>
Sial01
la source