2011-01-24 24 views
59

Digamos que tengo un gráfico como este:Lista de todas las confirmaciones de git?

A---B---C---D (master) 
    \ 
     \-E---F (HEAD) 

Si hago git log --all --oneline, voy a conseguir los seis de mis confirmaciones.

Pero si la gráfica es

A---B---C---D (master, HEAD) 
    \ 
     \-E---F 

No veré E y F. ¿Puedo obtener git me diga todas las confirmaciones, incluidas las de las ramas que no se nombran?

Gracias

Respuesta

35

No especialmente fácilmente- si ha perdido el puntero a la punta de una rama, que es algo así como encontrar una aguja en un pajar. Puede encontrar todas las confirmaciones que ya no se mencionan más, git fsck --unreachable hará esto por usted, pero eso incluirá confirmaciones que arrojó después de git commit --amend, confirmaciones antiguas en las sucursales que reordenó, etc. etc. Así que ver todo estos compromisos a la vez es muy probable que sea demasiada información para pasar.

Así que la respuesta frípata es, no perder el rastro de las cosas que le interesan. Más en serio, los reflogs mantendrán referencias a todas las confirmaciones que haya usado durante los últimos 60 días de forma predeterminada. Lo que es más importante, darán un contexto acerca de lo que esos commits son.

+5

+1: No hay absolutamente ninguna diferencia entre un commit deliberadamente huérfano por 'commit --amend' o' rebase' y uno huérfano accidentalmente al trabajar con un HEAD separado, digamos. – Cascabel

+3

de hecho. probablemente la forma más fácil de recuperarse de esa situación será mirar el reflog para HEAD. – araqnid

+0

Gracias, esto ayuda. Incluso la respuesta frívola :) +1 – Amadan

3

que he tenido la suerte recuperar el commit mirando el reflog, que se encuentra en .git/logs/HEAD

luego tuve que Enrolle abajo al final del archivo, y me encontré con la confirmación acabo de perder .

3

Nos pondremos git log veces no es bueno para obtener todas las confirmaciones detalle, por lo que para ver esta ...

Para Mac: Obtener en imbécil proyecto y tipo:

$ nano .git/logs/HEAD 

para ver que todas las confirmaciones de que, o bien:

$ gedit .git/logs/HEAD 

que permite ver todos los envíos en el que,

luego puede editar en cualquiera de su navegador favorito.

32

Cuando abordo este tema utilizo el siguiente comando:

git reflog | awk '{ print $1 }' | xargs gitk 

Esto me permite visualizar commits recientes que se han hecho sin cabeza.

Tengo esto envuelto en un asistente de script llamado ~/bin/git-reflog-gitk.

4

¿Cómo resuelvo este problema? Use git fsck y logging!

Primero cree un archivo que contenga confirmaciones y blobs perdidos (inalcanzables). (NOTA: si hiciste algo como git gc, ¡la basura recogerá todas sus confirmaciones y no las encontrarás aquí!)

$git fsck --lost-found > lost_found.commits 

Eso le da un archivo de la siguiente manera:

colgando cometer dec2c5e72a81ef06963397a49c4b068540fc0dc3
colgando burbuja f8c2579e6cbfe022f08345fa7553feb08d60a975
colgando burbuja 0eb3e86dc112332ceadf9bc826c49bd371acc194
colgando burbuja 11cbd8eba79e01f4fd7f496b1750953146a09502
colgando cometer 18733e44097d2c7a800650cea442febc5344f9b3
colgando burbuja 1e53a5cdb3ecdde27081ec6e8b31e4070106ee05

A continuación, puede abrir este archivo con usted editor de texto favorito para copiar los hashes de cometer/blog desde allí. (* tos * macros vim funciona muy bien para esto * tos *)

ya se puede volver a iniciar sesión desde esta comprometerse con algo como git log --oneline <commit hash>. Alternativamente, gitk, tig o cualquier otro visor de git debería funcionar.

En su caso si se encuentra el hash para cometer F el registro le mostrará algo como esto,

A---B---E---F 

rápida y fácil! Ahora puedes encontrar el contexto detrás de todos esos compromisos pendientes.

P.S. Sí, lo sé, publicación tardía, pero bueno, alguien podría encontrarla aquí y encontrarla útil. (Principalmente me probable en 6 meses cuando Google La otra vez)

16

Como @Kieran 's respuesta, pero para la consola: git log --oneline --all --graph --decorate $(git reflog | awk '{print $1}')

+0

¿Necesita incluir la última parte: $ (git reflog | awk '{print $ 1}')? ¿Qué hace esto? Después de probar su solución, parece que produce el mismo resultado incluso sin esa última parte. – wmock

+0

Si mueve el puntero de sucursal y deja algunas confirmaciones sin una referencia (como lo hizo OP), ya no aparecerán en 'git log --all'. Un rápido ejemplo: después de un 'git reset --hard @ ^' su confirmación HEAD @ {0} solo estará en el reflog, y como 'git reflog' no admite' -graph', debe pasar los commits a 'git log -graph' para obtener una representación visual. –

+2

puede usar '' '--reflog''' en lugar de' '' $ (git reflog | awk '{print $ 1}') '' ' – Sild

21

Probar:

git log --reflog 

que enumera todos git compromete a través de simulando que todos los objetos mencionados por reflogs (git reflog) se enumeran en la línea de comando como <commit>.

1

@bsimmons

git fsck --lost-found | grep commit 

a continuación, crear una rama para cada uno:

$ git fsck --lost-found | grep commit 
Checking object directories: 100% (256/256), done. 
dangling commit 2806a32af04d1bbd7803fb899071fcf247a2b9b0 
dangling commit 6d0e49efd0c1a4b5bea1235c6286f0b64c4c8de1 
dangling commit 91ca9b2482a96b20dc31d2af4818d69606a229d4 

$ git branch branch_2806a3 2806a3 
$ git branch branch_6d0e49 6d0e49 
$ git branch branch_91ca9b 91ca9b 

Ahora muchas herramientas le mostrará una visualización gráfica de esas confirmaciones perdidos.

Cuestiones relacionadas