No es particularmente fácil: si ha perdido el puntero en la punta de una rama, es como encontrar una aguja en un pajar. Puede encontrar todas las confirmaciones que ya no parecen estar referenciadas, git fsck --unreachable
lo harán por usted, pero eso incluirá las confirmaciones que descartó después de una git commit --amend
confirmación anterior en las ramas que ha modificado, etc., así que ver todas estas confirmaciones a la vez es muy probable que haya demasiada información para pasar.
Entonces, la respuesta impertinente es: no pierdas el rastro de las cosas que te interesan. Más en serio, los reflogs mantendrán referencias a todos los commits que has usado durante los últimos 60 días más o menos de forma predeterminada. Más importante aún, darán un contexto sobre cuáles son esos compromisos .
commit --amend
orebase
y uno huérfano accidentalmente trabajando con un HEAD separado, por ejemplo.git commit --amend
etc. dejando compromisos sin salida, perdidos. Hice un poco de rebase y otras cosas y terminé con algunos commits a los que no se podía acceder desde ninguna rama, y me sentí un poco sucio dejándolos en el repositorio. Ahora el pensamiento ya no es tan inquietante. :)git fsck --unreachable
no proporciona eso. Solo lo intenté. El mejor enfoque es la--reflog
opción paragit log
, como respondió Kenorb . Lo que es especialmente bueno de esto es que, combinado con--graph
, obtienes un contexto visual fácil de analizar, muy similar al ilustrado en la pregunta original. Por ejemplo, intente:git log --graph --all --oneline --reflog
Tratar:
que enumera todas las confirmaciones de git pretendiendo que todos los objetos mencionados por reflogs (
git reflog
) se enumeran en la línea de comando como<commit>
.fuente
Cuando abordo este problema, uso el siguiente comando:
Esto me permite visualizar confirmaciones recientes que se han vuelto sin cabeza.
Tengo esto envuelto en un asistente de script llamado
~/bin/git-reflog-gitk
.fuente
when the tips of branches and other references were updated in the *local repository*
. Es posible que desee utilizargit log --reflog
si desea hacer esto para cambios de referencia no localesLo que me salvó la vida fue el siguiente comando:
Allí encontrarás una pantalla con confirmaciones de historial hechas para git como esta:
En este punto, solo tiene que encontrar lo
HEAD@{X}
que necesita, crear una rama temporal y pasar a ella de esta manera:De esa manera, tendrá una rama temporal con su confirmación perdida sin rebajar ni romper aún más su repositorio git.
Espero que esto ayude...
fuente
Me gusta la respuesta de @Kieran, pero para la consola:
git log --oneline --all --graph --decorate $(git reflog | awk '{print $1}')
fuente
git log --all
. Un ejemplo rápido: después de unagit reset --hard @^
confirmación HEAD @ {0} solo estará en el registro, y dado quegit reflog
no es compatible--graph
, debe pasar las confirmacionesgit log --graph
para obtener una representación visual.--reflog
lugar de$(git reflog | awk '{print $1}')
git log --oneline --all --graph --decorate $(git reflog | awk '{print $1}')
congit log --oneline --all --graph --decorate --reflog
, son casi idénticos, excepto que el registro incluye detalles como entradas WIP.reflog
¿ por qué no usarlog --reflog
en su lugar?¿Cómo resuelvo este problema? Uso
git fsck
y registro!Primero cree un archivo que contenga confirmaciones y blobs perdidos (inalcanzables). (NOTA: si hiciste algo así,
git gc
entonces recolectará basura todos los compromisos y ¡no los encontrarás aquí!)Eso te da un archivo como este:
Luego puede abrir este archivo con su editor de texto favorito para copiar los hash de confirmación / blog desde allí. (* tos * vim macros funciona muy bien para esto * tos *)
Ahora puede volver a iniciar sesión desde este commit con algo como
git log --oneline <commit hash>
. Alternativamente, gitk, tig o cualquier otro visor de git deberían funcionar.En su caso, si encuentra el hash para commit F, el registro le mostrará algo como esto,
¡Rapido y Facil! Ahora puede encontrar el contexto detrás de todas esas confirmaciones pendientes.
PD Sí, lo sé, publicación tardía, pero bueno, alguien podría encontrarlo aquí y encontrarlo útil. (Lo más probable es que yo en 6 meses cuando vuelva a googlear esto)
fuente
Tuve suerte recuperando el commit mirando el reflog, que estaba ubicado en
.git/logs/HEAD
Luego tuve que desplazarme hasta el final del archivo , y encontré la confirmación que acabo de perder.
fuente
A
git log
veces no es bueno obtener todos los detalles de las confirmaciones, así que para ver esto ...Para Mac: entre en su proyecto git y escriba:
para verlos a todos los comprometidos en eso, o:
para ver a todos ustedes se compromete en eso,
entonces puedes editar en cualquiera de tus navegadores favoritos.
fuente
@bsimmons
Luego crea una rama para cada uno:
Ahora, muchas herramientas le mostrarán una visualización gráfica de esas confirmaciones perdidas.
fuente
Si utiliza la GUI de Git Extensions, puede mostrarle una visualización gráfica de las confirmaciones colgantes si marca "Ver -> Mostrar referencias de reflog". Esto mostrará confirmaciones colgantes en el árbol, al igual que todas las demás referencias. De esta manera, es mucho más fácil encontrar lo que está buscando.
Ver esta imagen para demostración. Los commits C2, C3, C4 y C5 en la imagen están colgando pero aún son visibles.
fuente
¡me salvó! ¡Perdí mi fusión de HEAD y no pude encontrar mis últimos compromisos! No se muestra en el árbol de origen pero
git log --reflog
muestra todas mis confirmaciones localesfuente