'Kayıp' olanlar da dahil olmak üzere tüm git işlemlerinin bir listesini alın


139

Diyelim ki böyle bir grafiğim var:

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

Eğer yaparsam git log --all --oneline, altı taahhüdümü de alacağım.

Ama eğer grafik

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

E ve F'yi görmeyeceğim. Git olmayan şubeler dahil tüm taahhütleri bana söyleyebilir miyim?

Teşekkürler

Yanıtlar:


63

Özellikle kolay değil - işaretçiyi bir dalın ucuna kaybettiyseniz, samanlıkta iğne bulmak gibidir. Artık başvuruda bulunmayan görünen tüm taahhütleri bulabilirsiniz - bunu sizin için git fsck --unreachableyapacak - ancak bir kez sonra attığınız taahhütleri, yeniden bastığınız git commit --amenddallarda eski taahhütleri vb. İçerecektir. Yani tüm bu taahhütleri görmek bir kerede geçmesi gereken çok fazla bilgi var.

Yani, yanıltıcı cevap, ilgilendiğiniz şeyleri kaybetmeyin. Daha da önemlisi, refloglar varsayılan olarak son 60 gün boyunca kullandığınız tüm taahhütlere referanslar tutacaktır. Daha da önemlisi, onlar o kaydedilmesini hakkında bazı bağlam verecektir vardır .


7
+1: Kasıtlı olarak öksüz kalan commit --amendveya rebasemüstakil HEAD ile çalışarak yanlışlıkla öksüz kalan bir taahhüt arasında kesinlikle hiçbir fark yoktur .
Cascabel

3
aslında. muhtemelen bu durumdan kurtulmanın en kolay yolu HEAD'in kendisinin refloguna bakmak olacaktır.
araqnid

@Jefromi: git commit --amendÇıkmaz sokak, kayıp taahhütler bırakarak vb. Bazı tamir ve ne yaptı ve bazı şubeleri ulaşılamaz bazı taahhütler ile sona erdi ve onları repo bırakarak biraz kirli hissettim. Şimdi düşünce artık o kadar rahatsız edici değil. :)
Emil Lundberg

2
@araqnid Kendimi orijinal afişle aynı turşuya aldım ve refloga bakma öneriniz sadece yapılacak şeydi.
Ignazio

7
Bu yanıta katılıyorum, ancak birisinin kasıtlı veya yanlışlıkla olsun yetim olanlar dahil tüm taahhütleri görmesi gerektiği durumda git fsck --unreachablebunu sağlamaz. Sadece denedim. Kenorb'un yanıtladığı gibi, daha iyi yaklaşım bir --reflogseçenektir . Bununla ilgili özellikle güzel olan şey , orijinal soruda gösterildiği gibi, görsel bağlamı ayrıştırmak için kolay bir çözüm elde etmenizdir. Örneğin, şunu deneyin:git log--graphgit log --graph --all --oneline --reflog
Inigo

111

Deneyin:

git log --reflog

reflogs ( git reflog) ile belirtilen tüm nesnelerin komut satırında listelendiğini iddia ederek tüm git taahhütlerini listeler <commit>.


1
Aradığım şey buydu - --reflog argümanının işlevselliği.
Anomali

3
Btw, gitk şunları da destekler: gitk --reflog.
ald.li

50

Bu sorunu çözdüğümde aşağıdaki komutu kullanıyorum:

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

Bu, başsız hale gelen son taahhütleri görselleştirmeme izin veriyor.

Bu denilen bir komut dosyası yardımcısı sarılmış var ~/bin/git-reflog-gitk.


1
Bu bana büyük zaman kazandırdı ... TEŞEKKÜR EDERİZ!
Bret Royster

bu harika! teşekkür ederim! ağacın önemli kısımlarını gerçekten görselleştirir.
Mladen B.

Sadece bir ipucu: Bu sadece yerel işinizde reflog kayıtları olarak çalışacaktır when the tips of branches and other references were updated in the *local repository*. git log --reflogYerel olmayan ref değişiklikleri için bunu yapmak istiyorsanız kullanmak isteyebilirsiniz
Krishna Gupta

29

Hayatımı kurtaran şu komuttu:

git reflog

Burada git gibi tarih taahhütlerinin yapıldığı bir ekran bulacaksınız:

resim açıklamasını buraya girin

Bu noktada, sadece HEAD@{X}ihtiyacınız olanı bulmanız, geçici bir dal oluşturmanız ve şu şekilde ona taşınmanız gerekir:

git checkout -b temp_branch HEAD@{X}

Bu şekilde git deponuzu yeniden bastırmadan veya daha fazla bölmeden kayıp taahhüdünüzle birlikte geçici bir şubeniz olur.

