Git reflog

İleri Seviye Git

Amanda Crawford-Adamo

Software and Data Engineer

Git Reflog Nedir?

  1. Depomuzdaki TÜM referans güncellemelerinin yerel kaydı
  2. Reflog, yerelde .git/logs/refs/heads/ dizininde saklanır
  3. Dal uçlarındaki ve HEAD konumundaki değişiklikleri kaydeder
  4. Git işlemlerimiz için bir güvenlik ağı görevi görür
  5. Yanlışlıkla yapılan değişiklikleri veya silmeleri kurtarmaya yardımcı olur

Git geçmişi değişikliklerinin örnek grafiği

İleri Seviye Git

Git Reflog ve Git Log Karşılaştırması

Özellik Git Reflog Git Log
Amaç Yerel repoda referans güncellemelerini ve yeniden yazımları gösterir Yalnızca commit geçmişini gösterir
Kapsam Yalnızca yerel depo Yerel ve uzak depolar
İçerik Tüm referans güncellemeleri (commit, reset, merge, vb.) Yalnızca commit’ler
Kalıcılık Geçici (genelde 90 gün) Kalıcı (depo geçmişinin parçası)
Kullanım Durumu Kayıp commit’leri kurtarma, son işlemleri anlama Proje geçmişini görüntüleme, özellik geliştirmeyi anlama
İleri Seviye Git

Reflog Komutları

  • Günlük verisini ve HEAD etkinliğini gösterir
    git reflog
    git reflog show
    
  • Eski veya erişilemeyen girdileri temizler
    git reflog expire
    
İleri Seviye Git

Reflog Çıktı Yapısı

reflog çıktı metin yapısının dökümü

terminalde reflog çıktısı örneği

Bileşen Açıklama
short-hash Kısaltılmış commit hash’i
ref Genelde HEAD, bazen dal adları
index Reflog’daki konum (0 en güncel)
action İşlem türü (commit, reset, merge, vb.)
descriptions İşleme ilişkin açıklama
1 https://hackernoon.com/time-to-rewrite-your-git-history-effectively-with-git-reflog
İleri Seviye Git

Filtreleme: Since ve Until

  • since = bu zamandan itibaren girdileri gösterir

    git reflog --since "time-qualifer"
    
  • until = bu zamana kadar olan girdileri gösterir

    git reflog --until "time-qualifer"
    
Kullanım
git reflog --since="1 week ago"
git reflog --until="yesterday"
git reflog --until="2024-01-01"
İleri Seviye Git

Silinen Dalları Kurtarma

Senaryo

  • etl-feature adında bir dal oluşturuldu
  • ETL özellik değişiklikleri bu dala işlendi
  • Yanlışlıkla bu dal silindi
  • Tüm kod değişiklikleri kayboldu

etl-feature dalını nasıl geri yükleriz?

Çözüm

  1. Silinen dalın ucundaki commit’in hash’ini git reflog ile bulun
  2. HEAD’i bu commit hash’ine taşımak için git checkout kullanın
  3. HEAD’in işaret ettiği commit’ten yeni bir dal oluşturun
git reflog
git checkout <hash>
git checkout -b <branch-name>
1 https://stackoverflow.com/questions/3640764/can-i-recover-a-branch-after-its-deletion-in-git
İleri Seviye Git

Git Reset

  • HEAD’i belirtilen commit nesnesine taşır.
  • Reset türüne bağlı olarak çalışma alanı ve hazırlama alanı güncellenir.
Reset Türü Komut Çalışma Dizini Etkisi Hazırlama Alanı Etkisi
Soft git reset --soft <commit> Değişiklik yok Değişiklikler staged kalır
Mixed (Varsayılan) git reset --mixed <commit> Değişiklik yok Değişiklikler unstaged olur
Hard git reset --hard <commit> Değişiklikler atılır Değişiklikler atılır
İleri Seviye Git

Kayıp Bir Commit’i Bulma

Senaryo

  • Commit ve rebase’lerden sonra testler başarısız oldu
  • Başarısızlığa hangi commit’in yol açtığı bilinmiyor
  • Geçen duruma dönmek gerekiyor

Önceki ETL betik değişikliklerine nasıl döneriz?

Çözüm

  1. Silinen commit hash’ini Git Reflog ile bulun
  2. Testlerin geçtiği commit’e dönmek için git reset kullanın
git reflog
git reset --soft HEAD@{1}
İleri Seviye Git

En İyi Uygulamalar

  • Kayıp kod ve commit’leri kurtarmada güçlüdür
  • Anlamlı commit mesajları kullanın
  • Düzenli olarak uzak depoya push edin
  • Zorla push ederken dikkatli olun

Hata yaptığımızda reflog yerel zaman makinemizdir

Zamanda geriye giden bir saatin görseli

İleri Seviye Git

Hadi pratik yapalım!

İleri Seviye Git

Preparing Video For Download...