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.
8 réponses
essayez ceci:
git checkout [revision] .
où [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.
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?
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.
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
É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.
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.
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
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.