Supprimer un commit git qui n'a pas été poussé


724

J'ai fait un git commitmais je ne l'ai pas encore poussé vers le référentiel. Donc quand je le fais git status, je reçois '# Votre branche est en avance sur' master 'par 1 commit.

Donc, si je veux revenir en arrière, je peux simplement faire:

git reset --hard eb27bf26dd18c5a34e0e82b929e0d74cfcaab316

étant donné que quand je le fais, git logje reçois:

valider eb27bf26dd18c5a34e0e82b929e0d74cfcaab316
Date: mar 29 sept 11:21:41 2009 -0700


commit db0c078d5286b837532ff5e276dcf91885df2296
Date: mar 22 sept 10:31:37 2009 -0700

9
Cette question semble être un doublon d'une autre de vos propres questions: stackoverflow.com/questions/1338728/how-to-delete-a-git-commit
Brian Campbell



3
DANGER: reset --hardpeut entraîner une perte de travail, car cela entraîne l'écrasement de vos fichiers locaux (votre nouveau travail) par ceux du Web (ce qui m'est arrivé). Les questions et réponses sur git doivent indiquer explicitement ce que font leurs commandes et quels sont les risques pour les lecteurs.
OrangeSherbet

Réponses:


673

En fait, lorsque vous utilisez git reset, vous devez vous référer à la commettras que vous réinitialisez à ; vous voudriez donc db0c078probablement le commit.

Une version plus simple serait git reset --hard HEAD^de réinitialiser le commit précédent avant la tête courante; de cette façon, vous n'avez pas à copier les ID de validation.

Méfiez-vous lorsque vous effectuez une opération git reset --hard, car vous pouvez perdre toutes les modifications non engagées que vous avez. Vous voudrez peut-être vérifier git statusque votre copie de travail est propre ou que vous souhaitez supprimer les modifications qui s'y trouvent.

De plus, au lieu de HEAD, vous pouvez utiliser origin/mastercomme référence, comme suggéré par @bdonlan dans les commentaires:git reset --hard origin/master


374
Ou git reset --hard origin/master, pour le réinitialiser quelle que soit l'origine.
bdonlan

1
Un autre pointeur utile que vous pouvez réinitialiser est ORIG_HEAD ou sa généralisation en utilisant reflog HEAD @ {1} (la dernière position de HEAD).
Jakub Narębski