Bu yardımcı olur umarım...


26

@Kieran'ın Cevabı gibi, ama konsol için: git log --oneline --all --graph --decorate $(git reflog | awk '{print $1}')


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

Şube işaretçinizi hareket ettirir ve referans olmadan bazı işlemleri bırakırsanız (OP'nin yaptığı gibi) artık görünmezler git log --all. Kısa bir örnek: git reset --hard @^HEAD @ {0} taahhüdünüz sadece reflogda olacak ve git reflogdesteklemediğinden görsel bir temsil almak --graphiçin taahhütleri geçmeniz git log --graphgerekiyor.
Florian Fida

5
--reflogyerine kullanabilirsiniz$(git reflog | awk '{print $1}')
Sild

Ben karşılaştırıldığında git log --oneline --all --graph --decorate $(git reflog | awk '{print $1}')için git log --oneline --all --graph --decorate --reflog, onlar --reflog böyle WIP girdileri gibi ayrıntıları dahil hariç neredeyse aynılar.
Senaryo Kurt

@FlorianFida, bunun yerine reflogneden kullanmıyorsunuz log --reflog?
Pacerier

9

Bu sorunu nasıl çözerim? Kullanım git fsckve günlük tutma!

Önce kayıp (ulaşılamaz) taahhütler ve lekeler içeren bir dosya oluşturun. (NOT: Eğer böyle bir şey yaptıysanız git gc, tüm taahhütlerini toplayacak ve burada bulamayacaksınız!)

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

Bu size şöyle bir dosya verir:

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

Daha sonra bu dosyayı, favori / blog karmasını oradan kopyalamak için favori metin düzenleyicinizle açabilirsiniz. (* öksürük * vim makroları bunun için harika çalışır * öksürük *)

Şimdi bu işlemden benzer bir şeyle tekrar giriş yapabilirsiniz git log --oneline <commit hash>. Alternatif olarak, gitk, tig veya başka bir git görüntüleyici çalışmalıdır.

Sizin durumunuzda, F komutunun karmasını bulursanız, günlük size böyle bir şey gösterir,

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

Çabuk ve kolay! Artık tüm bu sarkan taahhütlerin ardındaki bağlamı bulabilirsiniz.

PS Evet, biliyorum, geç yazı, ama ah, biri burada bulabilir ve yararlı bulabilir. (Büyük olasılıkla 6 ay içinde bunu tekrar google'a gittiğimde)


5

Ben bulunan reflog bakarak taahhüt kurtarmak şansım vardı .git/logs/HEAD

Daha sonra dosyanın sonuna kadar inmek zorunda kaldım ve kaybettiğim taahhüdü buldum.


Bir şeyleri mahvettiğimde işte bu sona erdi. Usta olmaya karar verdim ve Stash ittiğimde inat etti. Sıfırladım - sert, sonra hatamı fark ettim. Taahhüt reflogdaydı, bu yüzden kontrol ettim, bir şube yaptım, sonra ittim. Sonunda her şey yolunda gitti.
David

5

Biz edeceğiz git logbazen o kadar bu görüntülemek için, bütün onaylatabilirsiniz ayrıntı almak için iyi değil ...

Mac için: Git projesine girin ve şunu yazın:

$ nano .git/logs/HEAD

hepiniz bu konuda taahhütte bulunduğunuzu görmek için:

$ gedit .git/logs/HEAD

hepiniz bu konuda taahhütte bulunduğunuzu görmek için,

favori tarayıcınızın herhangi birinde düzenleyebilirsiniz.


3

@bsimmons

git fsck --lost-found | grep commit

Sonra her biri için bir şube oluşturun:

$ 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ç, kaybedilen taahhütlerin grafiksel bir görselleştirmesini gösterecektir.


2

Git Uzantıları GUI'sini kullanırsanız, "Görünüm -> Reflog referanslarını göster" seçeneğini işaretlerseniz, sarkan işlemlerin grafik olarak görselleştirilmesini gösterebilir. Bu, tıpkı diğer tüm atıfta bulunulanlar gibi, ağaçta sarkan taahhütleri gösterecektir. Bu şekilde aradığınızı bulmak çok daha kolaydır.

Gösteri için bu resme bakın . Görüntüdeki C2, C3, C4 ve C5 değerleri sarkıyor ama hala görülebilir.


2
git log --reflog

beni kurtardı! HEAD'ı birleştirirken kaybettim ve enlemi bulamadım! Kaynak ağacında gösterilmiyor, ancak daha git log --reflogönce tüm yerel taahhütlerimi göster

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.