Comment renvoyer le référentiel Git au commit précédent

Comment puis-je revenir d'un état actuel à un instantané pris avec un correctif spécifique?

Si je fais un git log , j'obtiens le résultat suivant:

 $ git log commit a867b4af366350be2e7c21b8de9cc6504678a61b' Author: Me <me@me.com> Date: Thu Nov 4 18:59:41 2010 -0400 blah blah blah... commit 25eee4caef46ae64aa08e8ab3f988bc917ee1ce4 Author: Me <me@me.com> Date: Thu Nov 4 05:13:39 2010 -0400 more blah blah blah... commit 0766c053c0ea2035e90f504928f8df3c9363b8bd Author: Me <me@me.com> Date: Thu Nov 4 00:55:06 2010 -0400 And yet more blah blah... commit 0d1d7fc32e5a947fbd92ee598033d85bfc445a50 Author: Me <me@me.com> Date: Wed Nov 3 23:56:08 2010 -0400 Yep, more blah blah. 

Comment revenir à la fixation à partir du 3 novembre, c'est-à-dire réparer 0d1d7fc ?

6500
06 нояб. fixé par Crazy Serb 06 novembre 2010-11-06 19:58 '10 à 19:58 2010-11-06 19:58
ответ 41 réponses
  • 1
  • 2

Cela dépend beaucoup de ce que vous entendez par "revenir".

Passez temporairement à un autre correctif.

Si vous souhaitez y retourner temporairement, vous tromper, puis revenir à votre position actuelle, il vous suffit de vérifier la fixation souhaitée:

 # This will destroy any local modifications. # Don't do it if you have uncommitted work you want to keep. git reset --hard 0d1d7fc32 # Alternatively, if there work to keep: git stash git reset --hard 0d1d7fc32 git stash pop # This saves the modifications, then reapplies that patch after resetting. # You could get merge conflicts, if you've modified things which were # changed since the commit you reset to. 

Si vous vous êtes trompé, vous avez déjà abandonné vos modifications locales, mais vous pouvez au moins revenir à votre état antérieur en réinitialisant les paramètres.

Annuler les commits publiés avec de nouveaux commits

En revanche, si vous publiez ce travail, vous ne voudrez probablement pas réinitialiser la branche, car cela réécrira le récit. Dans ce cas, vous pouvez vraiment retourner le commit. Avec Git, revert a une signification bien précise: créez un commit en utilisant un patch inverse pour l'annuler. Donc, vous ne réécrivez aucune histoire.

git-revert page de manuel git-revert couvre vraiment beaucoup de choses dans la description.  Un autre lien utile est la section git-scm.com, qui traite de git-revert . 

Si vous décidez que vous ne souhaitez pas revenir à la fin, vous pouvez renvoyer l’inverse (comme décrit ici) ou avant de revenir (voir la section précédente).

Vous pouvez également trouver cette réponse utile dans ce cas:
Comment déplacer la tête à la place précédente? (Tête séparée)

8356
06 нояб. La réponse est donnée par Cascabel le 06 nov. 2010-11-06 20:04 '10 à 20:04 2010-11-06 20:04

Renvoyer une copie de travail au dernier commit

Pour revenir au commit précédent, en ignorant les modifications:

 git reset --hard HEAD 

où HEAD est le dernier correctif de votre discussion actuelle.

border=0

Renvoyer une copie de travail à un ancien commit

Pour revenir à commit, qui est plus grand que le dernier commit:

1396
21 авг. boulder_ruby réponse le 21 août 2012-08-21 09:19 '12 à 9:19 2012-08-21 09:19

Il y a beaucoup de réponses difficiles et dangereuses, mais en fait c'est facile:

 git revert --no-commit 0766c053..HEAD git commit 

Cela renverra tout, de HEAD à une validation par hachage, ce qui signifie qu'il recrée cet état de validation dans l'arbre de travail, comme si chaque validation avait depuis été renvoyée. Ensuite, vous pouvez corriger l’arborescence actuelle et créer un correctif totalement nouveau, sensiblement équivalent au correctif que vous avez «renvoyé».

