2011-01-24 21 views
59

Diciamo che ho un grafico come questo:Elenco di tutti i commit git?

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

Se lo faccio git log --all --oneline, mi metterò tutti e sei i miei commit.

Ma se il grafico è

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

non vedrò E ed F. Posso ottenere git a dirmi tutti i commit, compresi quelli su rami che non sono chiamati?

Grazie

risposta

35

Non particolarmente facilmente- se hai perso il puntatore al punta di un ramo, è un po 'come trovare un ago in un pagliaio. Puoi trovare tutti i commit che non sembrano essere più referenziati- git fsck --unreachable lo faranno per te- ma che includeranno i commit che hai buttato via dopo un git commit --amend, i vecchi commit sui rami che hai ribadito ecc ecc Quindi vedendo tutto questi si impegna subito molto probabilmente troppe informazioni per guadare.

Quindi la risposta irrispettosa è, non perdere di vista le cose che ti interessano. Più seriamente, i reflog manterranno i riferimenti a tutti i commit che hai usato negli ultimi 60 giorni circa di default. Ancora più importante, forniranno un contesto su ciò che tali commit sono.

+5

+1: Non c'è assolutamente alcuna differenza tra un commit deliberatamente reso orfano da 'commit --amend' o' rebase' e ​​uno accidentalmente reso orfano lavorando con un HEAD distaccato, per esempio. – Cascabel

+3

davvero. probabilmente il modo più semplice per recuperare da quella situazione sarà guardare il reflog per HEAD stesso. – araqnid

+0

Grazie, questo aiuta. Anche la risposta irriverente :) +1 – Amadan

3

Ho avuto la fortuna recuperando il commit, cercando al reflog, che si trovava a .git/logs/HEAD

poi ho dovuto Scoll giù alla fine del file, e ho trovato l'impegno Ho appena perso .

3

ti git log volte non è buono per ottenere tutti i commit dettaglio, quindi per visualizzare questo ...

per Mac: in voi git progetto e tipo:

$ nano .git/logs/HEAD 

per visualizzare voi tutti i commit in quanto, o:

$ gedit .git/logs/HEAD 

a vista che tutti i commit in quanto,

quindi puoi modificare in uno qualsiasi dei tuoi browser preferiti.

32

Quando ho affrontare questo problema io uso il seguente comando:

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

Questo mi permette di visualizzo commit recenti che sono diventati senza testa.

Ho questo avvolto in un helper di script chiamato ~/bin/git-reflog-gitk.

4

Come posso risolvere questo problema? Utilizzare git fsck e accedere!

Per prima cosa creare un file contenente commit e blob persi (non raggiungibili). (NOTA: se hai fatto qualcosa come git gc allora raccoglierà tutti i commit e non li troverai qui!)

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

Che ti dà un file in questo modo:

penzoloni commettere dec2c5e72a81ef06963397a49c4b068540fc0dc3
penzoloni blob f8c2579e6cbfe022f08345fa7553feb08d60a975
penzoloni blob 0eb3e86dc112332ceadf9bc826c49bd371acc194
penzoloni blob 11cbd8eba79e01f4fd7f496b1750953146a09502
penzoloni commettere 18733e44097d2c7a800650cea442febc5344f9b3
penzoloni blob 1e53a5cdb3ecdde27081ec6e8b31e4070106ee05

È quindi possibile aprire il file con voi editor di testo preferito per copiare i commettere hash/blog da lì. (* tosse * macro vim funziona alla grande per questo * tosse *)

ora è possibile accedere nuovamente da questo impegnarsi con qualcosa di simile git log --oneline <commit hash>. In alternativa, gitk, tig o qualsiasi altro git viewer dovrebbero funzionare.

Nel tuo caso se si trova l'hash per commettere F il registro vi mostrerà qualcosa di simile,

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

facile e veloce! Ora puoi trovare il contesto dietro a tutti questi impegni penzolanti.

P.S. Sì, lo so, post in ritardo, ma vabbè, qualcuno potrebbe trovarlo qui e trovarlo utile. (Per lo più mi probabilmente in 6 mesi, quando ho google Questo nuovo)

16

risposta s' Come @Kieran, ma per la console: git log --oneline --all --graph --decorate $(git reflog | awk '{print $1}')

+0

Devi includere l'ultima parte: $ (git reflog | awk '{print $ 1}')? Cosa fa questo? Dopo aver provato la soluzione, sembra che produca lo stesso risultato anche senza quest'ultima parte. – wmock

+0

Se si sposta il puntatore del ramo e si lasciano alcuni commit senza un riferimento (come OP ha fatto) essi non verranno più visualizzati in 'git log --all'. Un rapido esempio: dopo un 'git reset --hard @ ^' il tuo commit HEAD @ {0} sarà solo nel reflog, e dato che 'git reflog' non supporta' --graph' devi passare i commit a 'git log --graph' per ottenere una rappresentazione visiva. –

+2

puoi usare '' '--reflog''' invece di' '' $ (git reflog | awk '{print $ 1}') '' ' – Sild

21

Prova:

git log --reflog 

che elenca tutti git impegna da facendo finta che tutti gli oggetti menzionati da reflog (git reflog) siano elencati nella riga di comando come <commit>.

1

@bsimmons

git fsck --lost-found | grep commit 

quindi creare un ramo per ciascuno di essi:

$ 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 

Ora molti strumenti vi mostrerà una visualizzazione grafica di quei commit perduti.

Problemi correlati