Retour en arrière vers un vieux git commit dans un repo public

Comment puis-je aller sur la restauration d'un spécifique s'engager dans git?

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

disons que je veux revenir à un commit 20 s'engage vieux, j'aurais à exécuter à 20 fois.

y a-t-il un moyen plus simple de le faire?

Je ne peux pas utiliser reset parce que ce dépôt est public.

624
demandé sur David 2010-01-05 20:01:14

8 réponses

essayez ceci:

git checkout [revision] .

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

N'oubliez pas le . à la fin, très important. Cela permettra d'appliquer les modifications à l'ensemble de l'arbre. Vous devez exécuter cette commande dans la racine du projet git. Si vous êtes dans un sous-répertoire, cette commande ne modifie que les fichiers du répertoire courant. Puis les valider et vous devriez être bon.

vous pouvez défaire ce par

git reset --hard 

qui supprimera toutes les modifications du répertoire de travail et de la zone de transit.

926
répondu Alex Reisner 2018-08-19 08:32:39

Pour la restauration à un commit:

git reset --hard commit_sha

Pour la restauration d'10 s'engage:

git reset --hard HEAD~10

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

comment restaurer un dépôt Git à une propagation précédente?

159
répondu Naga Kiran 2017-05-23 11:47:31

Eh bien, je suppose que la question Est, Que voulez-vous dire par "reculer"? 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? Utilisez git checkout et le hachage de propagation.

Edit: comme indiqué dans les commentaires, utiliser git checkout sans spécifier de branche vous laissera dans un État "aucune branche". Utiliser git checkout <commit> -b <branchname> pour effectuer une caisse dans une succursale, ou git checkout <commit> . à la caisse dans la branche courante.

76
répondu Ben 2010-01-05 17:26:45

l'affiche originale dit:

la meilleure réponse que quelqu'un pouvait me donner était d'utiliser git revert X fois jusqu'à ce que je atteindre le commettre.

disons que je veux revenir à un commit 20 s'engage vieux, j'aurais pour l'exécuter à 20 fois.

y a-t-il un moyen plus simple de le faire?

Je ne peux pas utiliser reset car cette déclaration est publique.

il n'est pas nécessaire d'utiliser git revert X fois. git revert peut accepter un commit range comme argument, vous n'avez donc besoin de l'utiliser qu'une seule fois pour inverser une range de commits. par exemple, si vous voulez revenir en arrière Le Dernier 20 commits:

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

la plage de propagation HEAD~20.. est l'abréviation de HEAD~20..HEAD , et signifie "démarrer à partir de la 20 th parent de la propagation tête, et revenir toutes les propagations après à la TÊTE".

qui va revenir que le dernier 20 commet, en supposant qu'aucun de ceux-ci ne sont fusionner engager. S'il y a fusion commits, alors vous ne pouvez pas les retourner tous dans une commande, vous aurez besoin de les retourner individuellement avec

git revert -m 1 <merge-commit>

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

git revert Est Mieux Que git checkout

notez que contrairement à cette réponse qui dit d'utiliser git checkout , git revert va vraiment supprimer tous les fichiers qui ont été ajoutés dans les commits que vous êtes revenir à , ce qui fait de cela la bonne façon de revenir à une série de révisions.

Documentation

36
répondu Community 2017-05-23 11:55:01

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

git log

vous obtiendrez la 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
...

Etape 2: copier nécessaire de le coller et de le coller pour la commande:

git checkout fd6cb176297acca4dbc69d15d6b7f78a2463482f

C'est tout.

20
répondu Igor 2016-12-22 11:12:36
git read-tree -um @ $commit_to_revert_to

le fera. C'est" git checkout " mais sans mettre la tête à jour.

Vous pouvez obtenir le même effet avec

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

si vous préférez passer des commandes de commodité ensemble.

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

8
répondu jthill 2016-02-06 20:14:32

Je ne suis pas sûr de ce qui a changé, mais je ne suis pas en mesure de vérifier une propagation 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 branche locale: git checkout master

1
répondu ken 2017-02-22 11:59:02

disons que vous travaillez sur un projet et après un jour ou deux. Vous remarquez qu'une fonctionnalité vous donne encore des erreurs. Mais vous ne savez pas quel changement vous avez fait qui a causé l'erreur. Vous devez donc pêcher les propagations précédentes. Pour revenir à un engagement spécifique:

git checkout 8a0fe5191b7dfc6a81833bfb61220d7204e6b0a9 .

Ok, donc ce commit fonctionne pour vous. Pas plus d'erreur. Vous avez mis le doigt sur la question. Maintenant, vous pouvez revenir à la dernière commit:

git checkout 792d9294f652d753514dc2033a04d742decb82a5 .

et consulter un fichier spécifique devant lui l'origine de l'erreur (dans mon cas, j'utilise exemple Gemfile.serrure):

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

et c'est une façon de gérer les erreurs que vous avez créées dans commits sans réaliser les erreurs jusqu'à plus tard.

0
répondu Donato 2018-09-21 21:03:52