(L'indicateur --no-commit permet à git de renvoyer tous les commits en même temps - sinon, il vous sera demandé d'envoyer un message pour chaque commit de la plage, en jonçant votre historique avec de nouveaux commits inutiles.)

C'est un moyen sûr et facile de revenir à un état antérieur . Aucune histoire n'est détruite, elle peut donc être utilisée pour des commits déjà publiés.

1361
12 февр. la réponse est donnée par Yarin le 12 février. 2014-02-12 07:18 '14 à 07:18 2014-02-12 07:18

La meilleure option pour moi et peut-être pour d'autres est l'option de réinitialisation Git:

 git reset --hard <commidId>  git clean -f 

C'était la meilleure option pour moi! C'est simple, rapide et efficace!


Remarque: comme indiqué dans les commentaires, ne le faites pas si vous partagez votre branche avec d'autres personnes possédant des copies d'anciens commits.

Également à partir des commentaires, si vous souhaitez utiliser la méthode moins "ballzy", vous pouvez utiliser

git clean -i

173
22 окт. La réponse est donnée par Pogrindis le 22 octobre. 2013-10-22 14:53 13 à 14:53 2013-10-22 14:53

Avant de répondre, ajoutez un peu de contexte en expliquant ce qu'est HEAD .

First of all what is HEAD?

HEAD est simplement une référence à la dernière (dernière) validation dans le thread actuel. A tout moment, il ne peut y avoir qu'un seul HEAD (sauf git worktree ).

Le contenu de HEAD stocké dans .git/HEAD et contient 40 octets de SHA-1 du commit en cours.


detached HEAD

Si vous n'utilisez pas le dernier commit, cela signifie que HEAD pointe sur le commit précédent de l'historique, il s'appelle detached HEAD .

2019

06 февр. La réponse est donnée à CodeWizard 06 février 2015-02-06 00:56 '15 à 0:56 2015-02-06 00:56

Si vous souhaitez overclocker, effacer le dernier message de validation et mettre les fichiers modifiés dans la file d'attente, utilisez la commande suivante:

 git reset --soft HEAD~1 
  • --soft indique que les fichiers non verrouillés doivent être enregistrés en tant que fichiers de travail, contrairement à --hard , qui les --hard .
  • HEAD~1 - dernier correctif. Si vous souhaitez restaurer 3 correctifs, vous pouvez utiliser HEAD~3 . Si vous voulez revenir à un numéro de révision spécifique, vous pouvez également le faire en utilisant votre hash SHA.

C'est une commande extrêmement utile dans les situations où vous avez mal agi et que vous souhaitez annuler ce dernier commit.

Source: http://nakkaya.com/2009/09/24/git-delete-last-commit/

116
04 марта '14 в 20:25 2014-03-04 20:25 La réponse est donnée par Stephen Ostermiller le 04 mars 14 à 20:25 2014-03-04 20:25

J'ai essayé de nombreuses manières d'annuler les modifications locales dans Git, et il semble que cela fonctionne mieux si vous voulez simplement revenir au dernier état de validation.

 git add .  git checkout master -f 

Brève description:

  • Cela ne créera pas de commits, comme le fait git revert .
  • Il ne détachera pas votre tête comme git checkout <commithashcode> .
  • Il remplacera toutes vos modifications locales et supprimera tous les fichiers ajoutés depuis la dernière validation dans le fil.
  • Cela fonctionne uniquement avec les noms des branches, vous pouvez donc uniquement revenir au dernier commit de la branche de cette façon.

J'ai trouvé un moyen beaucoup plus pratique et facile d'obtenir les résultats ci-dessus:

 git add .  git reset --hard HEAD 

où HEAD indique le dernier commit de votre thread actuel.

C'est le même code que boulder_ruby, mais j'ai ajouté git add . avant que git reset --hard HEAD efface tous les nouveaux fichiers créés depuis le dernier commit, car c’est ce à quoi la plupart des gens s’attendent quand je reviens au dernier commit.

104
29 июля '12 в 14:01 2012-07-29 14:01 la réponse est donnée à Roman Minenok le 29 juillet 2012 à 14:01 . 2012-07-29 14:01

