web-dev-qa-db-fra.com

Récupérer la cachette supprimée dans Git en utilisant SourceTree

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?

49
tusharmath

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!

47
Jan Krüger

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!!

70
ishahak

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é.

21
qqx

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.

9
Roddy T.

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>
4
hcknl

Il s'agit de la solution de contournement la plus propre pour récupérer le stash supprimé.

  1. git fsck --lost-found

  2. ls -1 .git/lost-found/commit/ | xargs -n 1 git log -n 1 --pretty=oneline

  3. git stash apply [tag]

enter image description here

Remplacez [tag] par l'id, ex:

git stash apply 40e47250d0b4fb6143be67c115b708be126e79d3

4
Tengku Fathullah

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]
2
Rados
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#}
1
Ankur Jain