12
Lecteur, devant vous git resetvotre code. Faites votre avenir privez: La différence entre reset, reset --softet reset --hard(Qu'est - ce qui arrive à votre plus tôt git addalias « votre travail » :) Image: lien
user18099

3
Notez que cela supprimera tout ce qui était dans le commit que vous souhaitez supprimer (ainsi git status, aucun changement ne sera affiché et le commit sera supprimé / les modifications seront perdues).
Bjørn Børresen

12
REMARQUE: soyez prudent lors de l'utilisation git reset --hard HEAD^car vous perdrez les modifications dans les fichiers validés (vos modifications seront supprimées). Il y a deux branches à cette question: pour annuler un commit mais avoir encore des modifications sur le disque, faites-legit reset --soft HEAD~1
papigee

625

SI vous n'avez PAS poussé vos modifications vers la télécommande

git reset HEAD~1

Vérifiez si la copie de travail est propre git status.

Sinon, vous avez poussé vos modifications vers la télécommande

git revert HEAD

Cette commande annulera / supprimera le dernier commit / change et vous pourrez ensuite pousser


34
Ceci répond à "Supprimer le dernier git commit qui n'a pas été poussé" (réponse la plus proche à
mon humble avis

25
En outre, il conserve les modifications locales effectuées lors du dernier commit, tandis que git reset --hard ne le fait pas
Stanimir Stoyanov

1
pour moi, il annulera le dernier commit poussé et le commit non poussé
CodyChan

git revert HEAD pour moi vient de supprimer tous les fichiers que j'avais prêt à pousser. Faites attention!
Jason Bruce

159
git reset --hard origin/master

pour le réinitialiser quelle que soit l'origine.

Cela a été publié par @bdonlan dans les commentaires . J'ai ajouté cette réponse aux personnes qui ne lisent pas les commentaires.


4
Cette question a été posée il y a près de 5 ans, et elle figure déjà dans l'un des commentaires.
Anubian Noob

1
Que se passe-t-il si la branche locale actuelle diffère de master- dois-je utiliser origin/mybranchalors?
Pavel Vlasov

9
Je n'ai pas l'habitude de lire les commentaires quand je suis pressé d'avoir une réponse ... Merci d'avoir mis une réponse (une simple qui fonctionne)
Leonardo Alves Machado

Attention: sachez que cela supprimera toutes vos modifications de code existantes, autres que celles git reset HEAD~qui ne font que remettre le commit en code
Mayer Spitzer

70

Il y a deux branches à cette question (annuler une validation ne signifie pas que je veux perdre toutes mes modifications locales):

1. Pour annuler les dernières modifications de validation et d' annulation dans le fichier validé, procédez comme suit :

git reset --hard HEAD~1

2. Pour annuler la dernière validation mais conserver les modifications locales (sur le disque), procédez comme suit:

git reset --soft HEAD~1

Cette (la dernière commande) vous amènera à l'état que vous auriez été si vous l'aviez fait git add.

Si vous souhaitez décompresser les fichiers après cela, faites

git reset

Vous pouvez maintenant apporter plus de modifications avant d'ajouter puis de recommencer.


47

Tapez simplement dans la console:

$ git reset HEAD~

Cette commande annule toutes les validations locales avant la tête distante


7
Pouvez-vous expliquer ce que votre réponse ajoute aux réponses existantes?
nvoigt

Cela efface le commit actuel avant de pousser - sans annuler les modifications que vous avez apportées localement - comme les autres réponses - ce qui pourrait être un moment d'extraction des cheveux sévère
Grant

43

Je crois que l'un d'entre eux répondra à vos besoins

1 - Annuler la validation et conserver tous les fichiers en attente: git reset --soft HEAD~;

2 - Annulez la validation et supprimez tous les fichiers: git reset HEAD~;

3 - Annulez le commit et supprimez complètement toutes les modifications: git reset --hard HEAD~;

voici où j'ai trouvé la réponse


Cette réponse doit être acceptée: D
Aaron John Sabu

30

Supprimer le dernier commit avant push

git reset --soft HEAD~1

1signifie le dernier commit, si vous voulez supprimer deux dernières utilisations 2, etc. *


3
Bonjour Karina, la mention de --softest un excellent ajout aux réponses possibles, mais pourriez-vous également mentionner pourquoi? Expliquer votre solution est toujours utile. Essayez également de vous en tenir à l'anglais. Merci
Vlastimil Ovčáčík

1
--soft- garantit que vous ne perdez pas les modifications du fichier dont vous essayez d'annuler la
validation

19

J'ai vécu la même situation que celle ci-dessous, car cela était beaucoup plus facile. En passant, commit-Idvous pouvez atteindre le commit particulier que vous souhaitez effectuer:

git reset --hard {commit-id}

Comme vous voulez supprimer votre dernier commit, vous devez donc passer l' commit-Idendroit où vous devez déplacer votre pointeur:

git reset --hard db0c078d5286b837532ff5e276dcf91885df2296

Juste un avertissement pour les débutants comme moi - sauvegardez tous les fichiers où vous souhaitez conserver les modifications, car ils seront rétablis dans la version précédente. Mon scénario était que j'ai accidentellement mis un vidage de base de données dans mon répertoire repo et que je me suis engagé - je ne voulais évidemment pas valider ces fichiers dans le repo mais DID voulait garder les modifications que j'avais apportées à d'autres fichiers. J'ai donc dû copier et coller les modifications requises à partir de la sauvegarde que j'ai faite AVANT de faire la réinitialisation de git.
user1063287

10

C'est ce que je fais:

Vérifiez d'abord votre succursale (pour ma mastersuccursale de cas ):

git checkout master

Ensuite, réinitialisez sur TETE distante ^ ( cela supprimera toutes vos modifications locales ), forcez le nettoyage et tirez:

git reset HEAD^ --hard && git clean -df && git pull

1
C'est une option très nucléaire. Je suggérerais une réinitialisation logicielle pour un commit limité.
c0der512

3

Une façon consiste à supprimer la branche locale et à extraire cette branche du serveur si votre branche locale est en avance sur distante par plusieurs validations et que vous devez toutes les annuler.


réponse brillante - il permet de cliquer facilement dans sourcetree :)
Kamil Kiełczewski

1

J'ai juste eu le même problème et j'ai fini par faire:

git rebase -i HEAD~N

(N est le nombre de commits que git vous montrera)

Cela invite votre éditeur de texte et vous pouvez ensuite supprimer la validation que vous souhaitez en supprimant la ligne qui lui est associée.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.