Rétrograder un ancien Git dans un repo 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é.

Alors, disons que je veux revenir à un engagement de 20 commits, je devrais l’exécuter 20 fois.

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

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

Essaye ça:

 git checkout [revision] . 

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

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

Vous pouvez annuler cela par

 git reset --hard 

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

Pour revenir à une validation spécifique:

 git reset --hard commit_sha 

Pour annuler 10 commits en arrière:

 git reset --hard HEAD~10 

Vous pouvez utiliser “git revert” comme dans l’article suivant si vous ne voulez pas réécrire l’historique

Comment rétablir le repository Git sur un commit précédent?

Eh bien, je suppose que la question est de savoir ce que vous entendez par «retour en arrière». Si vous ne pouvez pas reset car il est public et que vous souhaitez conserver l’historique des validations intactes, voulez-vous dire que vous souhaitez simplement que votre copie de travail reflète un commit spécifique? Utilisez git checkout et le hash de validation.

Edit: Comme indiqué dans les commentaires, l’utilisation de git checkout sans spécifier de twig vous laissera dans un état “no branch”. Utilisez git checkout -b pour git checkout -b une twig ou git checkout . à la caisse dans la twig actuelle.

L’affiche originale indique:

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é.

Alors, disons que je veux revenir à un engagement de 20 commits, je devrais l’exécuter 20 fois.

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

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

Il n’est pas nécessaire d’utiliser git revert X fois. git revert peut accepter une plage de validation en tant qu’argument, il vous suffit donc de l’utiliser une seule fois pour annuler une série de validations. Par exemple, si vous souhaitez annuler 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 “commencer à partir du HEAD~20..HEAD parent de la validation HEAD, et rétablir tous les commits après HEAD”.

Cela reviendra sur les 20 dernières validations, en supposant qu’aucune de celles-ci ne soit validée. S’il y a des validations de fusion, vous ne pouvez pas les annuler toutes en une seule fois, vous devrez les rétablir individuellement avec

 git revert -m 1  

Notez également que j’ai testé une plage avec git revert utilisant la version 1.9.0 de git. Si vous utilisez une ancienne version de git, l’utilisation d’une plage avec git revert peut ou non fonctionner.

git revert est meilleur que git checkout

Notez que contrairement à cette réponse qui dit d’utiliser git checkout , git revert supprimera tous les fichiers ajoutés dans les validations que vous rétablissez , ce qui en fait le moyen correct de revenir à une série de révisions.

Documentation

  • git-revert (1) Page Manuelle .
  • Commit Ranges .

Etape 1: Récupère la liste des commits:

 git log 

Vous aurez la liste comme dans cet exemple:

 [Comp:Folder User$ git log commit 54b11d42e12dc6e9f070a8b5095a4492216d5320 Author: author  Date: Fri Jul 8 23:42:22 2016 +0300 This is last commit message commit fd6cb176297acca4dbc69d15d6b7f78a2463482f Author: author  Date: Fri Jun 24 20:20:24 2016 +0300 This is previous commit message commit ab0de062136da650ffc27cfb57febac8efb84b8d Author: author  Date: Thu Jun 23 00:41:55 2016 +0300 This is previous previous commit message ... 

Étape 2: copier le hachage de validation nécessaire et le coller pour le paiement:

 git checkout fd6cb176297acca4dbc69d15d6b7f78a2463482f 

C’est tout.

 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 combiner les commandes de commodité ensemble.

Celles-ci vous laissent avec votre worktree et votre index dans l’état souhaité, vous pouvez simplement vous git commit à terminer.

Je ne suis pas sûr de ce qui a changé, mais je ne parviens pas à valider 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é, je devais vérifier ma succursale locale: git checkout master