J'utilise l'arbre source. J'avais créé une réserve de plusieurs modifications et je l'ai supprimé par erreur. Existe-t-il un moyen de les récupérer?
Le stash est enregistré en interne en tant que validation de fusion référencée à partir d'une liste de stashes.
git fsck
peut trouver des objets pendants. Il ne trouvera pas seulement votre cachette supprimée, mais probablement d'autres choses aussi ... donc vous voudrez chercher des commits qui ressemblent à votre cachette (git show <ID>
pour afficher des informations pertinentes sur un objet et décider s'il s'agit de celui que vous recherchez).
Une fois que vous avez cela, tout ce que vous avez à faire est de le réinsérer dans la liste des cachettes. La liste est stockée dans .git/logs/refs/stash
et une ligne a le format suivant:
<ID of previous stash commit in list or 0000000000000000000000000000000000000000 if none> <ID of merge commit> Your Name <[email protected]> <UNIX timestamp> <time zone, e.g. +0000><TAB char><description of stash>
Voici un exemple de travail:
16b9a2d400dafe7ea25592029e3e5582d025c7d8 5def7605dfe625e8b3a3152fe52a87cc36694b6a Jan Krüger <email.censored@invalid> 1374227992 +0200 WIP on master: 0dbd812 Update draft release notes to 1.8.4
Il vous suffit de synthétiser une ligne pour la cachette que vous souhaitez réinsérer (le nom/mail/horodatage/description ne avoir pour être précis) et vous devriez pouvoir l'utiliser à nouveau normalement.
Bonne chasse!
Sur la base des réponses ci-dessus, voici une séquence simple:
Ouvrez une fenêtre de terminal et cd dans un dossier sous le référentiel. Alors:
git fsck | awk '{print $3}' > tmp.txt
cat tmp.txt | xargs git show > tmp2.txt
Maintenant, ouvrez tmp2.txt dans l'éditeur, localisez votre code perdu et trouvez commit-id en plus. Appliquez ensuite le code:
git stash apply <commit id>
rm tmp.txt tmp2.txt
Cela m'a sauvé la vie! Je remercie vraiment tous ceux qui ont répondu à cette question. Je bénis le créateur de git Linus Torvalds pour avoir conservé les éléments supprimés dans la base de données git. Génie!!
Comme dans les réponses précédentes, vous pouvez utiliser git fsck
pour lister les objets qui ne sont référencés par rien qui inclurait votre cachette supprimée. Mais, il est possible d'utiliser git show
pour filtrer cette liste d'objets pour n'afficher que les stashes comme:
git fsck 2> /dev/null |
awk '/commit/{print $3}' |
git show --stdin --merges --grep '^WIP on'
Si vous savez quand la cachette a été créée, vous pouvez également ajouter un argument comme --since '2 days ago'
à la dernière ligne pour limiter davantage la sortie. Espérons que cela réduira la liste à une taille gérable.
Une fois que vous avez trouvé la bonne cachette, notez son ID de validation et vous pouvez utiliser git stash apply COMMITID
pour l'appliquer comme s'il n'avait pas été supprimé.
Comme Jan Krüger le déclare ci-dessus, git fsck
est la voie à suivre. Cependant, si vous vous trouvez incapable (pour une raison quelconque) de synthétiser avec succès une ligne dans votre fichier de dissimulation et de faire apparaître la dissimulation dans la liste disponible, vous pouvez utiliser git stash apply <guid>
directement, sans ajouter de ligne. Cela appliquera immédiatement (pas valider) les modifications de fichier (s) à votre branche actuelle.
Une autre solution est:
git fsck 2>&1 | awk '/dangling commit/{print $3 "^!"}' | xargs git log
trouver l'auteur et valider les informations (date, hachage, auteur etc.)
git stash store <hash-id-of-specific-commit>
Il peut être utile d'utiliser des commentaires lors du stockage, en utilisant:
git stash save "comment"
Cela m'a évité des problèmes pour trouver la cachette déjà supprimée en utilisant ce qui suit:
git fsck --lost-found
ls -1 .git/lost-found/commit/ | xargs -n 1 git log -n 1 --pretty=oneline
git stash apply [tag]
for i in $(git fsck 2>|/dev/null | grep commit | cut -d' ' -f3); do git --no-pager log -1 $i; echo "-------------------------"; done | less
Recherchez ensuite l'ID de validation #.
et fait
git stash apply {commit#}