Git rama maestra corrupta


9

Abro mi repositorio de Git usando gitExtensions en Windows 7 para un proyecto de Visual Studio. De repente está vacío. El repositorio existe, pero todos mis commits han desaparecido.

Estoy usando la interfaz gráfica y creo que es la primera vez que la abro desde que la actualizaron.

No estoy seguro de qué hacer para recuperar mis confirmaciones.

Cuando escribo

git log 

Recibo

fatal: mala revisión predeterminada 'HEAD'

Actualización
Después de mirar /programming/1545407/recovering-broken-git-repository probé

git fsck

volvió:

error: HEAD no válido
fatal: objeto suelto 36b7d9e1ca496bcb864c0b9c8671fcec97fbda31 (almacenado en .git / obj ects / 36 / b7d9e1ca496bcb864c0b9c8671fcec97fbda31) está dañado

Compromiso de devoluciones:

error: no se puede resolver la referencia HEAD: No existe tal archivo o directorio
fatal: no se puede bloquear la referencia HEAD

y registrando devoluciones de rama maestra

Advertencia de $ git log master: ignorando las referencias de referencia / cabezas / master rotas. advertencia: ignorando las referencias de referencia / cabezas / master rotas. fatal: argumento ambiguo 'maestro': revisión desconocida o ruta no en el árbol de trabajo. Use '-' para separar las rutas de las revisiones

Seguiré pegando cosas que podrían ser relevantes

Advertencia de $ git reflog master
: ignorando las referencias de referencia / cabezas / master rotas.
advertencia: ignorando las referencias de referencia / cabezas / master rotas.
fatal: argumento ambiguo 'maestro': revisión desconocida o ruta no en el árbol de trabajo.
Use '-' para separar las rutas de las revisiones

Más información posiblemente útil: cada vez que borro el archivo corrupto, otro ocupa su lugar. Estoy empezando a pensar que tiene algo que ver con la rama maestra que señala la cosa incorrecta o algo. porque supongo que la cabeza está apuntando al maestro.

Un día después:
así que puse a mi compañero en esto, pudo revisar los registros y dijo que los hash en los registros no coinciden con los objetos en la carpeta. Intentó restablecer la rama maestra a los registros o algo así, me perdí un poco. Espero que sea útil



1
@heavyd, compruebe la actualización
MrJD,

Respuestas:


3

El repositorio existe, pero todos mis commits han desaparecido.

Qué quieres decir exactamente? ¿El árbol de trabajo sigue ahí? ¿Existe .git/? ¿Hay algún archivo en él?

Los mensajes que publicó sugieren que el archivo .git/HEADno existe. Define el estado esperado del árbol de trabajo (lo que había extraído). Si ese archivo se ha ido, git no sabe dónde estabas.

Puede intentar crear el archivo usted mismo, con este contenido: ref: refs/heads/master

Si estaba en una rama diferente, simplemente reemplace "maestro" con el nombre de la rama. Si no estuvieras en una rama, sería más complicado.

.git/logs/HEADregistra estados pasados ​​de HEAD, con líneas posteriores en la parte inferior. Esta línea de ejemplo muestra un pago: 25f2a6099fb5f9f2192a510c42f704f9fc4bcecb 65abb1a3dc102e2498860f01fb179cda4c51decb Rainer Blome <rainer.blome@wherever.you.are.com> 1346938344 +0200 checkout: moving from master to MySuperBranch

Los SHA1 en frente se refieren a commits. Debería poder encontrarlos en el registro de la rama, por ejemplo .git/logs/refs/heads/master.

Parece que también falta la salida de git reflog que proporcionó refs/heads/master. Se supone que su único contenido es el SHA1 de la última confirmación (y una nueva línea). Puede encontrar el último SHA1 al final del registro de sucursal, por ejemplo .git/logs/refs/heads/master.


2

Si existe .git / HEAD y su contenido se ref: refs/heads/masterverifica en el archivo refs / heads / master, debe contener el sha1 del último commit.

Si ese archivo estaba dañado y estaba lleno de caracteres NULL Edite ese archivo y coloque el sha1 del último commit .git/logs/HEADo el anterior al último commit.

Entonces hazlo git reset --hard 'sha1 of the commit that you selected'


De hecho, estaba lleno de caracteres NULL, así que puse el sha1 del commit anterior, pero luego el reinicio de git resultó en "error: update_ref falló para ref 'HEAD': no ​​se puede bloquear la referencia 'HEAD': no ​​se puede resolver la referencia HEAD: argumento no válido "
fantástico

1

Parece que su repositorio ha sido dañado. Lo más fácil sería recuperar su repositorio de una copia de seguridad o volver a clonar el repositorio de la fuente original (suponiendo que no tuviera toneladas de trabajo en el repositorio).

Si la opción de reiniciar / clonar no es una opción, recomendaría leer Pro Git (libro en línea gratuito o la versión en papel ) Todo el libro es muy informativo, pero especialmente eche un vistazo al último capítulo para comprender cómo funciona Git internamente. Una vez que comprenda cómo funciona Git, eche un vistazo a las instrucciones de Linus sobre la recuperación de objetos corruptos .


Entonces, lamentablemente no estaba haciendo una copia de seguridad de los archivos ocultos, .git estaba oculto. Realmente no tengo tiempo suficiente para leer un libro completo, ¿hay algo que creas que podría intentar?
MrJD

"Leer un libro sobre los aspectos internos" puede ser un buen consejo general, pero no ayuda a abordar el problema específico y la pregunta en cuestión.
Burhan Ali

0

Después de navegar por la web por un tiempo, finalmente encontré esto y funcionó.

git fetch origin
git reset --hard origin/master

Eso tiene algún cambio origin(con suerte no demasiado trabajo realizado localmente), y luego obliga a la mastersucursal local a estar de acuerdo con el control remoto. ¡Cuidado, --resetsignifica descartar cualquier cambio local! Además, si no estuviera demasiado roto, simplemente git reset origin/masterhabría restaurado el último estado conocido (registrado) de la masterrama.
vonbrand
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.