Kurs
Bir geliştirici veya veri mühendisi için, istemeden git dallarını silmek ya da commit’leri resetlemekten daha sinir bozucu pek bir şey yoktur. Bu yüzden, kendi tecrübemle öğrendiğim ve keşke daha önce öğrenseydim dediğim bir konuyu, yani git reflog kullanımını paylaşmaktan memnunum. git reflog kesinlikle öğrenmeye değer tekniklerden biridir; şimdi biraz zaman ayırırsanız, ileride büyük bir baş ağrısından kurtulabilirsiniz.
Hatalarda gezinmek ve toparlanmak için çok yararlı bulduğum git reflog’u göstereceğim; ayrıca sürüm kontrolü hakkında bilmeniz gereken her şeyi öğrenmek için Foundations of Git ve Introduction to GitHub Concepts kurslarımızı da öneririm.
git reflog Nedir?
Git reflog, yani başvuru günlüğü (reference log), bir Git deposunda dal uçlarına ve HEAD başvurusuna yapılan güncellemeleri kaydeden yerel bir izleme mekanizmasıdır. (Git bağlamında HEAD, çalışma dizininizin ve hazırlama alanınızın dayandığı mevcut commit’i ifade eder.)
git log’un, bir daldaki commit’lerin nasıl bağlandığını göstererek soy ağaç temelli commit geçmişini sergilemesinin aksine, git reflog HEAD’in tüm hareketlerini—dal değiştirmeler, rebase’ler, reset’ler ve commit’ler dahil—yakalar. Bu da reflog’u kaybolan commit’leri kurtarmak ve son işlemleri hata ayıklamak için faydalı kılar.
Reflog girdileri ne zaman oluşturulur?
HEAD’in veya dal başvurularının durumunu değiştiren işlemler yaptığınız her an reflog girdileri oluşturulur. Yaygın senaryolar şunlardır:
-
git commitile değişiklikleri commit etmek. -
git checkout branch_namekullanarak farklı bir dala geçmek. -
git branch new_branchile yeni bir dal oluşturmak. -
Rebase yapmak
git rebase -
Önceki bir commit’e resetlemek
git reset --hard. -
Dalları
git mergekullanarak birleştirmek.
Yerel depodaki güncellemeleri izlemek için kullanacağınız kod:
git reflog

Yerel depodaki güncellemeleri izlemek için git reflog kullanımı. Görsel: Yazar.
git reflog çıktısını nasıl yorumlarsınız?
Çıktıyı şu şekilde yorumlayabilirsiniz:
-
HEAD@{0}: En son yapılan işlem HEAD dalına geçişti. -
HEAD@{1}: Ondan önce, bir dosya türünü.xlxs’ten.csvbiçimine çevirmiştim. -
HEAD@{2}: Dosyaları depoya ittirirken ilk commit’i yaptım.
Her girdi şunları gösterir:
-
Commit özeti (hash) (
fa82776) -
Reflog indeksi (
HEAD@{0},HEAD@{1}vb.) -
Yapılan işlemin açıklaması (commit, checkout, rebase)
git reflog Nasıl Kullanılır
Git reflog, başvuru güncellemelerini izleme ve deponuzun önceki durumlarını geri yükleme olanağı sağlar. Reflog girdilerinde nasıl gezineceğinizi anlayarak, kaybolan commit’leri kurtarabilir, değişiklikleri geri alabilir ve çalışmalarınızın geçmiş sürümlerini karşılaştırabilirsiniz.
Temel git reflog komutu
Aşağıda temel reflog komutu yer alır:
git reflog
Yukarıdaki komut, commit’ler, dal değişimleri, reset’ler, rebase’ler ve daha fazlası dahil olmak üzere HEAD’i veya dal başvurularını güncelleyen yakın tarihli işlemlerin bir listesini görüntüler. Her girdi, reflog geçmişindeki konumunu temsil etmek üzere HEAD@{0} ve HEAD@{1} gibi bir indeksle etiketlenir.
Geçmiş durumlara başvurma
Git reflog, geçmiş başvuru güncellemelerinin bir kaydı olarak hizmet eder ve depomuzun geçmişindeki önceki noktaları bulup geri yüklememize olanak tanır. O olmadan bu başvurular mevcut olmazdı ve belirli geçmiş durumlara dönmek için tam commit özetlerine ihtiyaç duyardık. Şimdi, git checkout kullanarak Git’in bu geçmiş durumlarda nasıl gezinmemizi sağladığını inceleyelim.
HEAD@{n}: Belirli bir reflog girdisine atıfta bulunur; burada n indekstir. Örneğin, HEAD@{2} HEAD’in en son üç durumundan üçüncüsüne karşılık gelir.
git checkout HEAD@{2}

