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.
Essaye ça:
git checkout [revision] .
où [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.
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?
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.
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.
É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.
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.
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
Voici un exemple pour le faire
cd /yourprojects/project-acme
git checkout efc11170c78 .
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.
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
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.