Rehber

git stash: değişiklikleri geçici olarak saklama ve geri getirme

Güncellendi: · Skillaria.Top

git stash, commit edilmemiş değişiklikleri ayrı bir depoya kaldırır ve çalışma dizinini son commit'e döndürür; böylece başka bir işe geçebilirsiniz. Değişiklikleri git stash pop (uygula ve depodan sil) veya git stash apply (uygula ve sakla) ile geri getirebilirsiniz; ayrı bir git unstash komutu yoktur.

git stash ne işe yarar?

Tipik durum: bir işin ortasındasınız, dosyalar değişmiş, commit için erken — ve tam o sırada başka bir branch'teki bir hatayı acilen düzeltmeniz isteniyor. Branch değiştiremiyorsunuz ya da değişikliklerinizi kaybetmekten korkuyorsunuz. git stash, commit edilmemiş tüm değişiklikleri «cebe» koyar ve çalışma dizinini son commit'teki durumuna döndürür.

$ git stash
Saved working directory and index state WIP on feature/login: 3f2a1c4 Giriş formu

$ git status
On branch feature/login
nothing to commit, working tree clean

Artık branch değiştirebilir, hatayı düzeltebilir, geri dönüp sakladıklarınızı çıkarabilirsiniz. Her kayıt stash yığınında bir giriştir; Git bunu içeride özel bir commit olarak saklar, bu yüzden veriler güvendedir ve branch'e bağlı değildir.

Değişiklikler nasıl saklanır: temel seçenekler

Anlaşılır bir açıklamayla

Varsayılan «WIP on branch» açıklaması bir hafta sonra size hiçbir şey söylemez. Açıklama ekleyin:

git stash push -m "form doğrulama, e-posta bitmedi"

Argümansız git stash, git stash push komutunun kısaltmasıdır. Eski git stash save "mesaj" biçimi hâlâ çalışır, ancak yeni senaryolarda push -m kullanın.

Yeni dosyalarla birlikte

Varsayılan olarak stash yalnızca izlenen dosyaları alır — değiştirilmiş ve index'e eklenmiş olanları. Henüz hiç git add yapılmamış yeni dosyalar çalışma dizininde kalır. Bu sık karşılaşılan bir sürprizdir.

git stash -u        # --include-untracked: izlenmeyen dosyalar da dahil
git stash -a        # --all: .gitignore'daki dosyalar da dahil

-a ile dikkatli olun: cebe node_modules, derleme çıktıları ve yerel config dosyaları da gider. Genellikle -u yeterlidir.

Değişikliklerin yalnızca bir kısmı

git stash push -m "config" src/config.js   # yalnızca belirtilen dosyalar
git stash -p                                # parçaları etkileşimli olarak seç
git stash --staged                          # yalnızca index'tekiler (Git 2.35+)
git stash --keep-index                      # her şeyi sakla ama index'i dizinde bırak

--keep-index commit öncesinde işe yarar: çalışma dizininde yalnızca commit etmek istediğiniz şeyi bırakır, testleri çalıştırır ve commit'in kendi başına tutarlı olduğundan emin olursunuz.

Değişiklikler nasıl geri getirilir (git unstash)

Git'te git unstash diye bir komut yoktur — saklananları geri çıkarmanın yolu genellikle bu şekilde aranır. Bunun için iki komut vardır.

KomutNe yaparYığındaki kayıt
git stash popSon saklanan değişiklikleri uygularÇakışmasız uygulandıysa silinir
git stash applySon saklanan değişiklikleri uygularKalır
git stash pop stash@{2}Belirli bir kaydı uygularSilinir
git stash apply --indexIndex ve çalışma dizini ayrımını da geri yüklerKalır
$ git stash pop
On branch feature/login
Changes not staged for commit:
        modified:   src/auth.js
        modified:   src/form.js
Dropped refs/stash@{0} (8c1d2e3f4a5b6c7d8e9f0a1b2c3d4e5f6a7b8c9d)

Dikkat: varsayılan olarak stash anında index'te olanlar bile sıradan değişiklikler olarak geri gelir. Hazırlanmış index'i korumak önemliyse --index ekleyin.

pop mu, apply mı?