Geçmiş değişiklikleri izlemek için git checkout kullanımı. Görsel: Yazar.
branch@{time}: Bir dalın belirli bir zamandaki durumuna atıfta bulunur. Örneğin, main@{1.week.ago} ana dalın bir hafta önceki durumunu, feature@{yesterday} ise feature dalının dünkü durumunu ifade eder.
git checkout main@{1.week.ago}

Geçmiş değişiklikleri izlemek için git checkout kullanımı. Görsel: Yazar.
Zamana dayalı niteleyiciler
git reflog yalnızca geçmiş durumları geri yüklemeye yardımcı olmakla kalmaz, onları karşılaştırmamıza da olanak tanır. reflog başvuru güncellemelerini izlediğinden, depomuzun zaman içinde nasıl değiştiğini görmek için de kullanabiliriz. Şimdi, geçmiş ve mevcut durumları karşılaştırmak için reflog girdilerinden yararlanan git diff’e bakalım.
Aşağıdakiler, yalnızca reflog indeks numaralarına güvenmek yerine deponuzu belirli bir zamana geri yüklemeyi kolaylaştıran zaman niteleyicilerine örneklerdir.
git checkout HEAD@{1.minute.ago} # Bir dakika önceki durum
git checkout HEAD@{1.hour.ago} # Bir saat önceki durum
git checkout HEAD@{1.week.ago} # Bir hafta önceki durum
git checkout HEAD@{yesterday} # Dünkü durum
git checkout HEAD@{2024-01-01.12:00:00} # Belirli bir zaman damgasındaki durum
Geçmiş durumları git diff ile karşılaştırma
Geçmiş durumları git diff gibi komutlarla karşılaştırabilirsiniz. Aşağıdaki komut, ana dalın mevcut durumunu main@{0} ile bir gün önceki durumu main@{1.day.ago} arasında karşılaştırır. Çıktı, bu iki anlık görüntü arasındaki farkları gösterecektir.
git diff main@{0} main@{1.day.ago}

Geçmiş durumları git diff ile karşılaştırma. Görsel: Yazar.
Git Reflog’un Yaygın Kullanım Alanları
Git reflog, kaybolan değişiklikleri kurtarmak, hataları geri almak ve yaygın Git aksiliklerini düzeltmek için paha biçilmez bir araçtır. Aşağıda git reflog’un yardımcı olabileceği bazı pratik senaryolar yer almaktadır.
Kötü bir reset’i geri almak
Dalınızı yanlışlıkla git reset --hard ile resetlediyseniz, önceki durumunuzu reflog ile geri yükleyebilirsiniz.
git reset --hard HEAD@{3}
Kaybolan commit’leri kurtarma
Bir dalı yanlışlıkla siler veya bir reset ya da rebase nedeniyle commit’leri kaybederseniz, git reflog ile kayıp commit’i bulabilirsiniz.
git reflog
Reflog çıktısından commit özetini (hash) bulun ve onu checkout edin:
git checkout <commit-hash>
Kayıp commit’i doğruladıktan sonra onu korumak için yeni bir dal oluşturabilirsiniz:
git branch recovered-branch <commit-hash>
Başarısız bir rebase’i düzeltme
Bir rebase ters giderse, git reflog ile rebase öncesi commit’i bulup dalınızı resetleyebilirsiniz. Rebase’ten önceki commit’i belirleyin ve resetleyin.
git reset --hard HEAD@{3} # Reflog çıktısına göre sayıyı ayarlayın
Silinmiş bir dalı geri getirme
Bir dalı yanlışlıkla silerseniz, git reflog kullanarak onu kurtarabilirsiniz. Silinen dalın bilinen son commit’ini bulun ve yeniden oluşturun:
git branch restored-branch <commit-hash>
Stash geçmişini izleme
Git reflog, stash geçmişini görüntülemek için de kullanılabilir. Aşağıdaki komut stash işlemlerini listeler ve gerekirse eski stash’leri kurtarmanıza olanak tanır.
git reflog stash
Önceki bir stash girdisini uygulamak için aşağıdaki komutu kullanın:
git stash apply stash@{2}
Yerel değişiklikleri üzerine yazmanın en iyi uygulamalarını öğrenmek için Git Pull Force: How to Overwrite a Local Branch With Remote eğitimimize göz atın.
Git Reflog Alt Komutları ve Seçenekleri
Git, reflog’ları yönetmek ve onlarla etkileşime geçmek için çeşitli alt komutlar ve seçenekler sunar.
Git reflog alt komutları
Aşağıda temel git reflog alt komutlarının yapılandırılmış bir dökümü ve kullanımları yer alır.
git reflog show: Varsayılan olarak HEAD için veya bir dal gibi belirtilen bir başvuru için reflog girdilerini görüntüler.
git reflog show