Vous pouvez le faire avec les deux commandes suivantes:

 git reset --hard [previous Commit SHA id here] git push origin [branch Name] -f 

Cela supprimera le commit précédent de Git.

Si vous souhaitez enregistrer vos modifications, vous pouvez également utiliser:

 git reset --soft [previous Commit SHA id here] 

Ensuite, vos modifications seront sauvegardées.

90
12 дек. La réponse est donnée kiran boghra le 12 décembre 2014-12-12 09:52 14 à 09:52 2014-12-12 09:52

Supposons que vous avez les commits suivants dans un fichier texte nommé ~/commits-to-revert.txt (j'ai utilisé git log --pretty=oneline pour les obtenir)

 fe60adeba6436ed8f4cc5f5c0b20df7ac9d93219 0c27ecfdab3cbb08a448659aa61764ad80533a1b f85007f35a23a7f29fa14b3b47c8b2ef3803d542 e9ec660ba9c06317888f901e3a5ad833d4963283 6a80768d44ccc2107ce410c4e28c7147b382cd8f 9cf6c21f5adfac3732c76c1194bbe6a330fb83e3 fff2336bf8690fbfb2b4890a96549dc58bf548a5 1f7082f3f52880cb49bc37c40531fc478823b4f5 e9b317d36a9d1db88bd34831a32de327244df36a f6ea0e7208cf22fba17952fb162a01afb26de806 137a681351037a2204f088a8d8f0db6e1f9179ca 

Créez un script shell bash pour renvoyer chacun d'eux:

55
14 окт. la réponse est donnée par Lance Caraccioli 14 oct. 2011-10-14 00:51 '11 à 0:51 2011-10-14 00:51

Alternatives supplémentaires aux solutions Jefromi

Les solutions Jefromi sont définitivement les meilleures et vous devez absolument les utiliser. Cependant, par souci d'exhaustivité, je souhaitais également montrer ces autres solutions alternatives, qui peuvent également être utilisées pour renvoyer un commit (en ce sens que vous créez un nouveau commit qui annule les modifications apportées au commit précédent, comme le fait git revert ).

Pour être clair, ces alternatives ne sont pas le meilleur moyen de revenir à la solution commit , les solutions Jefromi , mais je tiens simplement à indiquer que vous pouvez également utiliser ces autres méthodes pour atteindre le même niveau que git revert .

Alternative 1: réinitialisation matérielle et logicielle

S'agit-il d'une version très légèrement modifiée de la solution de Charles Bailey pour que le retour à SHA-hash soit renvoyé à Git? :

53
29 июня '14 в 20:51 2014-06-29 20:51 la réponse est donnée par user456814 le 29 juin '14 à 20:51 2014-06-29 20:51

Rien n'a fonctionné pour moi ici sauf cette combinaison exacte:

 git reset --hard <commit_hash> git push origin <branch_name> --force 

La clé ici est la poussée forcée, aucun message supplémentaire concernant la correction / correction, etc.

53
13 февр. la réponse est donnée à serdarsenay le 13 fév . 2018-02-13 01:40 '18 à 1:40 2018-02-13 01:40

Voici un moyen beaucoup plus simple de revenir au commit précédent (et de l’avoir dans un état non géré, faites-le comme vous le souhaitez):

 git reset HEAD~1 

Donc, il n'est pas nécessaire de corriger les identifiants, etc. :)

50
29 февр. la réponse est donnée par Paul Walczewski le 29 février 2016-02-29 11:40 '16 à 11:40 2016-02-29 11:40

Ok, revenir au commit précédent dans git est assez simple ...

Revenir sans enregistrer les modifications:

 git reset --hard <commit> 

Retournez et sauvegardez les modifications:

 git reset --soft <commit> 

Expliquez qu'en utilisant git reset, vous pouvez restaurer un certain état, généralement avec un hash de commits, comme vous l'avez vu ci-dessus.

Mais, comme vous pouvez le constater, la différence réside dans l’utilisation des deux --soft et --hard , la valeur par défaut est git reset utilisant l’indicateur --soft , mais il est toujours recommandé d’utiliser cet indicateur, j’explique chaque indicateur:


--soft

Comme indiqué, l'indicateur par défaut, ne nécessitant pas d'être fourni, ne modifie pas l'arborescence de travail, mais ajoute tous les fichiers de modification prêts à être validés. Vous revenez ainsi à l'état de validation, dans lequel les modifications apportées au fichier restent inchangées.


- dur

Soyez prudent avec cet indicateur, il réinitialise l'arborescence de travail et toutes les modifications apportées aux fichiers surveillés disparaissent!


J'ai également créé une image ci-dessous qui peut se produire dans la vie réelle lorsque je travaille avec git:

2019

En supposant que vous parlez de l'hôte et de la branche appropriée (cela suggère que cela peut être n'importe quelle branche de travail qui vous inquiète):

 # Revert local master branch to November 3rd commit ID git reset --hard 0d1d7fc32e5a947fbd92ee598033d85bfc445a50 # Revert remote master branch to November 3rd commit ID git push -f origin 0d1d7fc32e5a947fbd92ee598033d85bfc445a50:master 

