2011-01-24 6 views
59

ı grafiği böyle olduğunu varsayalım: Ben git log --all --oneline yaparsanızTüm git commits listesi?

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

, benim kaydedilmesini altısını alacak.

Ama grafik

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

Ben E görmez ve F. Ben git adında edilmeyen dallar üzerinde olanlar da dahil tüm kaydedilmesini, söyle getireyim ise

? Eğer bir dal ucuna kadar işaretçiyi kaybettiyseniz

Teşekkür

cevap

35

özellikle kolayca- değil, oldukça samanlıkta iğne aramaya benziyor. Daha fazla referans olarak görülemeyen tüm işleri bulabilirsiniz - git fsck --unreachable bunu sizin için yapacaktır - ancak bu, git commit --amend'dan sonra attığınız ödevleri, eski vb. Bu taahhütlerin bir kerede çok fazla bilgi içermesi muhtemeldir.

Bu nedenle, yanıt veren yanıt, ilgilendiğiniz şeylerin izini kaybetmeyin. Daha da önemlisi, referanslar, son 60 gün boyunca kullandığınız tüm işlemlere veya varsayılan olarak referanslara sahip olacaktır. Daha da önemlisi, numaralı telefonun nolu taahhütleri hakkında bazı bağlamları olacak.

+5

+1: Kasıtlı olarak "commit --amend" veya "rebase" ile yetim kalan ve yanlışlıkla yetim kalan bir KAFAD ile çalışarak bir kimsenin ödediği bir taahhüt arasında hiçbir fark yoktur. – Cascabel

+3

gerçekten. Muhtemelen bu durumdan kurtulmanın en kolay yolu, HEAD'in kendisinin refloguna bakmak olacaktır. – araqnid

+0

Teşekkürler, bu yardımcı olur. Flippant'ın cevabı bile :) +1 – Amadan

3

Şansa .git/logs/HEAD Sonra dosyanın sonuna aşağı planın kaymamasını zorunda

de bulunduğu reflog bakarak taahhüt kurtarma aldık ve ben sadece kayıp taahhüt bulundu .

3

Bir sonraki adımda git log bazen tüm bu nedenle bu görüntülemek için, detay taahhüt almak iyi değildir ...

Mac için

:

$ nano .git/logs/HEAD 

sizi görmek için: projeyi ve türünü git'e içine alın bütün bunların içinde taahhüt veya:

$ gedit .git/logs/HEAD 

ki sen iyi kaydedilmesini görüntülemek için,

sonra herhangi bir favori tarayıcınızda düzenleyebilirsiniz.

32

Ben aşağıdaki komutu kullanın Bu sorunu çözmek olduğunda:

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

Bu bana başsız haline gelmiştir son hareketin görselleştirmek sağlar.

Bunu, ~/bin/git-reflog-gitk adlı bir komut dosyası yardımcısına tamamladım.

4

Bu sorunu nasıl çözüyorum? git fsck kullanın ve giriş yapın!

Önce kayıp (ulaşılamaz) işlem ve lekeleri içeren bir dosya oluşturun. (NOT: git gc gibi bir şey yaptıysanız, çöplerin hepsini toplayacak ve onları burada bulamazsınız!Size buna benzer bir dosya verir)

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

:

taahhüt sarkan dec2c5e72a81ef06963397a49c4b068540fc0dc3
sarkan damla f8c2579e6cbfe022f08345fa7553feb08d60a975
sarkan damla 0eb3e86dc112332ceadf9bc826c49bd371acc194
sarkan damla 11cbd8eba79e01f4fd7f496b1750953146a09502
sarkan taahhüt 18733e44097d2c7a800650cea442febc5344f9b3
sarkan damla 1e53a5cdb3ecdde27081ec6e8b31e4070106ee05

Daha sonra oradan işlemek/blog karmaları kopyalamak için favori metin editörü sizinle bu dosyayı açabilirsiniz.

Artık geri Bundan log git log --oneline <commit hash> gibi bir şeyle tahsis edebilirler (* öksürük * vim makrolar * öksürük * bu iş için harika çalışır). Alternatif olarak, gitk, tig veya herhangi bir diğer görüntüleyici çalışmalıdır. Senin durumunda

Eğer günlük size böyle bir şey gösterecektir F taahhüt için karma bulursanız,

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

Hızlı ve kolay! Artık tüm bu sallanan taahhütlerin arkasındaki içeriği bulabilirsiniz.

P.S. Evet, biliyorum, geç yazı, ama ah, birileri onu burada bulabilir ve yararlı bulabilir.

16

gibi @Kieran 'ın Cevap (6 ay içinde bana Çoğunlukla olasılıkla yine bu google ne zaman), ancak konsolu için: git log --oneline --all --graph --decorate $(git reflog | awk '{print $1}')

+0

Son bölümü eklemeniz gerekiyor mu: $ (git reflog | awk '{print $ 1}')? Bu ne yapar? Çözümünüzü denedikten sonra, son çıktı olmadan da aynı çıktıyı üretiyor gibi görünüyor. – wmock

+0

Şube işaretçinizi hareket ettirir ve başvuruda bulunmadan bazı işlemleri (OP gibi) bırakırsanız, artık 'git log --all' içinde görünmez. Hızlı bir örnek: Bir 'git reset --hard @ ^' 'dan sonra HEAD @ {0} işleminiz sadece reflogda olacaktır ve 'git reflog' -' print’i desteklemediğinden görsel bir temsil almak için git günlüğü. –

+2

'' '' '$ (git reflog | awk '{print $ 1}') yerine' ''reflog''' kullanabilirsiniz – Sild

21

Dene: Tüm budala listeler

git log --reflog 

tarafından taahhüt reflogs (git reflog) tarafından belirtilen tüm nesnelerin komut satırında <commit> olarak listelendiğini varsayarak.

1

@bsimmons

git fsck --lost-found | grep commit 

Daha sonra her biri için bir şube oluşturmak:

$ 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 

Şimdi birçok araç size bu kayıp kaydedilmesini grafiksel görselleştirme gösterecektir.