Comment revenir de mon état actuel à un instantané effectué sur un certain commit?
Si je le fais git log
, j'obtiens la sortie suivante:
$ git log
commit a867b4af366350be2e7c21b8de9cc6504678a61b`
Author: Me <[email protected]>
Date: Thu Nov 4 18:59:41 2010 -0400
blah blah blah...
commit 25eee4caef46ae64aa08e8ab3f988bc917ee1ce4
Author: Me <[email protected]>
Date: Thu Nov 4 05:13:39 2010 -0400
more blah blah blah...
commit 0766c053c0ea2035e90f504928f8df3c9363b8bd
Author: Me <[email protected]>
Date: Thu Nov 4 00:55:06 2010 -0400
And yet more blah blah...
commit 0d1d7fc32e5a947fbd92ee598033d85bfc445a50
Author: Me <[email protected]>
Date: Wed Nov 3 23:56:08 2010 -0400
Yep, more blah blah.
Comment revenir à la validation à partir du 3 novembre, c'est-à-dire la validation 0d1d7fc
?
git
git-checkout
git-reset
git-revert
Crazy Serb
la source
la source
Réponses:
Cela dépend beaucoup de ce que vous entendez par "revenir".
Passer temporairement à un autre commit
Si vous voulez y revenir temporairement, vous amuser, puis revenir là où vous êtes, il vous suffit de vérifier le commit souhaité:
Ou si vous voulez faire des commits pendant que vous y êtes, allez-y et créez une nouvelle branche pendant que vous y êtes:
Pour revenir à l'endroit où vous vous trouviez, vérifiez à nouveau la branche dans laquelle vous vous trouviez. (Si vous avez apporté des modifications, comme toujours lorsque vous changez de branche, vous devrez les traiter comme il convient. Vous pouvez réinitialiser pour les jeter; vous pouvez cacher, retirer, cacher la pop pour les emporter avec vous; vous pouvez vous engager à une succursale là-bas si vous voulez une succursale là-bas.)
Supprimer définitivement les validations non publiées
Si, d'autre part, vous voulez vraiment vous débarrasser de tout ce que vous avez fait depuis, il y a deux possibilités. Premièrement, si vous n'avez publié aucun de ces commits, réinitialisez simplement:
Si vous vous trompez, vous avez déjà supprimé vos modifications locales, mais vous pouvez au moins revenir à votre position précédente en réinitialisant à nouveau.
Annuler les validations publiées avec de nouvelles validations
D'un autre côté, si vous avez publié le travail, vous ne voudrez probablement pas réinitialiser la branche, car cela réécrit effectivement l'historique. Dans ce cas, vous pouvez en effet annuler les commits. Avec Git, revert a une signification très spécifique: créer un commit avec le patch inverse pour l'annuler. De cette façon, vous ne réécrivez aucun historique.
La
git-revert
page de manuel couvre en fait une grande partie de cela dans sa description. Un autre lien utile est cette section git-scm.com traitant de git-revert .Si vous décidez que vous ne voulez pas revenir après tout, vous pouvez annuler le retour (comme décrit ici) ou réinitialiser à avant le retour (voir la section précédente).
Vous pouvez également trouver cette réponse utile dans ce cas:
Comment déplacer HEAD vers un emplacement précédent? (Tête détachée)
la source
git revert HEAD~3
le meilleur wat pour revenir en arrière3
est une convention importante.git reset --hard 0d1d7fc32e5a947fbd92ee598033d85bfc445a50
git revert --no-commit hash1 hash2 ...
et après cela juste valider chaque retour en un seul commitgit commit -m "Message"
Beaucoup de réponses compliquées et dangereuses ici, mais c'est en fait facile:
Cela ramènera tout du HEAD au hachage de validation, ce qui signifie qu'il recréera cet état de validation dans l'arborescence de travail comme si chaque validation depuis avait été parcourue. Vous pouvez ensuite valider l'arborescence actuelle, et cela créera une toute nouvelle validation essentiellement équivalente à la validation à laquelle vous "êtes revenu".
(L'
--no-commit
indicateur permet à git d'annuler toutes les validations à la fois, sinon vous serez invité à fournir un message pour chaque validation de la plage, jonçant votre historique de nouvelles validations inutiles.)Il s'agit d'un moyen sûr et facile de revenir à un état précédent . Aucun historique n'est détruit, il peut donc être utilisé pour des commits qui ont déjà été rendus publics.
la source
--no-edit
place de--no-commit
, de sorte que vous n'ayez pas à modifier un message de validation pour chaque réversion.git diff --cached
.$ git revert --no-commit 53742ae..HEAD
retoursfatal: empty commit set passed
81bcc9e HEAD{0}; e475924 HEAD{1}, ...
(à partir degit reflog
), et je voulais annuler ce que j'avais fait81bcc9e
, alors je devais le fairegit revert e475924..HEAD
Rogue Coder?
Vous travaillez seul et vous voulez juste que ça marche? Suivez ces instructions ci-dessous, ils ont fonctionné de manière fiable pour moi et beaucoup d'autres depuis des années.
Travailler avec les autres? Git est compliqué. Lisez les commentaires sous cette réponse avant de faire quelque chose de téméraire.
Rétablissement de la copie de travail à la validation la plus récente
Pour revenir à une validation précédente, en ignorant toutes les modifications:
où HEAD est le dernier commit de votre branche actuelle
Rétablissement de la copie de travail vers un commit plus ancien
Pour revenir à un commit plus ancien que le commit le plus récent:
Les crédits vont à une question de débordement de pile similaire, revenir à un commit par un hachage SHA dans Git? .
la source
git reset --hard 56e05fc; git reset --soft HEAD@{1}; git commit
.La meilleure option pour moi et probablement pour d'autres est l'option de réinitialisation de Git:
Cela a été la meilleure option pour moi! C'est simple, rapide et efficace!
Toujours d'après les commentaires, si vous vouliez une méthode moins «balleuse», vous pourriez utiliser
la source
git push -f
drapeau .. Mais attention, il remplacera la télécommande .. Assurez-vous de savoir ce que vous voulez faire ...Avant de répondre, ajoutons un peu de contexte, expliquant ce que
HEAD
c'est.First of all what is HEAD?
HEAD
est simplement une référence au commit actuel (le plus récent) sur la branche courante. Il ne peut y en avoir qu'un seulHEAD
à un moment donné (horsgit worktree
).Le contenu de
HEAD
est stocké à l'intérieur.git/HEAD
et contient les 40 octets SHA-1 de la validation en cours.detached HEAD
Si vous n'êtes pas sur le dernier commit - ce qui signifie que
HEAD
pointe vers un commit précédent dans l'historique, il est appelédetached HEAD
.Sur la ligne de commande, cela ressemblera à ceci - SHA-1 au lieu du nom de la branche car le
HEAD
ne pointe pas vers la pointe de la branche actuelle:Quelques options sur la façon de récupérer à partir d'une tête détachée:
git checkout
Cela va extraire une nouvelle branche pointant vers le commit souhaité. Cette commande extrait un commit donné.
À ce stade, vous pouvez créer une branche et commencer à travailler à partir de ce point:
git reflog
Vous pouvez toujours utiliser le
reflog
.git reflog
affichera tout changement qui a mis à jour leHEAD
et vérifier l'entrée de reflog souhaitée mettra leHEAD
dos à ce commit.Chaque fois que le HEAD est modifié, il y aura une nouvelle entrée dans le
reflog
Cela vous ramènera à votre engagement souhaité
git reset HEAD --hard <commit_id>
"Déplacer" votre tête vers le commit souhaité.
git rebase --no-autostash
.Ce schéma illustre quelle commande fait quoi. Comme vous pouvez le voir,
reset && checkout
modifiez leHEAD
.la source
git reflog
, c'est exactement ce dont j'avais besoingit reset HEAD^
--hard`Si vous souhaitez "annuler l'engagement", effacer le dernier message de validation et remettre les fichiers modifiés en attente, vous utiliserez la commande:
--soft
indique que les fichiers non validés doivent être conservés en tant que fichiers de travail par opposition à ceux--hard
qui les élimineraient.HEAD~1
est le dernier commit. Si vous souhaitez annuler 3 commits, vous pouvez les utiliserHEAD~3
. Si vous souhaitez revenir à un numéro de révision spécifique, vous pouvez également le faire à l'aide de son hachage SHA.Il s'agit d'une commande extrêmement utile dans les situations où vous avez commis la mauvaise chose et que vous souhaitez annuler ce dernier commit.
Source: http://nakkaya.com/2009/09/24/git-delete-last-commit/
la source
Vous pouvez le faire à l'aide des deux commandes suivantes:
Cela supprimera votre précédent commit Git.
Si vous souhaitez conserver vos modifications, vous pouvez également utiliser:
Ensuite, il enregistrera vos modifications.
la source
J'ai essayé de nombreuses façons de rétablir les modifications locales dans Git, et il semble que cela fonctionne mieux si vous souhaitez simplement revenir au dernier état de validation.
Brève description:
git revert
fait.git checkout <commithashcode>
fait.J'ai trouvé un moyen beaucoup plus pratique et simple d'obtenir les résultats ci-dessus:
où HEAD pointe vers le dernier commit de votre branche actuelle.
C'est le même code que suggéré par boulder_ruby, mais j'ai ajouté
git add .
avantgit reset --hard HEAD
d'effacer tous les nouveaux fichiers créés depuis le dernier commit car c'est ce que la plupart des gens attendent, je pense, lors du retour au dernier commit.la source
OK, revenir à un commit précédent dans Git est assez facile ...
Revenir en arrière sans conserver les modifications:
Revenez en arrière en conservant les modifications:
Explication: à l' aide de
git reset
, vous pouvez réinitialiser un état spécifique. Il est courant de l'utiliser avec un hachage de validation comme vous le voyez ci-dessus.Mais comme vous voyez, la différence est d'utiliser les deux drapeaux
--soft
et--hard
, par défaut, d'git reset
utiliser le--soft
drapeau, mais c'est toujours une bonne pratique d'utiliser toujours le drapeau, j'explique chaque drapeau:--doux
L'indicateur par défaut comme expliqué, pas besoin de le fournir, ne change pas l'arborescence de travail, mais il ajoute tous les fichiers modifiés prêts à être validés, vous revenez donc à l'état de validation qui modifie les fichiers sans mise en scène.
--difficile
Soyez prudent avec ce drapeau. Il réinitialise l'arborescence de travail et toutes les modifications apportées aux fichiers suivis et tout sera parti!
J'ai également créé l'image ci-dessous qui peut se produire dans une vraie vie en travaillant avec Git:
la source
git reset
estgit reset --mixed
nongit reset --soft
. Veuillez vérifier Quelle est la différence entre git reset --mixed, --soft et --hard? et en clair, que fait «git reset»?En supposant que vous parlez de maître et sur cette branche respective (cela dit, cela pourrait être n'importe quelle branche de travail qui vous intéresse):
J'ai trouvé la réponse dans un article de blog (maintenant n'existe plus)
Notez qu'il s'agit de réinitialiser et de forcer la modification de la télécommande, de sorte que si d'autres membres de votre équipe ont déjà tiré, vous leur causerez des problèmes. Vous détruisez l'historique des changements, ce qui est une raison importante pour laquelle les gens utilisent git en premier lieu.
Mieux vaut utiliser Revert (voir les autres réponses) que Reset. Si vous êtes une équipe d'un seul homme, cela n'a probablement pas d'importance.
la source
Supposons que vous ayez les validations suivantes dans un fichier texte nommé
~/commits-to-revert.txt
(j'avais l'habitudegit log --pretty=oneline
de les obtenir)Créez un script shell Bash pour rétablir chacun d'eux:
Cela ramène tout à l'état précédent, y compris les créations et les suppressions de fichiers et de répertoires, le validez dans votre branche et vous conservez l'historique, mais vous le faites revenir à la même structure de fichiers. Pourquoi Git n'en a pas
git revert --to <hash>
me dépasse.la source
git revert HEAD~3
pour supprimer les 3 derniers commitsgit revert -n master~3..master~1
marcherait? (Vu depuis kernel.org/pub/software/scm/git/docs/git-revert.html )git revert --no-commit <start>..<end>
, car ilgit revert
accepte une plage de commit dans les nouvelles (ou toutes?) Versions de Git. Notez que le début de la plage n'est pas inclus dans le retour.Alternatives supplémentaires aux solutions de Jefromi
Les solutions de Jefromi sont certainement les meilleures et vous devez absolument les utiliser. Cependant, dans un souci d'exhaustivité, je voulais également montrer ces autres solutions alternatives qui peuvent également être utilisées pour annuler une validation (dans le sens où vous créez une nouvelle validation qui annule les modifications dans la validation précédente , tout comme ce qui se
git revert
produit).Pour être clair, ces alternatives ne sont pas le meilleur moyen de revenir sur les commits , les solutions de Jefromi le sont , mais je veux juste souligner que vous pouvez également utiliser ces autres méthodes pour obtenir la même chose que
git revert
.Alternative 1: réinitialisations matérielles et logicielles
Ceci est une version très légèrement modifiée de la solution de Charles Bailey pour revenir à un commit par un hachage SHA dans Git? :
Cela fonctionne essentiellement en utilisant le fait que les réinitialisations logicielles laisseront l'état de la validation précédente dans la zone index / staging, que vous pourrez ensuite valider.
Alternative 2: supprimer l'arborescence actuelle et la remplacer par la nouvelle
Cette solution provient de la solution de svick pour extraire l' ancien commit et en faire un nouveau commit :
De manière similaire à l'alternative # 1, cela reproduit l'état de
<commit>
la copie de travail actuelle. Il est nécessaire de faire d'git rm
abord cargit checkout
ne supprimera pas les fichiers qui ont été ajoutés depuis<commit>
.la source
git revert HEAD~2..HEAD
solution liée de @ Cascabel (@ Jefromi). Je ne vois pas le problème.Voici un moyen beaucoup plus simple de revenir à un commit précédent (et de l'avoir dans un état non engagé, pour en faire ce que vous voulez):
Donc, pas besoin d'ID de validation et ainsi de suite :)
la source
Il existe une commande (qui ne fait pas partie du noyau Git, mais qui se trouve dans le paquet git-extras ) spécifiquement pour annuler et mettre en scène les anciens commits:
Selon la page de manuel , il peut également être utilisé comme tel:
la source
La meilleure façon est:
Cela réinitialisera la branche sur la validation spécifique, puis téléchargera le serveur distant avec les mêmes validations que vous avez en local (cela éliminera complètement les commandes après cette validation spécifique)
Soyez prudent avec le
--force
drapeau supprime toutes les validations suivantes après la validation sélectionnée sans la possibilité de les récupérer.la source
Après toutes les modifications, lorsque vous appuyez sur toutes ces commandes, vous devrez peut-être utiliser:
Et pas seulement
git push
.la source
Vous pouvez effectuer vous-même toutes ces étapes initiales et repousser vers le référentiel Git.
Tirez la dernière version de votre référentiel de Bitbucket à l'aide de la
git pull --all
commande.Exécutez la commande Git log avec
-n 4
depuis votre terminal. Le nombre après le-n
détermine le nombre de validations dans le journal à partir de la plus récente validation de votre historique local.Réinitialisez la tête de l'historique de votre référentiel en utilisant
git reset --hard HEAD~N
où N est le nombre de validations que vous souhaitez reprendre. Dans l'exemple suivant, l'en-tête serait rétrogradé d'un commit, au dernier commit de l'historique du référentiel:Poussez la modification vers le référentiel Git en utilisant
git push --force
pour forcer la poussée de la modification.Si vous souhaitez que le référentiel Git soit validé précédemment:
la source
Revenez à la validation la plus récente et ignorez toutes les modifications locales:
la source
Sélectionnez votre validation requise et vérifiez-la par
jusqu'à ce que vous obteniez le commit requis. Pour que HEAD pointe vers cela, faites
ou
git reset --hard HEAD~2
ou quoi que ce soit.la source
git show HEAD
équivaut à simplement utilisergit log HEAD -1
.Si la situation est urgente et que vous voulez simplement faire ce que l'interrogateur a demandé de manière rapide et sale , en supposant que votre projet se trouve dans un répertoire appelé, par exemple, "mon projet":
RAPIDE ET SALE : selon les circonstances, rapide et sale peut en fait être très bon. Ce que ma solution ici, ce n'est PAS de remplacer irréversiblement les fichiers que vous avez dans votre répertoire de travail par des fichiers remontés / extraits des profondeurs du référentiel git qui se cachent sous votre répertoire .git / en utilisant des commandes git diaboliquement puissantes et diaboliquement puissantes, dont il y a beaucoup. VOUS N'AVEZ PAS À FAIRE UNE TELLE PLONGÉE EN MER PROFONDE POUR RÉCUPÉRER ce qui peut sembler être une situation désastreuse, et tenter de le faire sans une expertise suffisante peut s'avérer fatal .
Copiez le répertoire entier et appelez-le autrement, comme "mon projet - copier". En supposant que vos fichiers de référentiel git ("repo") se trouvent dans le répertoire "mon projet" (leur emplacement par défaut, dans un répertoire appelé ".git"), vous aurez maintenant copié à la fois vos fichiers de travail et vos fichiers repo.
Faites-le dans le répertoire "mon projet":
Cela ramènera l'état du dépôt sous "mon projet" à ce qu'il était lorsque vous avez fait ce commit (un "commit" signifie un instantané de vos fichiers de travail). Toutes les validations depuis lors seront perdues à jamais sous "mon projet", MAIS ... elles seront toujours présentes dans le référentiel sous "mon projet - copier" puisque vous avez copié tous ces fichiers - y compris ceux sous ... /. Git /.
Vous avez alors deux versions sur votre système ... vous pouvez examiner ou copier ou modifier les fichiers d'intérêt, ou autre, à partir du commit précédent. Vous pouvez supprimer complètement les fichiers sous "mon projet - copier", si vous avez décidé du nouveau travail puisque le commit restauré n'allait nulle part ...
La chose évidente si vous voulez continuer avec l'état du projet sans réellement supprimer le travail puisque cette validation récupérée est de renommer à nouveau votre répertoire: supprimez le projet contenant la validation récupérée (ou donnez-lui un nom temporaire) et renommez votre " mon projet - recopiez le "répertoire" dans "mon projet". Ensuite, essayez peut-être de comprendre certaines des autres réponses ici, et faites probablement un autre commit assez rapidement.
Git est une création brillante mais absolument personne n'est capable de simplement "le ramasser à la volée": aussi les gens qui essaient de l'expliquer beaucoup trop souvent supposent une connaissance préalable d'autres VCS [systèmes de contrôle de version] et plongent beaucoup trop loin trop tôt, et commettre d'autres crimes, comme utiliser des termes interchangeables pour «vérifier» - d'une manière qui semble parfois presque calculée pour dérouter un débutant.
Pour vous éviter beaucoup de stress, apprenez de mes cicatrices. Vous devez à peu près lire un livre sur Git - je recommanderais "Version Control with Git" . Faites-le plus tôt que tard. Si vous le faites, gardez à l'esprit qu'une grande partie de la complexité de Git vient de la ramification puis de la réémergence: vous pouvez ignorer ces parties dans n'importe quel livre. D'après votre question, il n'y a aucune raison pour que les gens vous aveuglent avec la science .
Surtout si, par exemple, c'est une situation désespérée et que vous êtes un débutant avec Git!
PS: Une autre pensée: il est (maintenant) en fait assez simple de conserver le dépôt Git dans un répertoire autre que celui contenant les fichiers de travail. Cela signifierait que vous n'auriez pas à copier l'intégralité du référentiel Git en utilisant la solution rapide et sale ci-dessus. Voir la réponse de Fryer en utilisant
--separate-git-dir
ici . Soyez averti , cependant: si vous avez un référentiel "répertoire séparé" que vous ne copiez pas et que vous effectuez une réinitialisation matérielle, toutes les versions postérieures à la réinitialisation seront perdues pour toujours, sauf si vous l'avez, comme vous le devez absolument, sauvegardez régulièrement votre référentiel, de préférence sur le Cloud (par exemple Google Drive ) entre autres.Sur ce sujet de la "sauvegarde sur le Cloud", la prochaine étape est d'ouvrir un compte (gratuit bien sûr) avec GitHub ou (mieux à mon avis) GitLab . Vous pouvez ensuite effectuer régulièrement une
git push
commande pour mettre à jour votre repo Cloud "correctement". Mais encore une fois, parler de cela peut être trop tôt.la source
C'est une autre façon de réinitialiser directement un commit récent
Il efface directement toutes les modifications que vous avez apportées depuis le dernier commit.
PS: Il y a un petit problème; il supprime également tous les changements de cachette que vous avez récemment enregistrés. Ce que je suppose dans la plupart des cas ne devrait pas avoir d'importance.
la source
Pour nettoyer complètement le répertoire d'un codeur contre certaines modifications accidentelles, nous avons utilisé:
git reset --hard HEAD
Supprime simplement les modifications, mais ne supprime pas les "nouveaux" fichiers. Dans leur cas, ils avaient accidentellement glissé un dossier important quelque part au hasard, et tous ces fichiers étaient traités comme nouveaux par Git, donc çareset --hard
ne l'a pas corrigé. En exécutant augit add -A .
préalable, il les a explicitement tous suivis avec git, pour être effacés par la réinitialisation.la source
Pour conserver les modifications de la validation précédente vers HEAD et passer à la validation précédente, procédez comme suit:
Si des modifications ne sont pas requises par rapport à la validation précédente dans HEAD et que vous supprimez simplement toutes les modifications, procédez comme suit:
la source
Je pense que certaines personnes peuvent venir à cette question en voulant savoir comment annuler les modifications engagées qu'elles ont apportées à leur maître - c'est-à-dire tout jeter et revenir à l'origine / maître, auquel cas, procédez comme suit:
/superuser/273172/how-to-reset-master-to-origin-master
la source
Revert est la commande pour annuler les validations.
Échantillon:
git revert 2h3h23233
Il est capable de prendre la plage de la tête comme ci-dessous. Ici 1 dit "annuler le dernier commit".
git revert HEAD~1..HEAD
et ensuite
git push
la source
Essayez de réinitialiser le commit souhaité -
git reset <COMMIT_ID>
(pour vérifier l'utilisation de COMMIT_ID
git log
)Cela réinitialisera tous les fichiers modifiés à l'état non ajouté.
Maintenant, vous pouvez
checkout
tous les fichiers non ajoutés pargit checkout .
Cochez
git log
pour vérifier vos modifications.MISE À JOUR
Si vous n'en avez qu'un seul et validez dans votre repo, essayez
git update-ref -d HEAD
la source
Comme vos validations sont poussées à distance, vous devez les supprimer. Permettez-moi de supposer que votre branche est en développement et qu'elle est repoussée sur l' origine .
Vous devez d'abord supprimer le développement d' origine :
Ensuite, vous devez obtenir le développement du statut que vous souhaitez, je suppose que le hachage de validation est EFGHIJK:
Enfin, pousser à nouveau développer :
la source
J'ai eu un problème similaire et je voulais revenir à un commit précédent. Dans mon cas, je n'étais pas intéressé à conserver le nouveau commit, c'est pourquoi j'ai utilisé
Hard
.Voici comment je l'ai fait:
Cela reviendra sur le référentiel local, et ici après l'utilisation
git push -f
mettra à jour le référentiel distant.la source
Dans GitKraken, vous pouvez le faire:
Cliquez avec le bouton droit sur le commit que vous souhaitez réinitialiser, choisissez: Reset to this commit / Hard :
Cliquez de nouveau avec le bouton droit sur le commit, choisissez: Nom de la branche actuelle / Push :
Cliquez sur Force Push :
Obs. : Vous devez être prudent, car tout l'historique des validations après la réinitialisation matérielle est perdu et cette action est irréversible. Vous devez être sûr de ce que vous faites.
la source
Si vous voulez corriger une erreur dans le dernier commit, une bonne alternative serait d'utiliser la commande git commit --amend . Si le dernier commit n'est pointé par aucune référence, cela fera l'affaire, car il crée un commit avec le même parent que le dernier commit. S'il n'y a aucune référence au dernier commit, il sera simplement ignoré et ce commit sera le dernier commit. Il s'agit d'un bon moyen de corriger les validations sans annuler les validations. Cependant, il a ses propres limites.
la source