stash recuperar rama por estado eliminados eliminada devolver descargar como borrado archivos archivo anterior git version-control

recuperar - Recuperando el archivo agregado después de hacer el reinicio de git--hard HEAD ^



recuperar stash borrado (5)

(Supongo que el archivo que falta no forma parte de ninguna confirmación. De lo contrario, git log --all -g --diff-filter=D --stat es tu amigo).

  1. Obtenga la lista de archivos inalcanzables que git conoce un nombre de archivo:

    git fsck --unreachable --no-reflogs --no-cache HEAD | fgrep " tree " / | cut -d " " -f3 | xargs -r -n1 git ls-tree / | fgrep " blob " | cut -d " " -f 3- | sort -k2 -u

  2. Si ve algo interesante, git cat-file blob SHA-1-of-interesting-file dará salida al archivo a salida estándar. (Ejemplo: git cat-file blob b8f0bdf56 > recovered-logo.png )

Desafortunadamente, si el archivo que falta no es parte de la confirmación, git no tiene una marca de tiempo y, como tal, no puede imprimir varias versiones de archivos ordenados por tiempo.

Si el archivo que falta nunca se ha organizado ( git stage o git add ) o escondido ( git stash ), no estás de suerte porque, en lo que se refiere a git, el archivo nunca existió. (Todavía puedes intentar hacer un git fsck --no-reflogs --lost-found y buscar en el directorio .git/lost-found/other para ver si tienes algo que valga la pena guardar en caso de que git tenga una copia de tu git fsck --no-reflogs --lost-found perdido archivo por algún accidente afortunado. No tiene nombres de archivo para ayudarlo en este caso, solo contenido de archivos).

En caso de que haya perdido algunas confirmaciones (en lugar de solo archivos), es probable que desee ejecutar algo como esto:

gitk --all $( git fsck | awk ''/dangling commit/ {print $3}''; git log -g --pretty=''format:%H'' )

Eso ejecutará gitk con todas las ramas, todo el reflog y todos los commits pendientes. Es posible que desee agregar -n 10000 o algún otro límite en caso de que su repositorio realmente tenga muchas confirmaciones (por ejemplo, kernel de Linux). Si no tiene gitk , puede ejecutar una versión menor utilizando solo la línea de comandos de esta manera:

git log --all --decorate --stat --graph --date-order $( git fsck | awk ''/dangling commit/ {print $3}''; git log -g --pretty=''format:%H'' )

o una versión con menos salida detallada

git log --all --decorate --oneline --graph --date-order $( git fsck | awk ''/dangling commit/ {print $3}''; git log -g --pretty=''format:%H'' )

Agregué un nuevo archivo F1 e hice cambios a otro archivo F2 pero luego hice un "reinicio de git --hard HEAD ^" y perdí todos los cambios en los archivos.

¿Hay ALGUNA manera, puedo recuperarlos?

Miré una pregunta relacionada aquí: ¿Cómo puedo deshacer el reinicio de git --hard HEAD ~ 1? pero, esa pregunta supone que uno ha hecho un commit Git.


En realidad, si ha agregado el objeto al índice (usando git add), se crea un blob para ese estado del objeto, pero no hay ningún objeto de árbol (y por lo tanto, de confirmación) que se refiera a él. Así es como uno obtiene un archivo de objetos sueltos ''colgantes'', y si ejecuta git fsck, le mostrará el blob no referenciado (git gc eliminará estos tipos de objetos si se ejecuta).

Debido a esto, puede usar el reflog, si lo tiene habilitado, para tratar de restaurar el estado del índice para su archivo F1 que se ha agregado. Si no ha agregado F2 en absoluto, entonces, como dijo Greg, git no sabe nada al respecto y no tiene suerte allí.




Puedes (con algo de trabajo) recuperar el estado del archivo en el último "git add <file> ". Puedes usar

$ git fsck --cache --no-reflogs --lost-found --unreachable HEAD

y luego examine los archivos en el directorio ''.git / lost-found / other''.

Por favor, lea la página de manual de git fsck .