Yanıtlar:
git log
mevcut KAFA ve atalarını gösterir. Yani, taahhüt HEAD'ini, daha sonra ebeveynini, ebeveynini vb. Her taahhüdün ebeveynini tekrar tekrar arayarak deponun soyundan geri döner.
(Uygulamada, bazı taahhütlerin birden fazla üst öğesi vardır. Daha temsili bir günlük görmek için, gibi bir komut kullanın git log --oneline --graph --decorate
.)
git reflog
HEAD'ın soyundan hiç geçmiyor. Reflog, HEAD'in işaret ettiği taahhütlerin sıralı bir listesidir: repo için geçmişi geri alır. Reflog, repo'nun bir parçası değildir (taahhütlerin kendilerine ayrı olarak saklanır) ve itme, getirme veya klonlara dahil değildir; tamamen yerel.
Bir yana: Reflog'u anlamak, işlendikten sonra repodan gerçekten veri kaybedemeyeceğiniz anlamına gelir. Yanlışlıkla eski bir işleme sıfırlarsanız veya yanlış bir şekilde yeniden oluşturursanız veya görsel olarak "kaldıran" başka bir işlem yaparsanız, reflog'u kullanarak git reset --hard
önceki durumunuzu geri yüklemek için bu ref'ye daha önce nerede geri döndüğünüzü görebilirsiniz . Unutmayın, referanslar sadece taahhüdü değil, arkasındaki tüm tarihi ima eder.
.git/logs/refs/<branch>
girişler biçime sahiptir <old_rev> <new_rev> [...] <timestamp> [...]
. Zaman damgasına göre bitiştirmeyi ve sıralamayı deneyebilirsiniz. Ancak, bazı satırlar bir new_rev
sonrakine old_rev
uymayabilir, bu durumda reflog geçersiz olacağından şüpheleniyorum. Daha sonra diziyi "düzeltmek" için sahte girişler eklemeyi deneyebilirsiniz, ancak bana çok fazla güçlük çekiyor.
git log
referanslardan erişilebilen kayıt günlüğünü gösterir (kafalar, etiketler, uzaktan kumandalar)git reflog
herhangi bir zamanda repoda referans gösterilen veya referans gösterilen tüm taahhütlerin bir kaydıdır .Bu nedenle git reflog
( varsayılan olarak 90 gün sonra budanmış yerel kayıt), o dal tarafından başvurulan SHA1'i geri almak için (bir dalın silinmesi gibi) bir "yıkıcı" işlem yaptığınızda kullanılır.
Bkz git config
:
gc.reflogexpire
gc.<pattern>.reflogexpire
git reflog
son kullanma tarihi bu saatten daha eski reflog girişlerini kaldırır; varsayılanı 90 gündür. Ortada
"<pattern>
" (örn. "refs/stash
") Olduğunda, ayar yalnızca ile eşleşen referanslara uygulanır<pattern>
.
git reflog
genellikle " güvenlik ağınız " olarak ifade edilir
Sorun çıkması durumunda, git log size aradığınızı göstermediğinde genel tavsiye:
Reflog yine SHA1'inizin yerel bir kaydıdır.
Buna karşılık git log
: Repo'yu yukarı yönlü bir repoya iterseniz , aynı görürsünüz git log
, ancak mutlaka aynı değildir git reflog
.
İşte açıklama reflog
Pro Git kitaptan :
Git'in uzaktayken arka planda yaptığı şeylerden biri, HEAD ve şube referanslarınızın son birkaç aydır nerede olduğuna dair bir günlük olan bir reflog tutmaktır.
Reflog'unuzu aşağıdakileri kullanarak görebilirsiniz
git reflog
:$ git reflog 734713b... HEAD@{0}: commit: fixed refs handling, added gc auto, updated d921970... HEAD@{1}: merge phedders/rdocs: Merge made by recursive. 1c002dd... HEAD@{2}: commit: added some blame and merge stuff 1c36188... HEAD@{3}: rebase -i (squash): updating HEAD 95df984... HEAD@{4}: commit: # This is a combination of two commits. 1c36188... HEAD@{5}: rebase -i (squash): updating HEAD 7e05da5... HEAD@{6}: rebase -i (pick): updating HEAD
Şube ipucunuz herhangi bir nedenle her güncellendiğinde Git bu bilgileri sizin için bu geçici geçmişte saklar. Ayrıca bu verilerle daha eski taahhütleri de belirleyebilirsiniz.
reflog
Komut ayrıca çok eski reflog girişleri girişleri silmek veya sona ermek üzere kullanılabilir. Gönderen için resmi Linux Kernel Git belgelerinereflog
:
Alt komut
expire
, eski reflog girişlerini budamak için kullanılır.Reflogdan tek girişleri silmek için alt komutunu kullanın
delete
ve tam girişi belirtin (örn.git reflog delete master@{2}
).
git log
size aynı bilgileri vermiyor mu? Maalesef açık görünüyorsa, GIT'de çok yeniyim ve ilk OMG'mden hemen önce bazı temel bilgiler almak istiyorum.
HEAD
işaretçiniz) ve hangi taahhütte bulunduklarının bir kaydıdır . bu mantıklı mı? Bir yan notta, log
size bilgileri yeniden gösterebilir, ancak argüman olarak özel bir seçenek bayrağını iletmeniz gerekir --walk-reflogs
.
Ben de bunu merak ettim ve sadece biraz detaylandırmak ve özetlemek istiyorum:
git log
bulunduğunuz şube için yaptığınız tüm taahhütlerin geçmişini gösterir. Farklı bir şubeye göz atın ve farklı bir taahhüt geçmişi göreceksiniz. Tüm şubeler için geçmişte bulunduğunuzu görmek istiyorsanız yazın git log --all
.
git reflog
Cupcake'in dediği gibi referanslarınızın kaydını gösterir. Her taahhüt veya ödeme yapıldığında bir giriş yapılır. Her ödeme işleminden sonra iki kez kullanarak iki dal arasında geçiş yapmayı deneyin git checkout
ve çalıştırın git reflog
. En üstteki girişin her seferinde "ödeme" girişi olarak güncellendiğini göreceksiniz. Konumunda bu tür girişleri görmüyorsunuz git log
.
Kaynaklar: http://www.lornajane.net/posts/2014/git-log-all-branches
Git log ve reflog arasındaki farkı, özel kayıt ile genel kayıt arasındaki fark olarak düşünmeyi seviyorum.
Git reflog ile yerel olarak yaptığınız her şeyi takip eder. Taahhüt ettin mi? Reflog izler. Donanımdan sıfırlama yaptınız mı? Reflog izler. Eğer mı bir taahhüt değişiklik ? Reflog izler. Yerel olarak yaptığınız her şey, reflogda bunun için bir giriş var.
Günlük için bu doğru değil. Bir taahhüdü değiştirirseniz, günlük yalnızca yeni taahhüdü gösterir. Bir sıfırlama yapar ve geçmişinizde birkaç işlem atlarsanız, atladığınız taahhütler günlükte görünmez. Değişikliklerinizi başka bir geliştiriciye veya GitHub'a veya bunun gibi bir şeye aktardığınızda, yalnızca günlükte izlenen içerik görünecektir. Başka bir geliştiriciye, sıfırlama hiç gerçekleşmemiş veya değişiklikler hiç gerçekleşmemiş gibi görünecek.
Evet, 'özel ve kamusal' benzetmeyi seviyorum. Ya da reflog benzetmesine karşı daha iyi bir günlük 'cilalanmış veya özlüdür '. Reflog tüm deneme ve hatalarınızı gösterir. Günlükte çalışma geçmişinizin temiz ve parlak bir sürümü gösterilir.
Konuyu vurgulamak için bu görüntüye bir göz atın. Depo başlatıldığından beri bir dizi değişiklik ve sıfırlama gerçekleşti. Reflog hepsini gösterir. Ancak log komutu, repoya karşı yalnızca bir taahhüt varmış gibi görünmesini sağlar:
Ayrıca, reflog, değiştirdiğiniz şeyleri takip ettiğinden ve sıfırlamayı taahhüt ettiğinizden , geri dönmenize ve bu taahhütleri bulmanıza olanak tanır, çünkü size taahhüt kimlikleri verecektir. Deponuzun eski taahhütlerden arındırılmadığını varsayarsak, artık günlükte görünmeyen öğeleri yeniden canlandırmanıza olanak tanır. Reflog bazen yanlışlıkla kaybettiklerini düşündükleri bir şeyi geri almaları gerektiğinde birinin cildini kurtarır.
Aslında reflog,
git log -g --abbrev-commit --pretty=oneline
bu yüzden cevap şöyle olmalıdır: bu özel bir durumdur.
git log
, -g
kısa biçimidir --walk-reflogs
. Yani, bu hiçbir şeyi açıklamaz.