J'ai trouvé la réponse de l'article de blog Supprimer un référentiel Git distant pour un commit spécifique .

45
10 мая '16 в 20:21 2016-05-10 20:21 réponse donnée à markreyes 10 mai '16 à 20:21 2016-05-10 20:21

Après toutes les modifications, lorsque vous appuyez sur toutes ces commandes, vous devrez peut-être utiliser:

 git push -f ... 

Et pas seulement git push .

34
05 сент. la réponse est donnée par sivi 05 sep . 2013-09-05 17:03 '13 à 17:03 2013-09-05 17:03

Il existe une commande (qui ne fait pas partie du noyau Git, mais qui se trouve dans le paquetage git-extras ) spécifiquement pour renvoyer et exécuter des anciens commits:

 git back 

Sur la page de manuel, il peut également être utilisé comme tel:

 # Remove the latest three commits git back 3 
32
08 авг. la réponse est donnée par Shadow Man 08 août. 2013-08-08 21:30 '13 à 21h30 2013-08-08 21:30

Revenez à la dernière validation et ignorez toutes les modifications locales:

 git reset --hard HEAD 
27
26 июля '16 в 16:13 2016-07-26 16:13 La réponse est donnée par Mohammed Irfan Tirupattur le 26 juillet '16 à 16:13 2016-07-26 16:13

Sélectionnez la retenue requise et cochez-la.

 git show HEAD git show HEAD~1 git show HEAD~2 

jusqu'à ce que vous obteniez la fixation que vous voulez. Pour forcer HEAD à indiquer cela, faites

 git reset --hard HEAD~1 

ou git reset --hard HEAD~2 ou quelque chose d'autre.

26
26 февр. la réponse est donnée à tonythomas01 le 26 février 2014-02-26 15:52 14 à 15:52 2014-02-26 15:52

Vous pouvez compléter vous-même ces étapes initiales et revenir à git-repo.

  1. Extrayez la dernière version de votre référentiel de Bitbucket à l'aide de la commande git pull --all .

  2. Exécutez la commande git log avec -n 4 à partir de votre terminal. Le nombre après -n détermine le nombre de validations dans le journal, en commençant par la dernière validation de votre historique local.

    $ git log -n 4

  3. Réinitialisez git reset --hard HEAD~N historique de votre référentiel à l'aide de git reset --hard HEAD~N où N est le nombre de validations que vous souhaitez annuler. Dans l'exemple suivant, l'en-tête sera défini sur une validation, la dernière dans l'historique du référentiel:

  4. Cliquez sur un changement de repo git avec git push --force pour forcer un changement.

Si vous voulez que le dépôt git ait un commit précédent

 git pull --all git reset --hard HEAD~1 git push --force 
24
06 апр. Réponse donnée par Nanhe Kumar le 06 avril 2017-04-06 15:20 '17 à 15:20 2017-04-06 15:20

Ceci est une autre méthode de réinitialisation directe pour la validation récente.

 git stash git stash clear 

Il efface directement toutes les modifications que vous avez apportées depuis le dernier commit.

