Comment annuler les plus récents commits dans Git?

J’ai accidentellement commis de mauvais fichiers sur Git , mais je n’ai pas encore poussé le commit sur le serveur.

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

Annuler un commit et refaire

 $ git commit -m "Something terribly misguided" # (1) $ git reset HEAD~ # (2) < < edit files as necessary >> # (3) $ git add ... # (4) $ git commit -c ORIG_HEAD # (5) 
  1. C’est ce que vous voulez défaire
  2. Cela laisse votre arborescence de travail (l’état de vos fichiers sur le disque) inchangée, mais annule la validation et laisse les modifications que vous avez effectuées non organisées (elles apparaîtront alors comme “Modifications non prévues pour la validation” dans l’ git status , et vous devrez ajoutez-les à nouveau avant de valider). Si vous voulez seulement append plus de modifications au commit précédent, ou changer le message de validation 1 , vous pouvez utiliser git reset --soft HEAD~ , qui est comme git reset HEAD~ (où HEAD~ est identique à HEAD~1 ) mais laisse vos changements existants mis en scène.
  3. Corrigez les fichiers d’arbre de travail.
  4. git add tout ce que vous voulez inclure dans votre nouvel commit.
  5. Validez les modifications en réutilisant l’ancien message de validation. reset copié l’ancienne tête à .git/ORIG_HEAD ; commit avec -c ORIG_HEAD ouvrira un éditeur qui contient initialement le message de journal 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 nouvelles modifications à l’index, l’utilisation de commit --amend les appenda à votre commit précédent.

Si le code est déjà envoyé sur votre serveur et que vous êtes autorisé à écraser l’historique (rebase), procédez comme suit:

 git push origin master --force 

Vous pouvez également regarder cette réponse:

Comment déplacer HEAD vers un emplacement précédent? (Tête détachée)

La réponse ci-dessus vous indiquera git reflog utiliser le SHA-1 auquel vous souhaitez revenir. Une fois que vous avez trouvé le point sur lequel vous souhaitez annuler pour utiliser la séquence de commandes comme expliqué ci-dessus.


1 Notez toutefois que vous n’avez pas besoin de réinitialiser une validation antérieure si vous venez de faire une erreur dans votre message de validation . L’option la plus simple consiste à git reset (pour mettre à jour toutes les modifications apscopes depuis), puis à git commit --amend , ce qui ouvrira votre éditeur de message de validation par défaut pré-rempli avec le dernier message de validation.

Annuler un commit est un peu effrayant si vous ne savez pas comment cela fonctionne. Mais c’est vraiment incroyablement facile si vous comprenez.

Disons que vous avez ceci, où C est votre HEAD et (F) est l’état de vos fichiers.

  (F) ABC ↑ master 

Vous voulez détruire le commettre C et ne plus jamais le revoir . Tu fais cela:

 git reset --hard HEAD~1 

Le résultat est:

  (F) AB ↑ master 

Maintenant, B est la tête. Parce que vous avez utilisé --hard , vos fichiers sont remis à leur état lors de la validation B.

Ah, mais supposons que C ne soit pas un désastre, mais juste un peu. Vous souhaitez annuler la validation, mais conservez vos modifications pour un peu de modification avant de procéder à une meilleure validation. Reprenant d’ici, avec C comme HEAD:

  (F) ABC ↑ master 

Vous pouvez le faire en laissant de côté --hard :

 git reset HEAD~1 

Dans ce cas, le résultat est le suivant:

  (F) ABC ↑ master 

Dans les deux cas, HEAD est juste un pointeur sur le dernier commit. Lorsque vous effectuez une git reset HEAD~1 , vous dites à Git de déplacer le pointeur HEAD en arrière d’un commit. Mais (sauf si vous utilisez --hard ) vous laissez vos fichiers tels quels. Alors maintenant, git status affiche les changements que vous avez enregistrés dans C. Vous n’avez rien perdu!

Pour le toucher le plus léger, vous pouvez même annuler votre commit mais laisser vos fichiers et votre index :

 git reset --soft HEAD~1 

Cela laisse non seulement vos fichiers seuls, mais laisse même votre index seul. Lorsque vous faites le git status , vous verrez que les mêmes fichiers se trouvent dans l’index. En fait, juste après cette commande, vous pouvez faire git commit et vous referiez le même commit que vous venez.

