Comment puis-je faire pour 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 souhaité.
Alors disons que je veux revenir à un commit qui a 20 ans, je devrais l'exécuter 20 fois.
Existe-t-il un moyen plus simple de procéder?
Je ne peux pas utiliser la réinitialisation car ce référentiel est public.
git
git-checkout
git-revert
David
la source
la source
Réponses:
Essaye ça:
où
[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 ne modifie que les fichiers du répertoire actuel. Alors engagez-vous et vous devriez être bon.Vous pouvez annuler cela en
qui supprimera toutes les modifications du répertoire de travail et de la zone de transit.
la source
Pour revenir à une validation spécifique:
Pour annuler 10, vous validez:
Vous pouvez utiliser "git revert" comme dans le post suivant si vous ne voulez pas réécrire l'historique
Comment restaurer le référentiel Git à un commit précédent?
la source
Eh bien, je suppose que la question est, que voulez-vous dire par «reculer»? Si vous ne le pouvez pas,
reset
car il est public et que vous souhaitez conserver l'historique des validations intact, voulez-vous simplement que votre copie de travail reflète un commit spécifique? Utilisezgit checkout
et le hachage de validation.Edit: Comme cela a été souligné dans les commentaires, l'utilisation
git checkout
sans spécifier de branche vous laissera dans un état "sans branche". Utilisez cettegit checkout <commit> -b <branchname>
option pour passer à une succursale ougit checkout <commit> .
pour passer à la succursale actuelle.la source
git checkout
- il est libre de vérifier dans n'importe quelle branche (actuelle ou nouvelle) qu'il souhaite. Je mettrai à jour ma réponse afin qu'elle ne soit pas ambiguë.git reset
supprimer ces fichiers, ce que vous dites ne pas vouloir faire. Essayez de le faire dans une branche distincte:,git checkout <commit> -b <branchname>
vous n'aurez pas de fichiers stagnants dans cette branche .checkout
est qu'elle ne supprimera pas les fichiers qui ont été ajoutés lors d'une validation précédente.L'affiche originale indique:
Il n'est pas nécessaire d'utiliser
git revert
X fois.git revert
peut accepter une plage de validation comme argument, vous n'avez donc besoin de l'utiliser qu'une seule fois pour rétablir une plage de validations. Par exemple, si vous souhaitez annuler les 20 derniers commits:La plage de validation
HEAD~20..
est abrégéeHEAD~20..HEAD
et signifie «commencer à partir du 20 e parent de la validation HEAD, et rétablir toutes les validations suivantes jusqu'à HEAD».Cela ramènera les 20 derniers commits, en supposant qu'aucun d'entre eux ne soit un commit de fusion. S'il y a des validations de fusion, vous ne pouvez pas toutes les annuler en une seule commande, vous devrez les annuler individuellement avec
Notez également que j'ai testé en utilisant une plage avec
git revert
git version 1.9.0. Si vous utilisez une ancienne version de git, l'utilisation d'une plage avecgit revert
peut ou 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 qui ont été ajoutés dans l'un des commits que vous annulez , ce qui en fait la bonne façon d'annuler une gamme de révisions.Documentation
la source
Étape 1: récupérer la liste des validations:
Vous obtiendrez une liste comme dans cet exemple:
Étape 2: copiez le hachage de validation requis et collez-le pour le paiement:
C'est tout.
la source
le fera. C'est "git checkout" mais sans mettre à jour HEAD.
Vous pouvez obtenir le même effet avec
si vous préférez enchaîner des commandes pratiques.
Ceux-ci vous laissent avec votre arbre de travail et votre index dans l'état souhaité, vous pouvez simplement
git commit
terminer.la source
Vous voulez le mode HEAD détaché?
Si vous souhaitez faire reculer X fois un certain commit avec une TÊTE DÉTACHÉE (ce qui signifie que vous ne pouvez rien gâcher), alors certainement, utilisez ce qui suit:
(remplacez X par le nombre de commits que vous souhaitez revenir en arrière)
IE pour revenir en arrière un commit:
la source
Disons que vous travaillez sur un projet et après une journée ou deux. Vous remarquez qu'une fonctionnalité vous donne toujours des erreurs. Mais vous ne savez pas quel changement vous avez provoqué qui a provoqué l'erreur. Vous devez donc pêcher les commits de travail précédents. Pour revenir à un commit spécifique:
Ok, donc ce commit fonctionne pour vous. Plus d'erreur. Vous avez identifié le problème. Vous pouvez maintenant revenir au dernier commit:
Et extraire un fichier spécifique avant qu'il ne cause l'erreur (dans mon cas, j'utilise l'exemple Gemfile.lock):
Et c'est une façon de gérer les erreurs que vous avez créées dans les validations sans réaliser les erreurs plus tard.
la source
Vous pouvez trouver l'ID de validation lié à chaque validation dans la section des validations de GitHub / BitBucket / Gitlab. C'est très simple, supposons que votre ID de validation soit 5889575, puis si vous souhaitez revenir à cette partie de votre code, il vous suffit de taper
Cela vous amènera à ce moment dans votre code.
la source
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:git checkout --detach [commit hash]
Pour revenir de l'état détaché, j'ai dû vérifier ma succursale locale:
git checkout master
la source
master
résout le problème de rester détaché, tout en faisantgit reset --hard
ou engit checkout -- .
travaillant mais resté détachéVoici un exemple pour le faire
la source