EMZETT.
Giriş yap

git stash, reflog ve reset: değişiklikleri güvenceye almak ve kurtarmak

Kısaca: Stash ile bitmemiş işi kenara koyarsınız, reset ile durumları geri alırsınız ve reflog, neredeyse her görünürde kaybolmuş commit’i kurtarmaya yardımcı olur.

Biraz daha ayrıntılı: Git sandığınızdan çok daha fazlasını saklar: reset --hard, yanlışlıkla silinmiş bir dal veya başarısız bir rebase’ten sonra bile, hızlı davrandığınız sürece çoğu zaman her şeyi kurtarabilirsiniz. Küçük bir repertuvar yeterlidir.

Ayrıntılı

git stash: işi kenara koymak

git stash                    # mevcut değişiklikleri kenara koy
git stash -u                 # yeni (izlenmeyen) dosyaları da
git stash list               # listele
git stash pop                # son stash'i geri getir (ve sil)
git stash apply stash@{1}    # belirli birini geri getir (koru)
git stash drop               # sil
git stash push -m "experiment" file.txt

Commit etmeden dal değiştirmeniz gerektiğinde yararlıdır. Stash’ler yalnızca yerel olarak size aittir; önemli işi kendi dalına commit etmek daha iyidir.

git reset: sıfırlamak

  • git reset --soft HEAD~1: son commit’i geri al, değişiklikler hazırlanmış (staged) kalır.
  • git reset HEAD~1 (mixed): commit’i geri al, değişiklikler çalışma dizininde kalır.
  • git reset --hard HEAD~1: commit’i ve değişiklikleri at (tehlikeli!).
  • git restore file bir dosyanın değişikliklerini atar, git restore --staged file onu hazırlık alanından çıkarır.
  • Paylaşılan dallarda reset yerine git revert <commit> daha iyidir: geçmişi yeniden yazmadan değişikliği geri alan yeni bir commit oluşturur.

git reflog: güvenlik ağı

Reflog, HEAD ve dalların son haftalarda nereye işaret ettiğini kaydeder:

git reflog
git reset --hard e4f5g6h          # eski durumu geri yükle
git branch rescued e4f5g6h        # veya yeni bir dal olarak kaydet

Bu, yanlış bir reset, rebase veya silinmiş dal sonrasında kaybolan commit’leri kurtarır (varsayılan olarak yaklaşık 90 gün, yalnızca yerel depoda).

Tipik kurtarmalar

  • Dal yanlışlıkla silindi: git reflog, sonra git branch name <sha>.
  • Rebase bozuldu: git rebase --abort veya git reset --hard ORIG_HEAD.
  • Yanlış dala commit edildi: git branch new, sonra eskisinde git reset --hard HEAD~1.
  • Dosya silindi ama commit edilmişti: git restore --source=<commit> -- file.
  • Hiç commit edilmedi: o zaman Git çoğunlukla yardımcı olamaz; bitmemiş olsa bile düzenli commit edin (WIP commit’leri) ve sonra düzenleyin.

Ayrıca bak: Git, git rebase, git bisect ve cherry-pick, Birleştirme çakışmasını çözmek, Push reddedildi