Encore une chose: Supposons que vous détruisiez un commit comme dans le premier exemple, mais que vous découvriez que vous en aviez besoin après tout ? Bonne chance, non?

Non, il y a toujours un moyen de le récupérer. Tapez git reflog et vous verrez une liste de validations (partielles) dans lesquelles vous vous êtes déplacé. Trouvez le commit que vous avez détruit et faites ceci:

 git checkout -b someNewBranchName shaYouDestroyed 

Vous avez maintenant ressuscité cet engagement. Les commits ne sont en fait pas détruits pendant environ 90 jours à Git. Vous pouvez donc revenir en arrière pour sauver celui dont vous ne vouliez pas vous débarrasser.

Cela m’a pris du temps à comprendre, alors peut-être que cela aidera quelqu’un …

Il existe deux manières d’annuler votre dernière validation, selon que vous avez ou non déjà rendu votre commit public (poussé vers votre référentiel distant):

Comment annuler un commit local

Disons que je me suis engagé localement, mais que vous voulez maintenant supprimer cette validation.

 git log commit 101: bad commit # latest commit, this would be called 'HEAD' commit 100: good commit # second to last commit, this is the one we want 

Pour rétablir tout ce qu’il était avant la dernière validation, nous devons reset le commit avant HEAD :

 git reset --soft HEAD^ # use --soft if you want to keep your changes git reset --hard HEAD^ # use --hard if you don't care about keeping the changes you made 

Maintenant, git log montrera que notre dernier commit a été supprimé.

Comment annuler un engagement public

Si vous avez déjà rendu vos commits publics, vous souhaiterez créer un nouveau commit qui “annulera” les modifications que vous avez apscopes dans votre commit précédent (HEAD actuel).

 git revert HEAD 

Vos modifications seront désormais annulées et prêtes à être validées:

 git commit -m 'restoring the file I removed by accident' git log commit 102: restoring the file I removed by accident commit 101: removing a file we don't need commit 100: adding a file that we need 

Pour plus d’informations, consultez Git Basics – Undoing Things

Ajoutez / supprimez des fichiers pour obtenir les résultats souhaités:

 git rm classdir git add sourcedir 

Puis modifiez le commit:

 git commit --amend 

Le commit précédent, erroné, sera édité pour refléter le nouvel état d’index – en d’autres termes, ce sera comme si vous n’aviez jamais commis l’erreur en premier lieu.

Notez que vous ne devriez le faire que si vous n’avez pas encore poussé. Si vous avez appuyé, vous devrez simplement commettre un correctif normalement.

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

ou

 git reset --hard HEAD~1 

Attention: la commande ci-dessus supprimera définitivement les modifications apscopes aux fichiers .java (et à tout autre fichier) que vous souhaitiez valider.

La hard reset à HEAD-1 définira votre copie de travail sur l’état de la validation avant votre erreur de validation.

Pour changer le dernier commit

Remplacez les fichiers dans l’index:

 git rm --cached *.class git add *.java 

Ensuite, si c’est une twig privée, modifiez le commit:

 git commit --amend 

Ou, si c’est une twig partagée, faites un nouveau commit:

 git commit -m 'Replace .class files with .java files' 

( pour modifier un commit précédent , utilisez le rebase interactif génial )


ProTip ™: Ajoutez *.class à un gitignore pour que cela ne se reproduise plus.


Pour annuler un commit

Modifier une validation est la solution idéale si vous devez modifier la dernière validation, mais une solution plus générale est reset .

Vous pouvez réinitialiser git à n’importe quel commit avec:

 git reset @~N 

N est le nombre de validations avant HEAD et @~ réinitialisé avec le commit précédent.

Ainsi, au lieu de modifier le commit, vous pouvez utiliser:

 git reset @~ git add *.java git commit -m "Add .java files" 

Découvrez l’ git help reset , en particulier les sections --soft --mixed et --hard , pour mieux comprendre ce que cela fait.

Reflog

Si vous vous trompez, vous pouvez toujours utiliser le reflog pour trouver les commits supprimés:

 $ git reset @~ $ git reflog c4f708b HEAD@{0}: reset: moving to @~ 2c52489 HEAD@{1}: commit: added some .class files $ git reset 2c52489 ... and you're back where you started 

