Maison > Article > Tutoriel système > Vous apprendre à récupérer des données dans git stash data
Présentation | En raison de commandes git incorrectes, il a supprimé les modifications enregistrées dans la cachette. Après ce triste épisode nous avons essayé de trouver un moyen de restaurer le travail qu'il avait réalisé et nous l'avons fait ! Tout d'abord, un mot d'avertissement : lorsque vous implémentez une fonctionnalité volumineuse, divisez-la en petits morceaux et validez-les régulièrement. Travailler pendant de longues périodes sans s’engager n’est pas une bonne habitude. Montrons comment récupérer les modifications supprimées accidentellement du cache. |
Dans le référentiel que j'ai utilisé comme exemple, il n'y a qu'un seul fichier source "main.c", comme indiqué ci-dessous :
Il ne comporte qu'un seul commit, le "Commit initial" :
La première version de ce fichier est :
Je vais écrire du code dans le fichier. Pour cet exemple, je n'ai pas besoin de faire de gros changements, j'ai juste besoin de quelque chose à mettre en réserve, nous allons donc simplement ajouter une ligne. Le résultat de « git diff » est le suivant :
Maintenant, disons que je souhaite extraire de nouvelles modifications du référentiel distant, sans encore valider mes propres modifications. J'ai donc décidé de le cacher d'abord, d'attendre que les modifications dans l'entrepôt distant soient extraites, puis de rétablir mes modifications dans la branche principale. J'ai exécuté la commande suivante pour déplacer mes modifications dans le cache :
git stash
Utilisez la commande "git stash list" pour afficher le cache et vous pourrez voir mes modifications ici :
Mon code est déjà dans un endroit sûr et la branche master est actuellement propre (vérifiez avec la commande git status). Il ne me reste plus qu'à extraire les modifications du référentiel distant et à rétablir mes modifications dans la branche principale, ce que je dois faire.
Mais j'ai mal exécuté la commande :
git stash drop
Il a supprimé la cachette au lieu d'exécuter la commande suivante :
stash pop
Cette commande appliquera le cache avant de le supprimer de la pile. Si j'exécute à nouveau la commande git stash list
, je peux voir que j'ai supprimé les modifications sans les restaurer de la pile vers la branche principale. OH MON DIEU! Que faire ensuite?
La bonne nouvelle est que git n'a pas supprimé l'objet contenant mes modifications, il a simplement supprimé la référence à celui-ci. Pour démontrer cela, j'utilise la commande git fsck, qui vérifie la connexion et la validité des objets dans la base de données. Voici le résultat après avoir exécuté git fsck sur le référentiel :
J'ai fait en sorte que git-fsck affiche tous les objets inaccessibles grâce au paramètre --unreachable. Comme vous pouvez le voir, cela montre qu’il n’y a aucun objet inaccessible. Et lorsque j'ai supprimé mes modifications du cache et exécuté à nouveau la même commande, j'ai obtenu un résultat différent :
Il y a désormais trois objets inaccessibles. Alors, lequel est mon changement ? En fait, je ne sais pas. Je dois rechercher chaque objet en exécutant la commande git show.
C'est tout ! Le numéro d'identification 95ccbd927ad4cd413ee2a28014c81454f4ede82c correspond à mon changement. Maintenant que j'ai trouvé les modifications manquantes, je peux le restaurer. Une solution consiste à prendre cet identifiant et à le placer dans une nouvelle branche, ou à le valider directement. Une fois que vous avez le numéro d'identification de votre objet de modification, vous pouvez décider de la meilleure façon de rétablir la modification dans la branche principale. Pour cet exemple, j'ai utilisé git stash pour annuler les modifications apportées à ma branche principale.
git stash apply 95ccbd927ad4cd413ee2a28014c81454f4ede82c
Une autre chose importante à retenir est que git exécutera périodiquement son programme de récupération de place (gc) Une fois exécuté, vous ne pourrez plus voir les objets inaccessibles en utilisant git fsck.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!