Solución:
Según las respuestas anteriores, aquí hay una secuencia simple:
Abra una ventana de terminal y cd en una carpeta debajo del repositorio. Luego:
git fsck | awk '{print $3}' > tmp.txt
cat tmp.txt | xargs git show > tmp2.txt
Ahora abierto tmp2.txt en el editor, localice su código perdido y busque el ID de compromiso en lo alto de ello. Luego aplica el código:
git stash apply <commit id>
rm tmp.txt tmp2.txt
¡Esto me salvó la vida! Realmente agradezco a todos los que respondieron a esta pregunta. Bendigo al creador de git Linus Torvalds para mantener las cosas eliminadas en la base de datos de git. ¡¡Genio!!
El alijo se guarda internamente como un compromiso de fusión al que se hace referencia en una lista de alijo.
git fsck
puede encontrar objetos colgantes. No solo encontrará su alijo eliminado, sino probablemente otras cosas también … por lo que querrá buscar confirmaciones que parezcan que podrían ser su alijo (git show <ID>
para mostrar información relevante sobre un objeto y decidir si es el que está buscando).
Una vez que tenga eso, todo lo que necesita hacer es volver a insertarlo en la lista de escondites. La lista se almacena en .git/logs/refs/stash
y una línea tiene el siguiente formato:
<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>
Aquí hay un ejemplo de trabajo:
16b9a2d400dafe7ea25592029e3e5582d025c7d8 5def7605dfe625e8b3a3152fe52a87cc36694b6a Jan Krüger <[email protected]> 1374227992 +0200 WIP on master: 0dbd812 Update draft release notes to 1.8.4
Simplemente sintetice una línea para el alijo que desea volver a insertar (el nombre / correo / marca de tiempo / descripción no tener para ser precisos) y debería poder utilizarlo normalmente de nuevo.
¡Feliz cacería!
Como dice la respuesta anterior, puede usar git fsck
para enumerar los objetos a los que no hace referencia nada que incluya su alijo eliminado. Pero, es posible utilizar git show
para filtrar esa lista de objetos para mostrar solo alijos como:
git fsck 2> /dev/null |
awk '/commit/{print $3}' |
git show --stdin --merges --grep '^WIP on'
Si sabe cuándo se creó el alijo, también puede agregar un argumento como
--since '2 days ago'
a la línea final para limitar aún más la salida. Con suerte, eso reducirá la lista a un tamaño manejable.
Una vez que haya encontrado el alijo correcto, anote su ID de confirmación y podrá usar
git stash apply COMMITID
para aplicarlo como si no hubiera sido eliminado.