Rollback à une ancienne git commit dans une pension publique
-
18-09-2019 - |
Question
Comment puis-je aller sur le retour à un particulier Commit dans git?
La meilleure réponse que quelqu'un pourrait me donner était d'utiliser des temps git revert
X jusqu'à ce que j'atteins désiré commettre.
Disons que je veux revenir à un engagement qui est 20 commits vieux, je dois courir 20 fois.
Y at-il un moyen plus facile de le faire?
Je ne peux pas utiliser parce que ce référentiel réinitialisation est public.
La solution
Essayez ceci:
git checkout [revision] .
où [revision]
est le hachage commit (par exemple: 12345678901234567890123456789012345678ab
).
Ne pas oublier le .
à la fin, très important. Cela appliquera les changements à 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 change que les fichiers dans le répertoire courant. Puis engager et vous devriez être bon.
Vous pouvez annuler cette action en
git reset --hard
qui supprimera toutes les modifications du répertoire de travail et de la zone mise en scène.
Autres conseils
Pour revenir à une engagement spécifique:
git reset --hard commit_sha
Pour rollback 10 engage retour:
git reset --hard HEAD~10
Vous pouvez utiliser « revert git » comme dans le post suivant si vous ne voulez pas réécrire l'histoire
Eh bien, je suppose que la question est, qu'est-ce que vous entendez par « faire reculer »? Si vous ne pouvez pas reset
parce qu'il est public et que vous voulez garder l'historique des commits intacte, voulez-vous dire que vous voulez juste votre copie de travail pour tenir compte d'une validation spécifique? Utilisez git checkout
et la validation de hachage.
Edit: Comme cela a été souligné dans les commentaires, en utilisant git checkout
sans spécifier une branche vous laissera dans un état « pas de branche ». Utilisez git checkout <commit> -b <branchname>
à la caisse dans une branche, ou git checkout <commit> .
à la caisse dans la branche de courant.
L'affiche originale déclare:
La meilleure réponse que quelqu'un pourrait me donner était d'utiliser des temps
git revert
X jusqu'à ce que je atteindre le désiré commit.Disons que je veux revenir à un engagement qui est 20 commits vieux, j'aurais pour l'exécuter 20 fois.
Y at-il un moyen plus facile de le faire?
Je ne peux pas utiliser cette réinitialisation font repo est public.
Il est pas nécessaire d'utiliser des temps git revert
X. git revert
peut accepter une
engager gamme comme un argument, donc il vous suffit de l'utiliser une fois pour revenir une gamme
de commits Par exemple, si vous souhaitez revenir les 20 derniers commits.
git revert --no-edit HEAD~20..
La gamme HEAD~20..
engagement est court pour HEAD~20..HEAD
, et signifie "démarrer à partir du 20 e parent de la tête commit, et annule tous les commits après jusqu'à HEAD".
Cela reviendra que 20 commits, en supposant qu'aucun d'entre eux sont fusion engage. S'il y a fusion engage, vous ne pouvez pas les annuler en une seule commande, vous aurez besoin de les revenir individuellement avec
git revert -m 1 <merge-commit>
Notez aussi que je l'ai testé à l'aide d'une gamme avec git revert
en utilisant la version git 1.9.0. Si vous utilisez une version plus ancienne de git, en utilisant une gamme avec git 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 utiliser git checkout
, git revert
supprimera effectivement les fichiers qui ont été ajoutés dans l'un des commits que vous êtes
revenir , ce qui rend ce la bonne façon de revenir une série de révisions.
Documentation
Étape 1: fetch 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
...
Étape 2: copie nécessaire commit hachage et le coller pour votre commande:
git checkout fd6cb176297acca4dbc69d15d6b7f78a2463482f
est tout.
git read-tree -um @ $commit_to_revert_to
le fera. Il 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 les commandes confort chaînant.
Ils vous laissent avec votre worktree et l'index dans l'état souhaité, vous pouvez juste git commit
pour terminer.
Je ne sais pas ce qui a changé, mais je ne parviens pas à la caisse une validation spécifique sans --detach
option. La commande complète qui a fonctionné pour moi était:
git checkout --detach [commit hash]
Pour revenir de l'état détaché je devais ma caisse branche locale: git checkout master
Disons que vous travaillez sur un projet et après une journée ou plus. Vous remarquez une caractéristique est encore génère des erreurs. Mais vous ne savez pas ce que vous avez fait le changement qui a causé l'erreur. Donc, vous devez pêcher commits travail précédent. Pour revenir à une validation spécifique:
git checkout 8a0fe5191b7dfc6a81833bfb61220d7204e6b0a9 .
Ok, de sorte que commettras fonctionne pour vous. Plus d'erreur. Vous mis le doigt sur la question. Maintenant, vous pouvez revenir à la dernière commettez:
git checkout 792d9294f652d753514dc2033a04d742decb82a5 .
Et la caisse d'un fichier spécifique avant qu'il a causé l'erreur (dans mon cas, je l'utilise par exemple Gemfile.lock):
git checkout 8a0fe5191b7dfc6a81833bfb61220d7204e6b0a9 -- /projects/myproject/Gemfile.lock
Et c'est une façon de gérer les erreurs créées dans engage sans se rendre compte des erreurs plus tard.
Vous voulez HEAD mode détaché?
Si vous souhaitez rollback temps X à un certain engagement avec une tête INDEPENDANTE (ce qui signifie que vous ne pouvez pas gâcher quoi que ce soit), puis par tous les moyens, utilisez ce qui suit:
(remplacez X par combien vous souhaitez commits revenir)
git checkout HEAD~X
i.e.. pour revenir un commettras:
git checkout HEAD~1
Voici un exemple pour faire
cd /yourprojects/project-acme
git checkout efc11170c78 .
Vous pouvez trouver l'engagement id lié à chaque validation dans la section commits de GitHub / BitBucket / gitlab ce. Il est très simple, supposons que votre commettras id est 5.889.575 alors si vous voulez revenir à cette partie dans votre code alors il vous suffit de taper
git checkout 5889575 .
Cela vous prendra à ce moment dans votre code.