Utilisez git revert commit-id

Pour obtenir l’ID de validation, utilisez simplement git log

Si vous envisagez d’annuler entièrement une validation locale, quelles que soient les modifications que vous avez apscopes à la validation, et si vous ne vous inquiétez pas à ce sujet, exécutez simplement la commande suivante.

 git reset --hard HEAD^1 

(Cette commande ignorera la totalité de votre commit et vos modifications seront complètement supprimées de votre arbre de travail local). Si vous souhaitez annuler votre commit, mais que vous souhaitez que vos modifications soient effectuées dans la zone de transfert (avant la validation, comme après git add ), exécutez la commande suivante.

 git reset --soft HEAD^1 

Vos fichiers validés arrivent maintenant dans la zone de transit. Supposons que si vous souhaitez décompresser les fichiers, car vous devez modifier un mauvais conent, exécutez la commande suivante

 git reset HEAD 

Les fichiers maintenant validés proviennent de la zone de stockage dans la zone non exploitée. Maintenant, les fichiers sont prêts à être édités, donc peu importe ce que vous changez, vous voulez les éditer et les append et faire un nouveau commit.

Plus

Si vous avez installé Git Extras , vous pouvez exécuter git undo pour annuler la dernière validation. git undo 3 annulera les 3 derniers commits.

Je voulais annuler les 5 derniers commits de notre référentiel partagé. J’ai recherché l’identifiant de révision auquel je voulais revenir. Ensuite, j’ai tapé ce qui suit.

 prompt> git reset --hard 5a7404742c85 HEAD is now at 5a74047 Added one more page to catalogue prompt> git push origin master --force Total 0 (delta 0), reused 0 (delta 0) remote: bb/acl: neoneye is allowed. accepted payload. To git@bitbucket.org:thecompany/prometheus.git + 09a6480...5a74047 master -> master (forced update) prompt> 

Je préfère utiliser git rebase -i pour ce travail, car une belle liste apparaît où je peux choisir les commits à éliminer. Ce n’est peut-être pas aussi direct que d’autres réponses, mais cela semble juste .

Choisissez le nombre de commits que vous voulez lister, puis invoquez-le comme ça (pour vous inscrire les trois derniers)

 git rebase -i HEAD~3 

Liste d’échantillon

 pick aa28ba7 Sanity check for RtmpSrv port pick c26c541 RtmpSrv version option pick 58d6909 Better URL decoding support 

Ensuite, git va supprimer les commits pour toute ligne que vous supprimez.

Comment réparer le commit local précédent

Utilisez git-gui (ou similaire) pour effectuer un git commit --amend . Depuis l’interface graphique, vous pouvez append ou supprimer des fichiers individuels de la validation. Vous pouvez également modifier le message de validation.

Comment annuler le commit local précédent

Il suffit de réinitialiser votre twig à l’emplacement précédent (par exemple, en utilisant gitk ou git rebase ). Réappliquez ensuite vos modifications à partir d’une copie enregistrée. Après la récupération de la mémoire dans votre référentiel local, ce sera comme si la validation indésirable n’avait jamais eu lieu. Pour faire tout cela en une seule commande, utilisez git reset HEAD~1 .

Mot d’avertissement : l’ utilisation imprudente de la git reset de git reset est un bon moyen de mettre votre copie de travail dans un état de confusion. Je recommande aux novices de Git d’éviter cela s’ils le peuvent.

Comment annuler un engagement public

Effectuez une sélection de cerises inversées ( git-revert ) pour annuler les modifications.

Si vous n’avez pas encore apporté d’autres modifications à votre twig, vous pouvez simplement faire …

 git revert --no-edit HEAD 

Ensuite, placez votre twig mise à jour dans le référentiel partagé.

L’historique des validations affichera les deux commits séparément .


Avancé: Correction d’ une twig privée dans un référentiel public

Cela peut être dangereux – assurez-vous d’avoir une copie locale de la twig à republier.

Notez également que vous ne voulez pas faire cela si quelqu’un d’autre travaille sur la twig.

 git push --delete (branch_name) ## remove public version of branch 

Nettoyez votre twig localement puis repoussez …

 git push origin (branch_name) 

