Question Comment rétablir un dépôt Git à un commit précédent


Comment puis-je revenir de mon état actuel à un instantané effectué sur un certain commit?

Si je fais git log, alors je reçois la sortie suivante:

$ git log
commit a867b4af366350be2e7c21b8de9cc6504678a61b`
Author: Me <me@me.com>
Date:   Thu Nov 4 18:59:41 2010 -0400

blah blah blah...

commit 25eee4caef46ae64aa08e8ab3f988bc917ee1ce4
Author: Me <me@me.com>
Date:   Thu Nov 4 05:13:39 2010 -0400

more blah blah blah...

commit 0766c053c0ea2035e90f504928f8df3c9363b8bd
Author: Me <me@me.com>
Date:   Thu Nov 4 00:55:06 2010 -0400

And yet more blah blah...

commit 0d1d7fc32e5a947fbd92ee598033d85bfc445a50
Author: Me <me@me.com>
Date:   Wed Nov 3 23:56:08 2010 -0400

Yep, more blah blah.

Comment revenir à la validation à partir du 3 novembre, c'est-à-dire valider 0d1d7fc?


6011
2017-11-06 16:58


origine


Réponses:


Cela dépend beaucoup de ce que vous entendez par "revenir".

Passer temporairement à un autre commit

Si vous voulez y retourner temporairement, batifoler, puis revenir là où vous êtes, il vous suffit de vérifier le commit souhaité:

# This will detach your HEAD, that is, leave you with no branch checked out:
git checkout 0d1d7fc32

Ou si vous voulez faire des validations pendant que vous êtes là, allez-y et créez une nouvelle branche pendant que vous y êtes:

git checkout -b old-state 0d1d7fc32

Pour retourner à l'endroit où vous étiez, vérifiez la succursale où vous étiez encore. (Si vous avez fait des changements, comme toujours lors du changement de branche, vous devrez vous en occuper le cas échéant.) Vous pouvez réinitialiser pour les jeter, vous pouvez les stocker, les archiver, les stocker avec vous, vous pouvez commettre. à une branche là si vous voulez une branche là-bas.)

Supprimer définitivement les validations non publiées

Si, d'un autre côté, vous voulez vraiment vous débarrasser de tout ce que vous avez fait depuis, il y a deux possibilités. Un, si vous n'avez publié aucun de ces commits, réinitialisez simplement:

# This will destroy any local modifications.
# Don't do it if you have uncommitted work you want to keep.
git reset --hard 0d1d7fc32

# Alternatively, if there's work to keep:
git stash
git reset --hard 0d1d7fc32
git stash pop
# This saves the modifications, then reapplies that patch after resetting.
# You could get merge conflicts, if you've modified things which were
# changed since the commit you reset to.

Si vous vous trompez, vous avez déjà perdu vos modifications locales, mais vous pouvez au moins revenir à l'endroit où vous étiez auparavant en réinitialisant à nouveau.

Annuler les validations publiées avec de nouveaux validations

D'un autre côté, si vous avez publié le travail, vous ne voulez probablement pas réinitialiser la branche, car cela réécrit efficacement l'historique. Dans ce cas, vous pouvez en effet annuler les validations. Avec Git, revert a une signification très spécifique: créer un commit avec le reverse patch pour l'annuler. De cette façon, vous ne réécrivez aucun historique.

# This will create three separate revert commits:
git revert a867b4af 25eee4ca 0766c053

# It also takes ranges. This will revert the last two commits:
git revert HEAD~2..HEAD

#Similarly, you can revert a range of commits using commit hashes:
git revert a867b4af..0766c053 

# Reverting a merge commit
git revert -m 1 <merge_commit_sha>

# To get just one, you could use `rebase -i` to squash them afterwards
# Or, you could do it manually (be sure to do this at top level of the repo)
# get your index and work tree into the desired state, without changing HEAD:
git checkout 0d1d7fc32 .

# Then commit. Be sure and write a good message describing what you just did
git commit

le git-revert page de manuel couvre en fait beaucoup de cela dans sa description. Un autre lien utile est cette section de git-scm.com discutant git-revert.

Si vous décidez que vous ne vouliez pas revenir après tout, vous pouvez annuler le retour (comme décrit ici) ou le 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 la tête vers un emplacement précédent? (Tête détachée)


7825
2017-11-06 17:04



Rétablissement de la copie de travail vers la validation la plus récente

Pour revenir à une validation précédente, en ignorant les modifications:

git reset --hard HEAD

où HEAD est le dernier commit de votre branche actuelle

Rétablissement de la copie de travail dans une ancienne version

Pour revenir à un commit plus ancien que le commit le plus récent:

# Resets index to former commit; replace '56e05fced' with your commit code
git reset 56e05fced 

# Moves pointer back to previous HEAD
git reset --soft HEAD@{1}

git commit -m "Revert to 56e05fced"

# Updates working copy to reflect the new commit
git reset --hard

Les crédits vont à une question Stack Overflow similaire, Revenir à une validation par un hachage SHA dans Git?.


1260
2017-08-21 06:19



Beaucoup de réponses compliquées et dangereuses ici, mais c'est en fait facile:

git revert --no-commit 0766c053..HEAD
git commit

Cela va tout retourner de la tête vers le hash de commit, ce qui signifie qu'il va recréer cet état de commit dans l'arbre de travail comme si chaque commit depuis avait été repoussé. Vous pouvez ensuite valider l'arborescence en cours et créer un nouveau commit essentiellement équivalent au commit auquel vous êtes "revenu".

(Le --no-commit flag permet à git de rétablir toutes les validations à la fois - sinon, vous serez invité à entrer un message pour chaque commit dans la plage, ce qui jettera des erreurs inutiles dans votre historique.)

C'est un moyen sûr et facile de revenir à un état antérieur. Aucun historique n'est détruit, il peut donc être utilisé pour des validations qui ont déjà été rendues publiques.


1221
2018-02-12 04:18



La meilleure option pour moi et probablement d'autres est l'option de réinitialisation Git:

git reset --hard <commidId> && git clean -f

Cela a été la meilleure option pour moi! C'est simple, rapide et efficace!


Remarque :  Comme mentionné dans les commentaires, ne faites pas cela si vous partagez votre branche avec d'autres personnes qui ont des copies des anciens commits

De plus, à partir des commentaires, si vous vouliez une méthode moins «ballante», vous pourriez utiliser

git clean -i 


153
2017-10-22 11:53



Si vous voulez "uncommit", effacez le dernier message de commit, et replacez les fichiers modifiés dans le staging, vous utiliserez la commande:

git reset --soft HEAD~1
  • --soft indique que les fichiers non validés doivent être conservés en tant que fichiers de travail opposés à --hard ce qui les jetterait.
  • HEAD~1 est le dernier commit. Si vous voulez annuler 3 commits, vous pouvez utiliser HEAD~3. Si vous souhaitez revenir à un numéro de révision spécifique, vous pouvez également le faire en utilisant son hachage SHA.

C'est une commande extrêmement utile dans les situations où vous avez commis la mauvaise chose et que vous voulez annuler ce dernier commit.

La source: http://nakkaya.com/2009/09/24/git-delete-last-commit/


102
2018-03-04 17:25



Avant de répondre, ajoutons un peu de contexte, en expliquant ce que HEAD est.

First of all what is HEAD?

HEAD est simplement une référence à la validation actuelle (la plus récente) sur la branche en cours. Il ne peut y avoir qu'un seul HEAD à tout moment (à l'exclusion git worktree).

Le contenu de HEAD est stocké à l'intérieur .git/HEADet 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 une validation préalable dans l'histoire, il est appelé detached HEAD.

Enter image description here

Sur la ligne de commande, il ressemblera à ceci - SHA-1 au lieu du nom de la branche depuis le HEAD ne pointe pas sur la pointe de la branche courante:

Enter image description here


Quelques options sur la façon de récupérer à partir d'une tête détachée:


git checkout

git checkout <commit_id>
git checkout -b <new branch> <commit_id>
git checkout HEAD~X // x is the number of commits t go back

Cela va vérifier la nouvelle branche pointant vers la validation souhaitée. Cette commande va vérifier à un commit donné.

À ce stade, vous pouvez créer une branche et commencer à travailler à partir de ce point:

# Checkout a given commit.
# Doing so will result in a `detached HEAD` which mean that the `HEAD`
# is not pointing to the latest so you will need to checkout branch
# in order to be able to update the code.
git checkout <commit-id>

# Create a new branch forked to the given commit
git checkout -b <branch name>

git reflog

Vous pouvez toujours utiliser le reflog ainsi que. git reflog affichera tout changement qui a mis à jour le HEAD et en vérifiant l'entrée de reflog souhaitée va définir le HEAD Retour à ce commit.

Chaque fois que le HEAD est modifié, il y aura une nouvelle entrée dans le reflog

git reflog
git checkout HEAD@{...}

Cela vous ramènera à votre commit souhaité

Enter image description here


git reset HEAD --hard <commit_id>

"Déplacer" votre tête vers le commit souhaité.

# This will destroy any local modifications.
# Don't do it if you have uncommitted work you want to keep.
git reset --hard 0d1d7fc32

# Alternatively, if there's work to keep:
git stash
git reset --hard 0d1d7fc32
git stash pop
# This saves the modifications, then reapplies that patch after resetting.
# You could get merge conflicts, if you've modified things which were
# changed since the commit you reset to.
  • Remarque: (Depuis Git 2.7) vous pouvez également utiliser le git rebase --no-autostash ainsi que.

Ce schéma illustre quelle commande fait quoi. Comme vous pouvez le voir ici reset && checkout modifier le HEAD.

Enter image description here


101
2018-02-05 21:56



J'ai essayé de nombreuses façons de rétablir les changements locaux dans Git, et il semble que cela fonctionne le mieux si vous voulez juste revenir au dernier état de validation.

git add . && git checkout master -f

Brève description:

  • Il ne créera pas de commits comme git revert Est-ce que.
  • Il ne détachera pas votre tête comme git checkout <commithashcode> Est-ce que.
  • Il va remplacer toutes vos modifications locales et SUPPRIMER tous les fichiers ajoutés depuis la dernière validation dans la branche.
  • Cela fonctionne uniquement avec les noms de branches, vous pouvez donc revenir à la dernière validation dans la branche de cette façon.

J'ai trouvé un moyen beaucoup plus pratique et simple d'atteindre les résultats ci-dessus:

git add . && git reset --hard HEAD

où HEAD pointe vers le dernier commit de votre branche actuelle.

C'est le code que boulder_ruby a suggéré, mais j'ai ajouté git add . avant git reset --hard HEAD pour effacer tous les nouveaux fichiers créés depuis le dernier commit puisque c'est ce à quoi la plupart des gens s'attendent quand je reviens au dernier commit.


96
2017-07-29 11:01



Vous pouvez le faire par les deux commandes suivantes:

git reset --hard [previous Commit SHA id here]
git push origin [branch Name] -f

Cela supprimera votre précédent commit Git.

Si vous souhaitez conserver vos modifications, vous pouvez également utiliser:

git reset --soft [previous Commit SHA id here]

Ensuite, il va enregistrer vos modifications.


76
2017-12-12 06:52



Supposons que vous avez les validations suivantes dans un fichier texte nommé ~/commits-to-revert.txt (J'ai utilisé git log --pretty=oneline les attraper)

fe60adeba6436ed8f4cc5f5c0b20df7ac9d93219
0c27ecfdab3cbb08a448659aa61764ad80533a1b
f85007f35a23a7f29fa14b3b47c8b2ef3803d542
e9ec660ba9c06317888f901e3a5ad833d4963283
6a80768d44ccc2107ce410c4e28c7147b382cd8f
9cf6c21f5adfac3732c76c1194bbe6a330fb83e3
fff2336bf8690fbfb2b4890a96549dc58bf548a5
1f7082f3f52880cb49bc37c40531fc478823b4f5
e9b317d36a9d1db88bd34831a32de327244df36a
f6ea0e7208cf22fba17952fb162a01afb26de806
137a681351037a2204f088a8d8f0db6e1f9179ca

Créer un Frapper script shell pour inverser chacun d'eux:

#!/bin/bash
cd /path/to/working/copy
for i in `cat ~/commits-to-revert.txt`
do
    git revert $i --no-commit
done

Cela ramène tout à l'état précédent, y compris les créations et suppressions de fichiers et de répertoires, le valide dans votre branche et vous conserve l'historique, mais vous le ramenez à la même structure de fichier. Pourquoi Git n'a pas de git revert --to <hash> est au-delà de moi.


51
2017-10-13 21:51