Günlük işler için pop pratiktir: çıkardınız ve unuttunuz. Aynı değişiklikleri birkaç branch'e uygulamak istediğinizde ya da her şeyin sorunsuz gideceğinden emin olmadığınızda apply seçin — kayıt sigorta olarak kalır, sonra git stash drop ile silebilirsiniz.

Saklanan kayıtların listesiyle çalışma

$ git stash list
stash@{0}: On feature/login: form doğrulama, e-posta bitmedi
stash@{1}: WIP on main: 9b7e0d2 Bağımlılıkları güncelle
stash@{2}: On feature/api: önbellek denemesi

Yığın «son giren ilk çıkar» ilkesiyle çalışır: stash@{0} her zaman en yeni kayıttır ve numaralar her push ve drop sonrasında kayar.

KomutAmaç
git stash showSon kayıttaki değişikliklerin kısa istatistiği
git stash show -p stash@{1}Belirli bir kaydın tam diff'i
git stash drop stash@{1}Tek bir kaydı sil
git stash clearTüm kayıtları bir kerede sil
git stash branch ad stash@{0}Stash yapılan commit'ten bir branch oluştur, kaydı uygula ve sil

git stash show komutunun varsayılan olarak istatistik yerine tam diff'i ve izlenmeyen dosyaları göstermesi için stash.showPatch ve stash.showIncludeUntracked ayarları vardır.

Adım adım senaryo: işin ortasında acil bir hata

  1. Mevcut işinizi yeni dosyalarla birlikte saklayın: git stash push -u -m "login: taslak".
  2. Ana branch'e geçin ve düzeltme için bir branch oluşturun: git switch main, git pull, git switch -c hotfix/null-email.
  3. Hatayı düzeltin, commit edin, incelemeye gönderin.
  4. İşinize dönün: git switch feature/login.
  5. Değişiklikleri çıkarın: git stash pop. git status ile kontrol edin — her şey yerinde.

Bugün birçok kişi bu senaryo için git worktree kullanıyor: aynı repo için ikinci bir çalışma dizini hiçbir şeyi saklamaya gerek bırakmaz. Ama beş dakikalık hızlı bir geçiş için stash hâlâ daha basittir.

Stash uygularken çakışmalar

Stash'ten sonra branch'te aynı satırlar değiştiyse uygulama çakışmayla sonuçlanır:

$ git stash pop
Auto-merging src/auth.js
CONFLICT (content): Merge conflict in src/auth.js
The stash entry is kept in case you need it again.