Dans le cas normal, vous n’avez probablement pas besoin de vous soucier de l’historique de vos commits de twig privée. Il suffit de pousser un commit de suivi (voir ‘Comment annuler un commit public’ ci-dessus), et plus tard, de faire un squash-merge pour masquer l’historique.

Si vous avez commis de la malbouffe mais pas poussé,

 git reset --soft HEAD~1 

HEAD ~ 1 est un raccourci pour le commit avant la tête. Sinon, vous pouvez vous référer au SHA-1 du hachage si vous souhaitez le réinitialiser. L’ option –soft supprimera le commit mais laissera tous vos fichiers modifiés “Modifications à commettre”, comme le ferait le statut git.

Si vous souhaitez vous débarrasser des modifications apscopes aux fichiers suivis dans l’arborescence de travail depuis la validation avant la tête, utilisez plutôt–hard “.

OU

Si vous avez déjà poussé et que quelqu’un a tiré, ce qui est généralement mon cas, vous ne pouvez pas utiliser git reset . Vous pouvez cependant faire un retour de git ,

 git revert HEAD 

Cela créera une nouvelle validation qui annule tout ce qui a été introduit par la validation accidentelle.

Si vous voulez le défaire définitivement et que vous avez cloné un repository

L’ID de validation peut être vu par

 git log 

Alors tu peux faire –

 git reset --hard  git push origin  -f 

Sur SourceTree (interface graphique pour GitHub), vous pouvez cliquer avec le bouton droit de la souris sur la validation et effectuer une «validation inversée». Cela devrait annuler vos modifications.

Sur le terminal:

Vous pouvez aussi utiliser:

 git revert 

Ou:

 git reset --soft HEAD^ # Use --soft if you want to keep your changes. git reset --hard HEAD^ # Use --hard if you don't care about keeping your changes. 

Une seule commande:

 git reset --soft 'HEAD^' 

Cela fonctionne très bien pour défaire le dernier commit local!

Il suffit de le réinitialiser en faisant la commande ci-dessous en utilisant git :

 git reset --soft HEAD~1 

Expliquez: ce que git reset fait, il est reset à tous les --soft sur --soft vous souhaitez revenir, puis si vous le combinez avec la clé --soft , il sera --soft , mais conservez les modifications dans vos fichiers, vous revenez au stade où le fichier vient d’être ajouté, HEAD est la tête de la twig et si vous combinez avec ~1 (dans ce cas vous utilisez également HEAD^ ), il ne recalculera qu’un seul commit ce que vous voulez. ..

Je crée les étapes dans l’image ci-dessous plus en détail pour vous, y compris toutes les étapes qui peuvent se produire dans des situations réelles et en validant le code:

Comment annuler les derniers commits dans Git?

Comment annuler le dernier commit Git?

Pour restaurer tout ce qu’il était avant la dernière validation, nous devons rétablir la validation avant HEAD.

  1. Si vous ne souhaitez pas conserver vos modifications, procédez comme suit:

     git reset --hard HEAD^ 
  2. Si vous souhaitez conserver vos modifications:

     git reset --soft HEAD^ 

Maintenant, vérifiez votre journal de bord. Cela montrera que notre dernier commit a été supprimé.

Utiliser le reflog pour trouver un état correct

 git reflog 

reflog avant REFLOG AVANT DE RÉINITIALISER

Sélectionnez le bon reflog (f3cb6e2 dans mon cas) et tapez

 git reset --hard f3cb6e2 

Après cela, le repo HEAD sera remis à ce HEADid effet de réinitialisation LOG APRES RESET

Enfin le reflog ressemble à l’image ci-dessous

reflog après après REFLOG FINAL

“Réinitialiser l’arborescence de travail à la dernière validation”

 git reset --hard HEAD^ 

“Nettoyer les fichiers inconnus de l’arbre de travail”

 git clean 

voir – Référence rapide Git

REMARQUE: cette commande supprimera votre validation précédente, donc utilisez-la avec prudence! git reset --hard est plus sûr –

Première exécution:

 git reflog 

Il vous montrera toutes les actions possibles que vous avez effectuées sur votre référentiel, par exemple, commettre, fusionner, extraire, etc.

Alors fais:

 git reset --hard ActionIdFromRefLog 

Autrement:

