Maison  >  Article  >  Tutoriel système  >  Vous apprendre à récupérer des données dans git stash data

Vous apprendre à récupérer des données dans git stash data

PHPz
PHPzavant
2024-01-07 10:21:451143parcourir
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.
Créer une branche de test

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 :

教你找回 git stash 数据中的数据
Il ne comporte qu'un seul commit, le "Commit initial" :
教你找回 git stash 数据中的数据

La première version de ce fichier est :

教你找回 git stash 数据中的数据

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 :
教你找回 git stash 数据中的数据

Mauvais fonctionnement de git stash

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 :

教你找回 git stash 数据中的数据

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?

Récupérer les données git stash

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 :
教你找回 git stash 数据中的数据

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 :
教你找回 git stash 数据中的数据

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.

教你找回 git stash 数据中的数据

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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer