552 votes

Revenir à un commit spécifique basé sur l'identifiant du commit avec Git ?

Avec git log J'obtiens une liste des modifications que j'ai effectuées jusqu'à présent.

commit f5c5cac0033439c17ebf905d4391dc0705dbd5f1
Author: prosseek 
Date:   Fri Sep 3 14:36:59 2010 -0500

    Added and modified the files.

commit c14809fafb08b9e96ff2879999ba8c807d10fb07
Author: prosseek 
Date:   Tue Aug 31 08:59:32 2010 -0500

    Just simple test for core.editor.

... etc ...
  • Comment puis-je revenir à un commit spécifique ? Par exemple, que dois-je faire si je veux revenir à commit c14809fafb08b9e96ff2879999ba8c807d10fb07 ?

  • Existe-t-il un autre/meilleur moyen de revenir à un commit spécifique avec Git ? Par exemple, puis-je mettre une étiquette sur chaque commit pour le récupérer avec cette étiquette ?

1 votes

Même si cette question est en fait plus ancienne que celle dont elle est maintenant marquée comme un doublon, celle-ci a une meilleure réponse. meta.stackexchange.com/questions/147643/

6 votes

C'est un exemple parfait de la façon dont git est f--k'up (de la réponse de bwawok) : "... alors si vous vouliez pousser ceci à quelqu'un d'autre qui a le nouvel historique, ça échouerait". . A quoi cela sert-il si vous ne pouvez pas le recontacter dans le dépôt distant ? ?? Je suis absolument stupéfait de voir à quel point Git a rendu difficile des opérations simples.

3 votes

J'ai littéralement lu pendant une heure comment revenir à un commit précédent et je ne connais toujours pas la réponse. Vous avez tout à fait raison, git rend les choses plus compliquées qu'elles ne devraient l'être.

858voto

bwawok Points 5102

Voulez-vous ramener votre repo à cet état, ou voulez-vous simplement que votre repo local ressemble à cela ?

Si vous reset --hard il fera en sorte que votre code local et votre histoire locale soient identiques à ce qu'ils étaient au moment de l'engagement. Mais si vous vouliez pousser ceci à quelqu'un d'autre qui a le nouvel historique, cela échouerait :

git reset --hard c14809fa

Et si vous reset --soft il déplacera vos HEAD à l'endroit où ils étaient, mais laissera vos fichiers locaux etc. inchangés :

git reset --soft c14809fa

Alors, que voulez-vous faire exactement avec cette réinitialisation ?

Editer -

Vous pouvez ajouter des "tags" à votre repo et ensuite revenir à un tag. Mais un tag est vraiment juste un raccourci vers le sha1.

Vous pouvez le marquer comme TAG1 puis un git reset --soft c14809fa , git reset --soft TAG1 ou git reset --soft c14809fafb08b9e96ff2879999ba8c807d10fb07 feraient tous la même chose.

4 votes

J'avais besoin de revenir à cet état. Mais c'est bon de savoir que je peux avoir l'option de "ressembler à ça". Merci de me le faire savoir. BTW, quelle est l'option par défaut ? hard ou soft ?

2 votes

@prosseek la valeur par défaut est en fait mixte. --mixte Réinitialise l'index mais pas l'arbre de travail (c'est-à-dire que les fichiers modifiés sont préservés mais pas marqués pour la livraison) et signale ce qui n'a pas été mis à jour. C'est l'action par défaut. Voir kernel.org/pub/software/scm/git/docs/git-reset.html

0 votes

@prosseek : Si les différents modes de réinitialisation sont un peu confus pour vous, même après avoir lu la page de manuel (soigneusement !) vous pourriez essayer cette autre question stackoverflow.com/questions/2530060/

240voto

Peter A Points 358

Je pense que la réponse de Bwawok est fausse à un moment donné :

si vous le faites

git reset --soft c14809fa

Vos fichiers locaux seront modifiés pour être comme ils étaient à l'époque, mais votre historique etc. restera le même.

Según manuel : git-reset , "git reset --soft"...

ne touche pas le fichier d'index ni l'arbre de travail du tout (mais réinitialise la tête à <commit>, comme le font tous les modes). Cela laisse tous vos fichiers modifiés "Changes to be committed", comme le dirait git status.

Il va donc "supprimer" les commits les plus récents de la branche. Cela signifie que, après avoir regardé votre ancien code, vous ne pouvez pas aller au commit le plus récent dans cette branche à nouveau, facilement. Il fait donc l'inverse de ce qui est décrit par bwawok : Les fichiers locaux ne sont pas modifiés (ils sont exactement comme avant "git reset --soft"), mais l'historique est modifié (la branche est tronquée après le commit spécifié).

La commande pour la réponse de bwawok pourrait être :

git checkout <commit>

Vous pouvez l'utiliser pour jeter un coup d'œil aux anciennes révisions : A quoi ressemblait mon code hier ?

(Je sais, je devrais mettre cela dans les commentaires de cette réponse, mais stackoverflow ne me permet pas de le faire ! Ma réputation est trop faible).

6 votes

Un type formidable qui n'a pas encore une grande réputation :)

4 votes

Mais git checkout est en lecture seule, donc vous ne pouvez pas livrer une ancienne révision.

2 votes

@Peter A : Après "git reset --soft" suivi de "git checkout", je ne vois pas de changement dans un fichier sur lequel j'ai travaillé. Serait-ce parce que je ne suis pas dans la branche master ?

53voto

Doches Points 800

git reset c14809fafb08b9e96ff2879999ba8c807d10fb07 est ce que vous recherchez...

2 votes

Vous n'aurez pas à taper tout le sha, juste un petit peu suffira.

57 votes

@bwawok : Mais il est plus rapide de sélectionner et de cliquer-coller au milieu que de taper un SHA1, même abrégé !

10 votes

Est-ce qu'un git push origin mybranch puis provoquer la rétrocession du repo d'origine ?

27voto

kenzaraque Points 33

Si vous voulez forcer la question, vous pouvez le faire :

git reset --hard c14809fafb08b9e96ff2879999ba8c807d10fb07

vous renvoie à l'aspect de votre clone git au moment du checkin

2 votes

Dans quels cas auriez-vous besoin de forcer ?

2 votes

Que signifie "au moment du checkin" ? ambigu. si je fais "git reset --hard X" l'état du repo est-il le même qu'avant le commit X ou après le commit X ...

2 votes

Git reset --hard X. Cela va rétablir l'état du dépôt tel qu'il était avant le commit X. Votre code local et l'historique local seront exactement comme ils étaient à ce commit. Mais si vous vouliez pousser ceci vers le master local ou le master distant avec un historique différent, cela échouerait. Ce sera donc une version en lecture seule de votre dépôt.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X