Git reflog ve log arasındaki fark nedir?


158

Man sayfası, günlüğün kaydedilmiş günlükleri gösterdiğini ve reflog'un reflog bilgilerini yönettiğini söyler. Reflog bilgileri tam olarak nedir ve günlükte olmayan bilgiler nelerdir? Günlük çok daha ayrıntılı görünüyor.

Yanıtlar:


221

git logmevcut 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 reflogHEAD'ı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.


26
Dikkatli bir kelime: Reflog girişleri sonsuza kadar sürmediği için bazen veri kaybedebilirsiniz - belirli koşullar altında temizlenirler. Bu cevaba ve git-reflog ve git-gc belgelerine bakın . Genel olarak, yıkıcı operasyon 2 haftadan daha önce değilse, büyük olasılıkla güvendesiniz.
mcmlxxxvi

@mcmlxxxvi Aynı repo için iki yerel klasörüm var, iki klasör için reflog'ları birleştirebilir miyim?
Tmx

@Tmx, davanızı tam olarak anlamıyorum - aynı repo için iki yerel klasörle ne demek istiyorsun ? Aynı repo'dan güncel olan iki klonunuz varsa ve bunların düzenleme geçmişini "birleştirmek" istiyorsanız, .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_revsonrakine old_revuymayabilir, 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.
mcmlxxxvi

62
  • git log referanslardan erişilebilen kayıt günlüğünü gösterir (kafalar, etiketler, uzaktan kumandalar)
  • git reflogherhangi 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 reflogson 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>.

Emniyet ağı

git refloggenellikle " güvenlik ağınız " olarak ifade edilir

Sorun çıkması durumunda, git log size aradığınızı göstermediğinde genel tavsiye:

" Sakin ol ve kullangit reflog "

kendini tut

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.


14

İşte açıklama reflogPro 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.

reflogKomut 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 deleteve tam girişi belirtin (örn. git reflog delete master@{2}).


Ancak git logsize 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.
Noich

2
Git günlüğü taahhütlerinizin bir kaydıdır . Reflog, Pro Git kitabında belirtildiği gibi, referanslarınızın (temel olarak, şube işaretçileriniz ve HEADişaretçiniz) ve hangi taahhütte bulunduklarının bir kaydıdır . bu mantıklı mı? Bir yan notta, logsize bilgileri yeniden gösterebilir, ancak argüman olarak özel bir seçenek bayrağını iletmeniz gerekir --walk-reflogs.

3
Ayrıca, bir Git acemi olduğunuzdan, Pro Git kitabını okumanızı şiddetle tavsiye ederim, Git hakkında öğrendiklerimin çoğunu bu şekilde öğrendim. 1-3 ve 6-6.5 bölümlerini öneriyorum. Ayrıca hem etkileşimli hem de etkileşimli olmayan şekilde yeniden taban oluşturmayı öğrenmenizi önemle tavsiye ederim.

8

Ben de bunu merak ettim ve sadece biraz detaylandırmak ve özetlemek istiyorum:

  1. git logbulunduğ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.

  2. git reflogCupcake'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 checkoutve ç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


1

Git log ve reflog arasındaki farkı, özel kayıt ile genel kayıt arasındaki fark olarak düşünmeyi seviyorum.

Özel ve herkese açık

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.

Günlük cilalı. Reflog özlüdür.

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:

Günlük cilalı.  Reflog özlüdür.

'Güvenlik ağı' fikrine geri dön

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.


-6

Aslında reflog,

 git log -g --abbrev-commit --pretty=oneline

bu yüzden cevap şöyle olmalıdır: bu özel bir durumdur.


9
İçinde git log, -gkısa biçimidir --walk-reflogs. Yani, bu hiçbir şeyi açıklamaz.
Adrian W
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.