PS: Il a un petit problème. il supprime également toutes les modifications de cache récemment enregistrées. Je pense que dans la plupart des cas, cela n'a pas d'importance.

20
05 мая '16 в 14:43 2016-05-05 14:43 la réponse est donnée par Point Networks le 05 mai '16 à 14:43 2016-05-05 14:43

Pour nettoyer complètement le répertoire du codeur de certaines modifications aléatoires, nous avons utilisé:

 git add -A . git reset --hard HEAD 

Il suffit de git reset --hard HEAD supprimera les modifications, mais pas les "nouveaux" fichiers. Dans leur cas, ils ont accidentellement fait glisser un dossier important quelque part au hasard, et tous ces fichiers ont été traités comme nouveaux avec Git, aussi reset --hard ne l’a pas reset --hard . Lancer git add -A . à l'avance, il les a explicitement suivis avec Git, qui a été détruit avec reset.

20
11 окт. Réponse donnée par Chris Moschini le 11 octobre 2015-10-11 03:10 '15 à 3:10 2015-10-11 03:10

Pour sauvegarder les modifications d'une validation précédente dans HEAD et accéder à la validation précédente, exécutez:

 git reset <SHA> 

Si aucune modification de la validation précédente dans HEAD n'est requise et si vous ignorez simplement toutes les modifications, procédez comme suit:

 git reset --hard <SHA> 
20
28 июля '15 в 11:35 2015-07-28 11:35 la réponse est donnée par Vishnu Atrai le 28 juillet '15 à 11h35 2015-07-28 11:35

Je crois que certaines personnes peuvent en venir à cette question, voulant savoir comment la restauration a apporté les modifications apportées à leur propriétaire - c'est-à-dire tout jeter et revenir à l'origine / propriétaire, et dans ce cas, procédez comme suit:

 git reset --hard origin/master 

https://superuser.com/questions/273172/how-to-reset-master-to-origin-master

19
05 февр. la réponse est donnée le 05 fév . 2015-02-05 04:28 '15 à 04:28 2015-02-05 04:28

Revert est une commande pour commettre des commits.

 git revert <commit1> <commit2> 

Exemple:

git revert 2h3h23233

Il est capable de recevoir une plage de la tête comme indiqué ci-dessous. Ici 1 dit: "Retourne le dernier correctif."

git revert HEAD~1..HEAD

et puis git push

16
20 авг. réponse donnée par Sireesh Yarlagadda 20 août. 2015-08-20 17:45 '15 à 17h45 2015-08-20 17:45

Annuler le dernier engagement:

 git reset --hard HEAD 

HEAD est simplement une référence à la dernière (dernière) validation dans le thread actuel. Il ne peut y avoir qu’un seul HEAD à la fois.

Retournez à la commande précédente: le moyen le plus rapide de restaurer l'ancienne version consiste à utiliser la commande de reset :

 # Resets index to former commit git reset 56e05fced # Moves pointer back to previous HEAD git reset --soft HEAD@{1} # Updates working copy to reflect the new commit git reset --hard 

Ceci ramène votre branche HEAD à la version spécifiée. Tous les commits apparus après cette version sont en réalité annulés. votre projet est exactement le même qu'à ce moment-là.

La commande reset a plusieurs options, l’une des plus intéressantes est l’indicateur --soft . Si vous l'utilisez au lieu de --hard , Git enregistrera toutes les modifications apportées à ces modifications "annulées" en tant que modifications locales.

Restauration d'une version dans une nouvelle branche locale

Comme indiqué précédemment, l'utilisation de la commande de réinitialisation sur votre branche HEAD est une action assez radicale: elle supprimera les validations (dans cette branche) apparues après la révision spécifiée. Si vous êtes sûr que c'est ce que vous voulez, tout est en ordre.

Cependant, il existe également un moyen plus sûr si vous choisissez de laisser votre branche HEAD actuelle intacte. Comme les «branches» sont si simples et peu coûteuses dans Git, nous pouvons facilement créer une nouvelle branche qui commence par cette ancienne version:

 git checkout -b old-project-state 0ad5a7a6