Comment annuler les commits récents dans git?

J'ai accidentellement envoyé les mauvais fichiers à Git , mais je n'ai pas encore envoyé de commit au serveur.

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

18990
29 мая '09 в 21:09 2009-05-29 21:09 Hamza Yerlikaya a demandé 29 mai '09 à 21:09 2009-05-29 21:09
@ 92 réponses

Annuler et refaire

20501
29 мая '09 в 21:13 2009-05-29 21:13 réponse donnée par Esko Luontola le 29 mai 09 à 21:13 2009-05-29 21:13

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

Disons que vous l'avez, où C est votre tête, et (F) est l'état de vos fichiers.

  (F) ABC ↑ master 

Vous voulez réinitialiser le commit C et ne plus le revoir . Tu fais ça:

 git reset --hard HEAD~1 

Résultat:

  (F) AB ↑ master 

Maintenant B - HEAD. Depuis que vous avez utilisé --hard , vos fichiers reviennent à leur état --hard lorsque vous validez B.

Ah, mais supposons que commit C n’est pas un désastre, mais un peu. Vous souhaitez annuler une validation, mais enregistrez vos modifications pour une petite modification avant de procéder à la meilleure validation. À partir d’ici encore, avec C comme tête:

  (F) ABC ↑ master 

Vous pouvez le faire en laissant --hard :

border=0
 git reset HEAD~1 

Dans ce cas, le résultat est:

  (F) ABC ↑ master 

Dans les deux cas, HEAD est juste un pointeur sur le dernier commit. Lorsque vous effectuez une git reset HEAD~1 par git reset HEAD~1 , vous indiquez à Git de déplacer le pointeur HEAD en arrière d'un commit. Mais (sauf si vous utilisez --hard ), vous laissez vos fichiers tels qu’ils étaient. Maintenant, le git status montre les modifications que vous avez enregistrées en C. Vous n'avez rien perdu!

Pour une touche légère, vous pouvez même annuler le commit, mais laissez vos fichiers et index :

 git reset --soft HEAD~1 

Cela laisse non seulement vos fichiers seuls, mais même votre index. Lorsque vous effectuez le git status , vous verrez que l'index contient les mêmes fichiers qu'auparavant. En fait, juste après cette commande, vous pouvez exécuter git commit et refaire le même commit que vous venez de recevoir.

Une dernière chose: supposez que vous ayez détruit un commit, comme dans le premier exemple, mais que vous ayez ensuite découvert que vous en aviez besoin à la fin ? Pas de chance, non?

