web-dev-qa-db-fra.com

Retour à un ancien commit Git dans un référentiel public

Comment puis-je revenir à un commit spécifique dans git?

La meilleure réponse que quelqu'un puisse me donner était d'utiliser git revert X fois jusqu'à ce que j'atteigne le commit souhaité. 

Donc, disons que je veux revenir à un commit qui a 20 commits, il faudrait que je le répète 20 fois. 

Y a-t-il un moyen plus facile de faire cela? 

Je ne peux pas utiliser la réinitialisation car ce référentiel est public.

685
David

Essaye ça:

git checkout [revision] .

[revision] est le hachage de validation (par exemple: 12345678901234567890123456789012345678ab). 

N'oubliez pas le . à la fin, très important. Ceci appliquera les modifications à l’arbre entier. Vous devez exécuter cette commande à la racine du projet git. Si vous vous trouvez dans un sous-répertoire, cette commande ne modifie que les fichiers du répertoire en cours. Alors engagez-vous et vous devriez être bon.

Vous pouvez annuler cela en

git reset --hard 

cela supprimera toutes les modifications du répertoire de travail et de la zone intermédiaire.

1023
Alex Reisner

Pour revenir à un commit spécifique:

git reset --hard commit_sha

Pour revenir en arrière 10 commits:

git reset --hard HEAD~10

Vous pouvez utiliser "git revert" comme dans le post suivant si vous ne voulez pas réécrire l'historique

Comment rétablir le référentiel Git dans un commit précédent?

175
Naga Kiran

Eh bien, je suppose que la question est la suivante: qu'entendez-vous par «revenir en arrière»? Si vous ne pouvez pas reset parce que c'est public et que vous voulez conserver l'historique de validation, voulez-vous simplement que votre copie de travail reflète un commit spécifique? Utilisez git checkout et le hash de commit.

Edit: Comme indiqué dans les commentaires, utiliser git checkout sans spécifier de branche vous laissera dans un état "sans branche". Utilisez git checkout <commit> -b <branchname> pour accéder à une branche ou git checkout <commit> . pour accéder à la branche actuelle.

82
Ben

L'affiche originale indique:

La meilleure réponse que quelqu'un puisse me donner était d'utiliser git revert X fois jusqu'à ce que je atteindre le commit désiré.

Donc, disons que je veux revenir à un commit qui aurait 20 commits, je l'aurais pour l'exécuter 20 fois.

Y a-t-il un moyen plus facile de faire cela?

Je ne peux pas utiliser la réinitialisation car ce dépôt est public.

Il n'est pas nécessaire d'utiliser git revert X fois. git revert peut accepter une plage commit en tant qu'argument. Vous ne devez donc l'utiliser qu'une seule fois pour rétablir une plage de commits. Par exemple, si vous souhaitez rétablir les 20 derniers commits:

git revert --no-edit HEAD~20..

La plage de validation HEAD~20.. est l'abréviation de HEAD~20..HEAD et signifie "à partir du 20th parent du commit HEAD, puis rétablit tous les commits après "HEAD". 

Cela annulera les 20 derniers commits, en supposant qu'aucun de ceux-ci ne soit fusionné Commit. S'il y a des commits de fusion, vous ne pouvez pas les annuler tous en une seule commande, vous aurez besoin pour les retourner individuellement avec

git revert -m 1 <merge-commit>

Notez également que j'ai testé l'utilisation d'une plage avec git revert avec la version 1.9.0 de Git. Si vous utilisez une version plus ancienne de git, utiliser une plage avec git revert peut ne pas fonctionner.

Dans ce cas, git revert est préférable à git checkout.

Notez que contrairement à cette réponse qui dit d'utiliser git checkout , git revert Supprimera en fait tous les fichiers ajoutés à l'un des commits pour lesquels vous êtes Revenant à, ce qui en fait le bon façon de revenir sur une série de révisions.

Documentation

36
user456814

Étape 1: chercher la liste des commits:

git log

Vous obtiendrez une liste comme dans cet exemple:

[Comp:Folder User$ git log
commit 54b11d42e12dc6e9f070a8b5095a4492216d5320
Author: author <[email protected]>
Date:   Fri Jul 8 23:42:22 2016 +0300

This is last commit message

commit fd6cb176297acca4dbc69d15d6b7f78a2463482f
Author: author <[email protected]>
Date:   Fri Jun 24 20:20:24 2016 +0300

This is previous commit message

commit ab0de062136da650ffc27cfb57febac8efb84b8d
Author: author <[email protected]>
Date:   Thu Jun 23 00:41:55 2016 +0300

This is previous previous commit message
...

Étape 2: Copiez le hachage de validation nécessaire et collez-le à la caisse

git checkout fd6cb176297acca4dbc69d15d6b7f78a2463482f

C'est tout.

23
Igor
git read-tree -um @ $commit_to_revert_to

le fera. C'est "git checkout" mais sans mettre à jour HEAD.

Vous pouvez obtenir le même effet avec 

git checkout $commit_to_revert_to
git reset --soft @{1}

si vous préférez lier des commandes pratiques.

Ceux-ci vous laissent votre arbre de travail et votre index dans l'état souhaité, vous pouvez simplement git commit pour terminer.

9
jthill

Je ne sais pas ce qui a changé, mais je ne parviens pas à extraire un commit spécifique sans l'option --detach. La commande complète qui a fonctionné pour moi était la suivante: git checkout --detach [commit hash]

Pour revenir de l'état détaché, je devais vérifier ma succursale locale: git checkout master

1
ken

Voici un exemple pour le faire

    cd /yourprojects/project-acme 


    git checkout efc11170c78 .
0
mcvkr

Vous pouvez trouver l'ID de validation associé à chaque validation dans la section des validations de GitHub/BitBucket/Gitlab. C'est très simple, supposez que votre identifiant de commit est 5889575 alors si vous voulez revenir à cette partie dans votre code, il vous suffit de taper

git checkout 5889575 .

Cela vous mènera à ce moment dans votre code.

0
Naved Ahmad

Vous voulez HEAD mode détaché?

J'ai du mal à croire que personne n'ait mentionné le mode de la tête détachée.

Si vous souhaitez annuler X time à un certain commit avec un DETACHED HEAD (ce qui signifie que vous ne pouvez pas # €% & rien de plus), utilisez ce qui suit:

(remplacez X par le nombre de commits que vous souhaitez revenir en arrière)

git checkout HEAD~X

C'EST À DIRE. revenir en arrière d'un commit:

git checkout HEAD~1
0
Karl Morrison

Disons que vous travaillez sur un projet et après un jour ou deux. Vous remarquez qu'une fonctionnalité vous donne toujours des erreurs. Mais vous ne savez pas quel changement vous avez provoqué l'erreur. Il faut donc pêcher les précédents commits de travail. Pour revenir à un commit spécifique:

git checkout 8a0fe5191b7dfc6a81833bfb61220d7204e6b0a9 .

Ok, alors ce commit fonctionne pour vous. Plus d'erreur. Vous avez identifié le problème. Maintenant, vous pouvez revenir au dernier commit:

git checkout 792d9294f652d753514dc2033a04d742decb82a5 .

Et vérifiez un fichier spécifique avant qu'il ne provoque l'erreur (dans mon cas, j'utilise l'exemple Gemfile.lock):

git checkout 8a0fe5191b7dfc6a81833bfb61220d7204e6b0a9 -- /projects/myproject/Gemfile.lock

Et c’est un moyen de gérer les erreurs que vous avez créées dans les commits sans vous en rendre compte plus tard.

0
Donato