Bu durumda kayıt pop ile bile silinmez. Dosyadaki çakışmayı her zamanki gibi çözün, ardından çözümü işaretlemek için git add çalıştırın (değişiklikleri index'te bırakmak istemiyorsanız git restore --staged) ve artık gereksiz olan kaydı git stash drop ile silin.

Çakışma karmaşıksa bir yan yol daha pratiktir: git stash branch tmp-login. Git, stash yaptığınız commit'ten bir branch oluşturur — orada değişiklikler çakışmasız uygulanır, ana branch'le ise normal bir merge ile birleştirirsiniz.

Yanlışlıkla silinen stash nasıl kurtarılır

Yanlışlıkla git stash drop veya clear mı çalıştırdınız? Her şey kaybolmadı. Kayıt bir commit'ti ve çöp toplayıcı onu silmediği sürece «sahipsiz» (dangling) nesneler arasında bulunabilir:

git fsck --no-reflog | grep "dangling commit"
git show 8c1d2e3        # doğru stash olup olmadığını kontrol et
git stash apply 8c1d2e3

Kaydı az önce drop veya pop ile sildiyseniz hash doğrudan komut çıktısında, Dropped refs/stash@{0} (...) satırında yazılıdır. Onu git stash apply komutuna vermeniz yeterli.

Stash içeride nasıl çalışır?

Yapıyı anlamak veri kaybetme korkusunu ortadan kaldırır. Her stash kaydı, refs/stash referansının gösterdiği sıradan bir commit'tir. İki ebeveyni vardır: üzerinde durduğunuz HEAD commit'i ve index'in durumunu tutan ayrı bir commit. -u ile izlenmeyen dosyaları içeren üçüncü bir ebeveyn eklenir. stash@{N} listesi ise refs/stash referansının günlüğünden (reflog) ibarettir.

Bundan birkaç pratik sonuç çıkar. Stash, commit kabul eden her komuta verilebilir: git diff stash@{0}, git show stash@{0}:src/auth.js (kayıttaki tek bir dosyanın içeriği) veya tüm kaydı uygulamadan tek bir dosyayı çıkarmak için git checkout stash@{0} -- src/auth.js. Silinen kayıt ise çöp toplama onu temizleyene kadar nesne veritabanında kalır.

Stash ve diğer Git komutları

Bazı komutlar değişiklikleri kendileri saklayabilir. git rebase --autostash ve git pull --rebase --autostash başlamadan önce commit edilmemiş değişiklikleri saklar ve bitince geri getirir. Bu davranışı kalıcı olarak rebase.autoStash true ve merge.autoStash true ayarlarıyla açabilirsiniz. Geri getirirken çakışma olursa Git kaydı normal stash yığınına koyar ve bunu bildirir.

git switch ile branch değiştirmek de her zaman stash gerektirmez: değişiklikleriniz branch'ler arasında farklı olan dosyalarla kesişmiyorsa Git onları sizinle birlikte taşır. Stash, Git «Your local changes would be overwritten by checkout» yanıtını verdiğinde ya da değişiklikleri başka bir branch'e taşımak istemediğinizde gerekir.

Sık yapılan hatalar

  • Yeni dosyalar «saklanmadı». İzlenmiyorlar, -u gerekiyor.
  • Stash'i uzun süreli depo olarak kullanmak. Bir ay sonra listede on tane isimsiz «WIP on main» olur ve kimse içinde ne olduğunu hatırlamaz. Uzun süren işler için ayrı bir branch'te commit yapın — en azından push edilebilir.
  • Çakışmadan sonra kaydın kaldığını unutmak ve bir süre sonra onu tekrar uygulamak. Çakışmayı çözdükten sonra her zaman drop yapın.
  • Stash sunucuyla senkronize olmaz. Yalnızca yerel repository'nizde saklanır, git push onu göndermez. Proje klasörü silinirse stash de kaybolur.
  • Yanlış kaydı uygulamak. pop öncesinde git stash list ve git stash show -p ile kontrol edin.

Özet

git stash, commit edilmemiş değişiklikleri kaybetmeden çalışma dizinini boşaltmanın hızlı yoludur: saklamak için git stash push -u -m "açıklama", geri getirmek için git stash pop. Sigorta gerektiğinde apply, karışıklığı önlemek için git stash list ve show -p kullanın ve stash'i depoya çevirmeyin — uzun süreli her şey için commit'ler ve branch'ler var. Stash ile görevler arasında geçiş, Git kursunda pratikte çalışılır.

Sık sorulan sorular

Stash başka bir branch'te uygulanabilir mi?

Evet, stash bir branch'e bağlı değildir: istediğiniz branch'e geçin ve git stash pop veya apply çalıştırın. Değişiklikler uyuşmazsa sıradan bir çakışma oluşur.

git stash index'teki değişiklikleri saklar mı?

Saklar, ancak normal pop veya apply ile her şey hazırlanmamış değişiklikler olarak geri gelir. Index'i de geri yüklemek için git stash apply --index kullanın.

Stash'te kaç kayıt tutulabilir?

Kesin bir sınır yoktur, ancak reflog saklama süresinden eski kayıtlar çöp toplama sırasında silinebilir. Pratikte yığında birkaç yeni kayıttan fazlasını tutmayın.

Tek bir dosya nasıl stash edilir?

Yolu iki tireden sonra veya doğrudan push'tan sonra belirtin: git stash push -m açıklama -- src/config.js. Stash'e yalnızca bu dosya gider, diğer değişiklikler çalışma dizininde kalır.

Stash'in geçici bir commit'ten farkı nedir?

Commit bir branch'te yaşar, sunucuya gönderilebilir ve sonra amend veya rebase ile düzeltilebilir. Stash ise yalnızca yerelde ayrı bir yığında saklanır ve kısa geçişler için uygundur.

Bu konuyu videoyla öğrenin

Bu konu “Sıfırdan Güvenilir Geliştiriciye Git” kursunda uygulamalı olarak ayrıntılı işleniyor.

Kursa git