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).
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
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í.
Hay un git plugin
que hace esto de la caja:
github.com/pendashteh/git-recover-index
$ cd /path/to/disatered/repo
$ git clone [email protected]:pendashteh/git-recover-index.git $HOME/.git-recover-index
$ $HOME/.git-recover-index/git-recover-index.sh
Prueba esto http://gitready.com/advanced/2009/01/17/restoring-lost-commits.html
Recibí un ataque al corazón por los cambios que perdí. Pero después de seguir esta publicación. Recuperé mis cambios
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 .