Question Rollback à un ancien commit Git dans un dépôt public


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

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

Alors disons que je veux revenir à un commit qui a 20 ans, je devrais 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 référentiel est public.


601
2018-01-05 17:01


origine


Réponses:


Essaye ça:

git checkout [revision] .

[revision] est le hash de commit (par exemple: 12345678901234567890123456789012345678ab).

Ne pas oublier le . à la fin, très important. Cela va appliquer des changements à l'arbre entier. Alors commettez 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 de transit.


891
2018-01-05 17:07



Pour revenir à un commit spécifique:

git reset --hard commit_sha

Pour restaurer 10 validations:

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 restaurer le dépôt Git dans un commit précédent?


153
2018-02-14 11:01



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

Edit: Comme cela a été souligné dans les commentaires, en utilisant git checkout sans spécifier une branche vous laissera dans un état "no branch". Utilisation git checkout <commit> -b <branchname> à la caisse dans une succursale, ou git checkout <commit> . à la caisse dans la branche actuelle.


73
2018-01-05 17:04



L'affiche originale indique:

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

Alors disons que je veux revenir à un commit qui est de 20 commits vieux, 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 repo est public.

Il n'est pas nécessaire d'utiliser git revert X fois. git revert peut accepter un plage de validation en tant qu'argument, vous n'avez donc besoin de l'utiliser qu'une seule fois pour rétablir une plage des commits. Par exemple, si vous souhaitez annuler les 20 derniers validations:

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

La plage de validation HEAD~20.. est court pour HEAD~20..HEAD, et signifie "commencer à partir du 20th parent de la commande HEAD, et rétablit toutes les validations jusqu'à HEAD ".

Cela reviendra à ces 20 derniers commits, en supposant qu'aucun d'entre eux sont fusionner commet S'il y a des commits de fusion, alors vous ne pouvez pas les retourner tous dans une commande, vous devrez les inverser individuellement avec

git revert -m 1 <merge-commit>

Notez également que j'ai testé en utilisant une gamme avec git revert en utilisant git version 1.9.0. Si vous utilisez une ancienne version de git, utilisez une plage avec git revert peut ou peut ne pas fonctionner.

git revert Est mieux que git checkout

Notez que contrairement à cette réponse qui dit d'utiliser git checkout, git revert va effectivement supprimer tous les fichiers qui ont été ajoutés dans l'un des commits que vous êtes revenant, ce qui en fait la bonne façon de rétablir une gamme de révisions.

Documentation


34
2018-04-21 20:12



Étape 1: Récupérer la liste des commits:

git log

Vous obtiendrez une liste comme dans cet exemple:

[Comp:Folder User$ git log
commit 54b11d42e12dc6e9f070a8b5095a4492216d5320
Author: author <author@gmail.com>
Date:   Fri Jul 8 23:42:22 2016 +0300

This is last commit message

commit fd6cb176297acca4dbc69d15d6b7f78a2463482f
Author: author <author@gmail.com>
Date:   Fri Jun 24 20:20:24 2016 +0300

This is previous commit message

commit ab0de062136da650ffc27cfb57febac8efb84b8d
Author: author <author@gmail.com>
Date:   Thu Jun 23 00:41:55 2016 +0300

This is previous previous commit message
...

Étape 2: Copiez le hash de validation nécessaire et collez-le pour la vérification:

git checkout fd6cb176297acca4dbc69d15d6b7f78a2463482f

C'est tout.


20
2017-07-12 15:27



git read-tree -um @ $commit_to_revert_to

le fera. C'est "git checkout" mais sans mise à 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 enfiler ensemble des commandes de commodité.

Ceux-ci vous laissent avec votre worktree et index dans l'état désiré, vous pouvez juste git commit pour finir.


8
2018-02-06 20:14



Je ne suis pas sûr de ce qui a changé, mais je suis incapable de vérifier un commit spécifique sans l'option --detach. La commande complète qui a fonctionné pour moi était: git checkout --detach [commit hash]

Pour revenir de l'état détaché, j'ai dû vérifier ma succursale locale: git checkout master


1
2018-02-22 11:45