Non, il y a toujours un moyen de le récupérer. Tapez git reflog , et vous verrez une liste de SHAS de commit (partiellement) (c'est-à-dire, de hachage) que vous avez déplacés pour trouver le commit que vous avez détruit, et faites-le.:

 git checkout -b someNewBranchName shaYouDestroyed 

Vous avez maintenant ressuscité ce commit. Les comités ne sont pas réellement détruits à Git pendant environ 90 jours, vous pouvez donc généralement en revenir pour en sauver un que vous ne souhaitiez pas éliminer.

10099
29 июля '11 в 1:22 2011-07-29 01:22 La réponse est donnée par Ryan Lundy le 29 juillet 2011 à 01:22. 2011-07-29 01:22

Il m'a fallu du temps pour comprendre, alors peut-être que cela aidera quelqu'un ...

Il existe deux méthodes pour "annuler" votre dernier commit, selon que vous ayez créé un rapport public (cliqué sur le référentiel distant):

Comment annuler un commit local

Disons que je l'ai fabriqué localement, mais maintenant je veux enlever cette fixation.

 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 tout restaurer avant la dernière validation, nous devons effectuer une reset avant la validation 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 correctif public

Si vous avez déjà rendu vos commits accessibles au public, vous devez créer un nouveau commit qui "retourne" les modifications que vous avez apportées au commit précédent (l'en-tête actuel).

 git revert HEAD 

Maintenant, vos modifications seront 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 - Cancel Things.

1889
16 июня '11 в 20:27 2011-06-16 20:27 la réponse est donnée par Andrew le 16 juin 2011 à 20:27. 2011-06-16 20:27

Ajoutez / supprimez des fichiers pour obtenir ce que vous voulez:

 git rm classdir git add sourcedir 

Puis changez le commit:

 git commit --amend 

Le correctif précédent, erroné, sera modifié pour refléter le nouvel état de l'index. En d'autres termes, vous aurez l'impression que vous n'avez jamais commis d'erreur en premier lieu.

Notez que vous ne devriez faire cela que si vous n'avez pas encore cliqué. Si vous avez cliqué, il vous suffit de vous engager à résoudre le problème normalement.

1664
29 мая '09 в 21:16 2009-05-29 21:16 la réponse est donnée bdonlan le 29 mai 2009 à 21:16 2009-05-29 21:16
926
29 мая '09 в 21:13 2009-05-29 21:13 Lennart Koopmann a répondu le 29 mai 09 à 21:13 2009-05-29 21:13

Pour changer le dernier commit

Remplacer les fichiers dans l'index:

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

Ensuite, s'il s'agit d'une branche privée, modifiez le commit:

 git commit --amend 

Ou, s'il s'agit d'une branche partagée, effectuez un nouveau commit:

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


( pour changer le commit précédent , utilisez une incroyable base interactive )


ProTip ™: ajoutez *.class à gitignore pour arrêter cette répétition.


Pour retourner un correctif

La modification d'un commit est la solution idéale si vous devez modifier le dernier commit, mais la reset solution plus générale.

Vous pouvez réinitialiser git à n’importe quel appareil en utilisant:

 git reset @~N 

N est le nombre de validations avant HEAD et @~ renvoie à la validation précédente.

Au lieu d’apporter des modifications à un commit, vous pouvez utiliser:

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

Consultez l' git help reset , en particulier les --soft --mixed et --hard afin de mieux comprendre son fonctionnement.

Reflog

Si vous vous trompez, vous pouvez toujours utiliser reflog pour trouver des commits à distance:

 $ 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 


707
31 июля '10 в 12:39 2010-07-31 12:39 la réponse est donnée à Zaz le 31 juillet '10 à 12:39 2010-07-31 12:39

Utilisez git revert <commit-id>

Pour obtenir un identifiant de correctif, utilisez simplement git log

589
25 мая '12 в 19:04 2012-05-25 19:04 la réponse est donnée par Jaco Pretorius le 25 mai 2012 à 19:04 2012-05-25 19:04

Si vous envisagez d’annuler complètement la validation locale, peu importe ce que vous modifiez, vous avez effectué une validation et, si vous ne vous en inquiétez pas, exécutez simplement la commande suivante.

 git reset --hard HEAD^1 

(Cette commande ignorera tous vos engagements et vos modifications seront complètement perdues de votre arbre de travail local). Si vous souhaitez annuler une validation, mais que vous souhaitez apporter des modifications à la zone de transfert (avant de valider, comme après git add ), exécutez la commande suivante.

 git reset --soft HEAD^1 

Maintenant, vos fichiers fixes sont dans la zone de transfert. Supposons que si vous souhaitez dépasser le nombre de fichiers, car vous devez modifier un contenu incorrect, exécutez la commande suivante.

 git reset HEAD 

Les fichiers transférés maintenant proviennent de la zone en phase vers la zone non livrée. Maintenant que les fichiers sont prêts pour l'édition, par conséquent, peu importe ce que vous modifiez, vous voulez aller à l'édition, l'ajouter et créer un nouveau / nouveau commit.

Plus

472
31 янв. la réponse est donnée à Madhan Ayyasamy le 31 janvier 2013-01-31 10:06 13 à 10h06 2013-01-31 10h06

Si vous avez installé Git Extras , vous pouvez lancer git undo pour annuler le dernier commit. git undo 3 annule les 3 derniers commits.

451
13 дек. la réponse est donnée nickf 13 décembre 2011-12-13 13:18 '11 à 13:18 2011-12-13 13:18

Je voulais annuler les 5 derniers commits de notre référentiel partagé. J'ai regardé l'identifiant de révision sur lequel je voulais revenir. Puis 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> 
419
06 апр. la réponse est donnée à neoneye 06 avr. 2012-04-06 16:58 '12 à 16h58: 2012-04-06 16:58

Je préfère utiliser git rebase -i pour cette tâche, car il existe une bonne liste où je peux sélectionner les commits à supprimer. Ce n'est peut-être pas aussi simple que certaines des autres réponses ici, mais cela semble juste.

Sélectionnez le nombre de commits que vous voulez lister, puis appelez-le (pour prendre les trois derniers)

 git rebase -i HEAD~3 

Liste d'échantillons

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

Git supprimera ensuite le commit pour n'importe quelle ligne à supprimer.

397
25 окт. Réponse donnée par Steven Penny le 25 octobre 2012-10-25 06:41 '12 à 6:41 am 2012-10-25 06:41

Comment corriger le commit local précédent

Utilisez git-gui (ou équivalent) pour exécuter git commit --amend . À partir de l'interface graphique, vous pouvez ajouter ou supprimer des fichiers individuels du commit. Vous pouvez également modifier le message de validation.

Comment annuler un commit local précédent

gitk simplement votre branche à son emplacement précédent (par exemple, en utilisant gitk ou git rebase ). Puis réappliquez les modifications de la copie enregistrée. Après la récupération de place dans votre stockage local sera comme le fait que la validation non désirée n'a jamais eu lieu. Pour faire tout cela en une seule commande, utilisez git reset HEAD~1 .

Un mot d'avertissement : l'utilisation négligente de git reset est un bon moyen de confondre votre copie de travail. Je recommande aux débutants Git d'éviter cela s'ils le peuvent.

Comment annuler un commit public

Inverse sélectionnez cherry ( git-revert ) pour annuler les modifications.

Si vous n'avez pas encore apporté d'autres modifications à votre fil, vous pouvez simplement ...

 git revert --no-edit HEAD 

Envoyez ensuite la branche mise à jour au référentiel commun.

L'historique des validations indiquera les deux validations séparément.


Facultatif: correction d'une branche privée dans un référentiel public

Cela peut être dangereux - assurez-vous d'avoir une copie locale de la branche.

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

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

Nettoyez votre succursale localement, puis poussez ...

 git push origin (branch_name) 

Dans le cas normal, vous n'avez probablement pas besoin de craindre que votre historique de validation dans une branche privée ne soit pas modifié. Appuyez simplement sur un commit ultérieur (voir «Comment annuler un commit public» ci-dessus), puis effectuez une fusion de squash pour masquer l’histoire.

382
23 апр. la réponse est donnée à nobar le 23 avril 2013-04-23 20:27 '13 à 20:27 2013-04-23 20:27

Si vous avez fait une erreur, mais n'avez pas cliqué,

 git reset --soft HEAD~1 

HEAD ~ 1 est l'abréviation de la fixation devant la tête. Vous pouvez également vous référer au hachage SHA-1 si vous souhaitez le réinitialiser. --soft supprimera la validation, mais il laissera tous vos fichiers modifiés "Les modifications seront apportées", comme dirait le statut de git.

Si vous souhaitez vous débarrasser de tout changement dans les fichiers contrôlés dans l’arbre de travail, définissez la fixation avant que la voix utilise " --hard ".

Ou

Si vous avez déjà cliqué et qu'une personne a été retirée, ce qui est généralement mon affaire, vous ne pouvez pas utiliser la réinitialisation automatique. Cependant, vous pouvez faire git revert,

 git revert HEAD 

Cela créera un nouveau correctif, qui annule tout ce qui est entré par un correctif aléatoire.

307
03 сент. la réponse est donnée santos_mgr 03 sep . 2014-09-03 10:15 14 à 10h15 2014-09-03 10:15

Si vous souhaitez l'annuler définitivement et que vous avez cloné un référentiel

L'identifiant du correctif peut être vu.

 git log 

Ensuite, vous pouvez faire -

 git reset --hard <commit_id> git push origin <branch_name> -f 
303
17 мая '13 в 16:02 2013-05-17 16:02 La réponse est donnée par poorva le 17 mai 2013 à 4:02. 2013-05-17 16:02

Dans SourceTree (interface graphique pour GitHub), vous pouvez cliquer avec le bouton droit sur la validation et exécuter la réparation inverse. Cela devrait annuler vos modifications.

Au terminal:

Vous pouvez également utiliser:

 git revert 

Ou:

256
28 июня '13 в 13:18 2013-06-28 13:18 la réponse est donnée par Varun Parakh le 28 juin 13 à 13:18 2013-06-28 13:18

Equipe unique:

241
05 марта '14 в 16:55 2014-03-05 16:55 la réponse est donnée par Manish Shrivastava le 05 mars 14 à 16:55 2014-03-05 16:55

Il suffit de le réinitialiser en lançant la commande ci-dessous avec git :

 git reset --soft HEAD~1 

Expliquez que ce que git reset fait est de reset tous les --soft sur --soft vous voulez retourner, puis si vous le fusionnez avec --soft , il retournera, mais en enregistrera les modifications dans vos fichiers, vous retournerez donc à la scène où un fichier a été ajouté, HEAD est le chef de la branche, et si vous combinez avec ~1 (dans ce cas, vous utilisez également HEAD^ ), il retournera à une seule commande de votre choix ...

Je crée les étapes de l'image ci-dessous plus en détail pour vous, y compris toutes les étapes pouvant se produire dans des situations réelles et l'exécution du code:

2019

Comment annuler le dernier git?

Pour tout restaurer avant la dernière validation, nous devons réinitialiser le correctif sur HEAD.

  1. Si vous ne souhaitez pas enregistrer vos modifications, vous devez:

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

     git reset --soft HEAD^ 

Maintenant, vérifiez votre journal git. Cela montrera que notre dernier correctif a été supprimé.

214
23 апр. la réponse est donnée à Ranjithkumar Ravi le 23 avril 2014-04-23 14:21 '14 à 14:21 2014-04-23 14:21

Utilisez reflog pour trouver le bon état.

 git reflog 

2019

172
07 янв. réponse donnée par Shubham Chaudhary le 07 janvier 2014-01-07 01:34 14 à 01:34 2014-01-07 01:34

"Réinitialiser l'arbre de travail avant le dernier commit"

 git reset --hard HEAD^ 

"Effacer les fichiers inconnus de l'arbre de travail"

 git clean 

voir - Référence rapide Git

NOTE Cette commande supprimera le commit précédent, donc utilisez-le avec prudence! git reset --hard plus sûr -

167
03 окт. réponse donnée Ravi_Parmar Oct 03. 2013-10-03 15:43 '13 à 15:43 2013-10-03 15:43

Première course:

 git reflog 

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

Alors fais:

 git reset --hard ActionIdFromRefLog 
150
11 окт. la réponse est donnée par U. Ali le 11 octobre. 2013-10-11 17:41 13 à 17:41 2013-10-11 17:41

Annuler le dernier commit:

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

Cela annulera le dernier commit.

Ici - --soft signifie réinitialiser les paramètres.

HEAD~ ou HEAD^ signifie aller à un commit avant la HEAD.


Remplacez le dernier commit par un nouveau:

 git commit --amend -m "message" 

Il remplacera le dernier commit par un nouveau fixateur.

141
06 марта '16 в 14:53 2016-03-06 14:53 la réponse est donnée akshay_rahar 06 mars '16 à 14:53 2016-03-06 14:53

Une autre façon:

Faites une demande pour la branche que vous voulez renvoyer, puis renvoyez la copie de travail locale au commit que vous voulez être le dernier sur le serveur distant (le tout après son départ). Pour ce faire, j'ai cliqué avec le bouton droit de la souris sur SourceTree et choisi "Réinitialiser BRANCHNAME à ce commit".

Ensuite, accédez au répertoire du référentiel local et exécutez la commande suivante:

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

Ceci supprimera tous les commits après le dernier dans le référentiel local, mais seulement pour une branche.

136
13 мая '13 в 20:12 2013-05-13 20:12 la réponse est donnée CommaToast le 13 mai 2013 à 20h12 2013-05-13 20:12

Entrez le git log et recherchez le dernier code de hachage et entrez:

 git reset <the previous co> 
127
15 мая '13 в 16:12 2013-05-15 16:12 la réponse est donnée par user853293 Le 15 mai '13 à 16:12 2013-05-15 16:12

Dans mon cas, j'ai accidentellement créé des fichiers que je ne voulais pas. Alors j'ai fait ce qui suit et cela 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érifier les résultats avec gitk ou git log --stat

124
18 июля '13 в 9:41 2013-07-18 09:41 la réponse est donnée par egridasov le 18 juillet '13 à 9:41 2013-07-18 09:41

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

113
29 авг. La réponse est donnée iOS Coder 29 aug. 2013-08-29 19:18 '13 à 19:18 2013-08-29 19:18

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

 git reset --hard HEAD~1 
111
28 авг. la réponse est donnée par theestar 28 août. 2014-08-28 19:03 14 à 19:03 2014-08-28 19:03

Il y a deux scénarios principaux.

Vous n'avez pas appuyé sur le commit

Si le problème concerne des fichiers supplémentaires que vous avez validés (et que vous ne souhaitez pas les utiliser dans le référentiel), vous pouvez les supprimer avec git rm puis --amend avec --amend

 git rm <pathToFile> 

Vous pouvez également supprimer des répertoires entiers avec -r ou même fusionner avec d'autres commandes bash .

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

Après avoir supprimé des fichiers, vous pouvez valider en utilisant l' option --amend

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

Cela vous permettra de réécrire une validation locale récente en supprimant les fichiers inutiles. Ainsi, ces fichiers ne seront jamais envoyés en mode push, et seront également supprimés de votre référentiel .git local via GC.

Vous avez déjà cliqué sur un commit

Vous pouvez appliquer la même solution à un script différent, puis exécuter git push avec l'option -f sur -f , mais cela n'est pas recommandé, car cela écraserait l'historique supprimé par une modification divergente (cela pourrait endommager votre référentiel).

Au lieu de cela, vous devez valider sans le --amend (rappelez-vous ce -amend ": cette option écrase l’historique du dernier commit).

111
12 сент. la réponse est donnée dseminara 12 sep . 2014-09-12 17:51 14 à 17:51 2014-09-12 17:51

Pour la fixation locale

 git reset --soft HEAD~1 

ou si vous ne savez pas exactement quelle fixation est possible, vous pouvez utiliser

 git rm --cached <file> 

Pour pressé

La bonne façon de supprimer des fichiers de l'historique du référentiel consiste à utiliser git filter-branch . C'est-à-dire

la section Manuel de git-filter-branch (1) . 

111
04 марта '14 в 7:35 2014-03-04 07:35 La réponse est donnée par geoom le 04 mars 14 à 07:35 2014-03-04 07:35

Il y a plusieurs façons de le faire:

Commande Git pour annuler les derniers commits / précédents:

Attention: N'utilisez pas --hard si vous ne savez pas ce que vous faites. --hard слишком опасен , и он может удалить ваши файлы.

Основная команда для отмены фиксации в Git:

 $ git reset --hard <COMMIT -ID> 

ou

 $ git reset --hard HEAD~<n> 

COMMIT-ID : идентификатор для фиксации

n: число последних коммитов, которые вы хотите вернуть