Examinez la twig que vous souhaitez rétablir, puis réinitialisez votre copie de travail locale sur le commit que vous souhaitez voir être le dernier sur le serveur distant (tout ce qui suit sera envoyé). Pour ce faire, dans SourceTree, j’ai cliqué avec le bouton droit de la souris et sélectionné “Réinitialiser BRANCHNAME à ce commit”.

Ensuite, accédez au répertoire local de votre référentiel et exécutez cette commande:

 git -c diff.mnemonicprefix=false -c core.quotepath=false push -v -f --tags REPOSITORY_NAME BRANCHNAME:BRANCHNAME 

Cela effacera tous les commits après le courant dans votre repository local, mais seulement pour cette twig.

Annuler la dernière validation:

git reset --soft HEAD^ ou git reset --soft HEAD~

Cela annulera le dernier commit.

Ici --soft signifie réinitialisé en mise en scène.

HEAD~ ou HEAD^ signifie se déplacer pour s’engager avant HEAD.


Remplacez le dernier commit par un nouvel commit:

 git commit --amend -m "message" 

Il remplacera le dernier commit avec le nouvel commit.

Tapez git log et trouvez le dernier code de hachage puis entrez:

 git reset  

Dans mon cas, j’ai accidentellement commis des fichiers que je ne voulais pas. Donc j’ai fait ce qui suit et ça a fonctionné:

 git reset --soft HEAD^ git rm --cached [files you do not need] git add [files you need] git commit -c ORIG_HEAD 

Vérifiez les résultats avec gitk ou git log –stat

Utilisez SourceTree (outil graphique pour Git) pour voir vos commits et votre arbre. Vous pouvez le réinitialiser manuellement directement en cliquant dessus avec le bouton droit de la souris.

Il y a deux scénarios principaux

Vous n’avez pas encore poussé le commit

Si le problème était des fichiers supplémentaires que vous avez validés (et que vous ne voulez pas ceux du repository), vous pouvez les supprimer en utilisant git rm puis en validant avec --amend

 git rm  

Vous pouvez également supprimer des répertoires entiers avec -r , ou même combiner avec d’autres commandes Bash

 git rm -r  git rm $(find -name '*.class') 

Après avoir supprimé les fichiers, vous pouvez valider, avec l’option –amend

 git commit --amend -C HEAD # the -C option is to use the same commit message 

Cela réécrira votre commit local récent en supprimant les fichiers supplémentaires, donc ces fichiers ne seront jamais envoyés en mode push et seront également supprimés de votre repository local .git par GC.

Vous avez déjà poussé le commit

Vous pouvez appliquer la même solution que l’autre scénario, puis faire git push avec l’option -f , mais ce n’est pas recommandé car il remplace l’historique distant par un changement divergent (cela peut perturber votre référentiel).

Au lieu de cela, vous devez faire la validation sans --amend (souvenez-vous de -amend`: cette option réécrit l’historique lors de la dernière validation).

Simple, lancez ceci dans votre ligne de commande:

 git reset --soft HEAD~ 

Il y a plusieurs façons de le faire:

Commande Git pour annuler la dernière validation / validation précédente:

Attention: Ne pas utiliser –hard si vous ne savez pas ce que vous faites. –hard est trop dangereux et cela pourrait supprimer vos fichiers.

La commande de base pour annuler la validation dans Git est la suivante:

 $ git reset --hard  

ou

 $ git reset --hard HEAD~ 

ID-COMMIT : ID pour le commit

n: nombre de derniers commits que vous voulez rétablir

Vous pouvez obtenir l’identifiant de validation comme indiqué ci-dessous:

 $ **git log --oneline** d81d3f1 function to subtract two numbers be20eb8 function to add two numbers bedgfgg function to mulitply two numbers 

d81d3f1 et be20eb8 sont des identifiants de validation.

Voyons maintenant quelques cas:

Supposons que vous souhaitiez annuler le dernier commit ‘d81d3f1’. Voici deux options:

 $ git reset --hard d81d3f1 

ou

 $ git reset --hard HEAD~1 

Supposons que vous souhaitiez annuler la validation ‘be20eb8’:

 $ git reset --hard be20eb8 

Pour des informations plus détaillées, vous pouvez vous référer et essayer d’autres commandes pour réinitialiser head à un état spécifié:

 $ git reset --help 

Pour revenir à la révision précédente, supprimer définitivement toutes les modifications non validées:

 git reset --hard HEAD~1