Mi repositorio de git de alguna manera se ha vuelto inestable: cargué msysgit esta mañana y en lugar de que el nombre de la rama se muestre después del directorio actual, dice "((ref: re ...))", 'git status' informa todo como un nuevo archivo, 'git log' y 'git reflog' me dicen "fatal: mala revisión predeterminada 'HEAD'", y así sucesivamente.
Hacer 'git reflog --all' o 'gitk --all' me muestra que el resto del repositorio está intacto, pero parece que la rama en la que estaba trabajando acaba de desaparecer, lo que explica por qué HEAD no parece existir / señalar cualquier cosa.
Sé que git mantiene todo tipo de información, y supongo que mis confirmaciones se han quedado huérfanas de alguna manera, así que ¿hay algún comando que me muestre esas confirmaciones para que pueda restablecer HEAD en ellas?
EDITAR: Oh cielos. Descubrí 'git fsck' y 'git fsck --full' informa "fatal: object 03ca4 ... is corrupted". ¿Qué diablos puedo hacer al respecto?
EDITAR: Oh, Dios mío, Dios mío. Revisé otra rama, luego intenté volver a crear la rama original con el mismo nombre usando 'git checkout -b lostbranchname', y git dice "error: no se pueden resolver las referencias de referencia / heads / lostbranchname: Sin error, fatal: Failed para bloquear ref para actualización: No hay error ". 'Sin error' debe ser un error particularmente desagradable. Entonces parece que todavía está dando vueltas, pero no se puede usar y no se puede matar.
EDITAR: Super duper oh cielos. He desempacado, reempacado y reemplazado cosas como se sugiere aquí: ¿Cómo recuperar objetos Git dañados por fallas en el disco duro? , pero ahora recibo otro hash informado como corrupto, por algo tan inocuo como 'git status'. Creo que todo está regado. Git es encantador y todo eso, pero no debería tener que lidiar con este tipo de cosas.
git checkout -b lostbranchname
: si solo le importa el nombre de la rama (no el contenido de la misma), puede eliminarla manualmente (o cambiarle el nombre).git/refs/heads/lostbranchname
, es de esperar que funcione.Respuestas:
En lugar de dejar esto abierto, creo que daré una respuesta a mi propia pregunta. Usar
git reflog --all
es una buena manera de buscar confirmaciones huérfanas, y usar los hashes SHA1 de eso puede reconstruir el historial.En mi caso, sin embargo, el repositorio estaba dañado, así que esto no ayudó;
git fsck
puede ayudarlo a encontrar y, a veces, corregir errores en el repositorio.fuente
[alias] orphank = !gitk --all --date-order ``git reflog | cut -c1-7``&
(editar: imagina esas comillas dobles donde las simples; el escape no parece funcionar aquí)Con git 2.9.x / 2.10 (Q3 2016), no tendrás que usar
git reflog --all
más,git reflog
será suficiente.Véase el compromiso 71abeb7 (3 de junio de 2016) de SZEDER Gábor (
szeder
) .(Combinado por Junio C Hamano -
gitster
- en el compromiso 7949837 , 06 de julio de 2016)fuente
Una buena característica de git es que detecta corrupción. Sin embargo, no incluye corrección de errores para protegerse de la corrupción.
Espero que haya enviado el contenido de este repositorio a otra máquina o que tenga copias de seguridad para recuperar las partes dañadas.
No tengo ninguna experiencia con git en Windows, pero nunca he visto este tipo de comportamiento con git en Linux o OS X.
fuente
Normalmente encuentro el
git reflog
resultado confuso. Es mucho más fácil para mí entender un gráfico de confirmación degit log --graph --reflog
. Anular el formato para mostrar solo resúmenes de confirmación también puede hacer que el gráfico sea más fácil de seguir:A partir de eso, está claro que
e3124bf
y6a7a52e
son huérfanos sin referencia, y hay contexto de las confirmaciones de sus ancestros.fuente
git reflog --all
no las muestra,git log --graph --reflog
y eran muy visibles ...