Belirtilen başvuru için girdileri görüntülemek üzere git reflog show kullanımı. Görsel: Yazar.
git reflog list: Reflog’u olan tüm başvuruları görüntüler. Saklanan reflog girdilerine sahip dalları ve HEAD başvurularını belirlemek için kullanışlıdır.
git reflog list
git reflog delete <ref>@{<specifier>}: Belirtilen zaman sınırını aşan eski reflog girdilerini temizler. Örneğin, aşağıdaki komut 30 günden eski girdileri kaldırır.
git reflog expire --expire=30.days.ago
git reflog delete <ref>@{<specifier>}: Başvuru ve konumuna göre belirli bir reflog girdisini siler. Aşağıdaki komut, HEAD için 2 indeksindeki reflog girdisini kaldırır.
git reflog delete HEAD@{2}
git reflog exists <ref>: Belirli bir başvuru için reflog olup olmadığını doğrular. Örneğin, aşağıdaki komut ana dalda reflog varsa başarı döndürür.
git reflog exists main
git reflog alt komutları için seçenekler
Aşağıdakiler, git reflog alt komutları için mevcut seçenekler ve kullanımlarıdır.
--expire-unreachable=<time>: Yalnızca herhangi bir başvurudan erişilemeyen reflog girdilerini budar. Örneğin, aşağıdaki komut 7 günden eski erişilemeyen reflog girdilerini kaldırır.
git reflog expire --expire-unreachable=7.days.ago
--all: Yalnızca HEAD değil, tüm başvurular için reflog’ları işler. Aşağıdaki komut, tüm dallarda 60 günden eski tüm reflog’ları temizler.
git reflog expire --expire=60.days.ago --all
--dry-run: Komutun yürütülmesini simüle eder; gerçekte hiçbir şeyi silmeden nelerin budanacağını gösterir. Örneğin, aşağıdaki komut hangi girdilerin kaldırılacağını görüntüler.
git reflog expire --expire=30.days.ago --dry-run
--verbose: Komutun gerçekleştirdiği işlemler hakkında ayrıntılı çıktı sağlar. Aşağıdaki komut, eski reflog girdilerini süre sonlandırırken ayrıntılı bilgiler gösterir.
git reflog expire --expire=90.days.ago --verbose
Git Reflog ve Git Log: Temel Farklar
Hem git log hem de git reflog bir deponun geçmişine dair içgörüler sağlar, ancak farklı amaçlara hizmet ederler. Sürüm kontrolü ve kurtarma stratejilerinde her birinin nasıl kullanılacağını anlamak için bu farklara bakalım.
-
git log, bir daldaki commit’lerin soyunu takip ederek commit geçmişini gösterir. Deponun içeriğinin nasıl evrildiğine dair kronolojik bir görünüm sunar. -
git reflog, dal değişimleri, reset’ler, rebase’ler ve daha fazlası gibi işlemler dahil olmak üzere HEAD, dallar ve stash’ler gibi başvurulara yapılan güncellemeleri kaydeder. Commit soyu içinde yer almayabilecek değişiklikleri takip eder. -
git reflogkesinlikle makinenize özeldir ve uzak depolarla paylaşılmaz. -
git log, artık dal soyunun parçası olmayan commit’leri kurtaramazken,git reflogbaşvuru güncellemelerini takip ederek, bu commit’ler herhangi bir daldan erişilemese bile, “kayıp” commit’leri kurtarmaya yardımcı olabilir.
Aşağıdaki tablo bu temel farkları özetler.
| Özellik | git log | git reflog |
|---|---|---|
| Commit’leri izler | Evet | Hayır |
| Başvuru güncellemelerini izler | Hayır | Evet |
| Uzakta paylaşılır | Evet | Hayır |
| Kayıp commit’leri kurtarabilir | Hayır | Evet |
Git Reflog Kullanımı için En İyi Uygulamalar
Git reflog, kayıp commit’leri kurtarmak ve geçmişle ilgili sorunları düzeltmek için güçlü bir araçtır; ancak etkili kullanımı dikkat gerektirir. Reflog ile çalışırken takip etmeniz gereken bazı en iyi uygulamalar şunlardır.
-
Reflog’u Kurtarma ve Hata Ayıklama için Kullanın: Bir dalı yanlışlıkla resetlediyseniz veya hatalı rebase yaptıysanız, önceki bir başvuruyu bulmak ve geri yüklemek için
git reflog’u kontrol edin. -
git reset --hardKullanırken Dikkatli Olun:git reset --hardcommit edilmemiş değişiklikleri kalıcı olarak kaldırabilir. Yanlış bir şey olması durumunda kurtarma yapabileceğinizden emin olmak için her zaman önce reflog’u kontrol edin. -
Yıkıcı Komutları Çalıştırmadan Önce Yedek Alın: Veri kaybına karşı korunmak için Git depolarınızın otomatik yedeklemelerini uygulayın. Yedekleri her zaman güvenli ve harici bir konumda saklayarak donanım arızası veya diğer felaket durumlarında kurtarılabilirliği sağlayın.
-
Uzun Vadeli Kurtarma için Yalnızca Reflog’a Güvenmeyin: Varsayılan olarak, reflog girdileri 90 gün tutulur. Bu sürenin ardından çöp toplamaya tabi tutulabilir ve kurtarılamaz hale gelebilirler. Commit’lerinizi düzenli olarak uzak bir depoya ittirerek, yerel reflog’unuzun ötesinde korunmalarını sağlayın.
-
Eski Girdileri Yönetmek için
git reflog expireKullanın: Deponuzun reflog’u kalabalık hale gelirse,git reflog expirekullanarak daha eski veya erişilemeyen girdileri budayın.
Sonuç
Bir projenin geçmişini Git’te etkili şekilde yönetmek, yalnızca temel komutlardan fazlasını gerektirir. Başvuru güncellemelerini izleyen gelişmiş araçları keşfetmek, kaybolan commit’leri kurtarmak, silinen dalları geri yüklemek ve hataları düzeltmek için değerli bir güvenlik ağı sağlayabilir. Bu araçlarla, git reset, git checkout ve git revert gibi komutlarla pratik deneyim kazanmak, sürüm kontrolündeki yetkinliğinizi önemli ölçüde artırabilir.
Kurslarımızı almak yalnızca öğrenmenin harika bir yolu değil, aynı zamanda yazılım geliştirmeyi ciddiye aldığınızı işverenlere göstermenizin de harika bir yoludur. Bu amaçla, Tüm Seviyeler için En İyi 20 Git Mülakat Sorusu ve Cevabı blog yazımızı incelemenizi ve Git hakkında uzmanlaşmak için yeni Git Fundamentals yetkinlik yolumuzu takip etmenizi öneririm.
git reflog SSS
Git reflog nedir?
Git reflog, dal uçlarına ve HEAD’e yapılan güncellemeleri takip eden bir başvuru günlüğüdür; kullanıcıların kayıp commit’leri kurtarmasına ve hataları geri almasına yardımcı olur.
Git reflog, Git log’dan nasıl farklıdır?
git log commit geçmişini izlerken, git reflog HEAD ve dallar gibi başvurulardaki değişiklikleri kaydeder.
Git reflog uzak depolarla paylaşılır mı?
Hayır, git reflog yereldir ve uzak bir depoya push edildiğinde paylaşılmaz.
Reflog commit edilmemiş değişiklikleri takip eder mi?
Hayır, reflog yalnızca başvurulardaki değişiklikleri takip eder ve commit edilmemiş çalışmaları kaydetmez.
Hangi işlemler reflog girdileri oluşturur?
Commit’ler, dal checkout’ları, reset’ler, rebase’ler, merge’ler ve stash işlemleri reflog girdileri oluşturur.
Reflog girdileri ne kadar süreyle saklanır?
Varsayılan olarak reflog girdileri 90 gün sonra sona erer, ancak bu yapılandırılabilir.

