İçeriğe geç
academia.sh

Ders 14 / 15

Zula

Yarım kalmış işin geçici olarak saklanması; zula yığıtı, içeriğin incelenmesi, izlenmeyen dosyaların dâhil edilmesi ve zulanın nesne modelindeki karşılığı.

İçindekiler

Buraya kadarki araçlar tamamlanmış değişikliklerle ilgiliydi: bir değişiklik ya işlenir ya geri alınır. Üçüncü bir durum vardır — değişiklik yarım kalmıştır ve başka bir işe geçmek gerekmektedir. İşlemek erkendir, çünkü ortada çalışan bir bütün yoktur; geri almak kayıptır.

Zula (stash), bu durum için tanımlanmış bir bekletme alanıdır: çalışma dizini ve hazırlık alanı temizlenir, içerikleri kenara alınır ve sonra geri getirilir.

Yarım Kalan İş

Arama betiğine tüm terimleri listeleyen bir seçenek eklenmek isteniyor. Kullanım satırı güncelleniyor, gerçekleştirim henüz yazılmamış; ayrıca yapılacaklar listesi olarak izlenmeyen bir dosya oluşturulmuş:

git status --short
 M ara.sh
?? TODO.md

Bu sırada belgede bir eksiklik bildirilir ve önce onun düzeltilmesi gerekir. Yarım iş işlenemez.

Zulaya Almak

git stash push -m "listeleme seçeneği, yarım"
Saved working directory and index state On main: listeleme seçeneği, yarım
git status --short
?? TODO.md

İzlenen dosyadaki değişiklik kayboldu; çalışma dizini son işlemedeki hâline döndü. İzlenmeyen TODO.md yerinde kaldı: zula varsayılan olarak yalnızca izlenen dosyaları alır.

-m seçeneği girdiye bir açıklama bağlar. Açıklama yazılmazsa yerine son işlemenin konu satırı konur; birden çok girdi biriktiğinde bu açıklamalar ayırt edici olmaktan çıkar.

Zula Bir Yığıttır

git stash list
stash@{0}: On main: listeleme seçeneği, yarım

Girdiler bir yığıt gibi davranır: en son eklenen stash@{0} olur, önceki girdiler bir sıra geriye kayar. Veri Yapıları kursunda tanımlanan son giren ilk çıkar düzeni burada doğrudan uygulanır. Ancak erişim yığıtla sınırlı değildir: herhangi bir girdi dizin numarasıyla adlandırılıp tek başına alınabilir ya da silinebilir.

İçeriği İncelemek

git stash show
 ara.sh | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
git stash show -p
diff --git a/ara.sh b/ara.sh
index 582ddde..726faa9 100755
--- a/ara.sh
+++ b/ara.sh
@@ -2,7 +2,7 @@
 # terimler.txt içinde arama yapar.
 
 if [ $# -ne 1 ]; then
-    echo "kullanım: ara.sh ARANAN" >&2
+    echo "kullanım: ara.sh [-l] ARANAN" >&2
     exit 1
 fi
 

İkinci komut farkın tamamını verir. Girdi belirtilmezse stash@{0} varsayılır; başka bir girdi için adı yazılır.

Araya Giren İş

Çalışma dizini temiz olduğu için acil düzeltme rahatça yapılır ve işlenir:

git commit -m "Aramanın harf duyarsızlığını README'de belirt"
[main 498105a] Aramanın harf duyarsızlığını README'de belirt
 1 file changed, 2 insertions(+)

Geri Getirmek

git stash pop
On branch main
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
	modified:   ara.sh

Untracked files:
  (use "git add <file>..." to include in what will be committed)
	TODO.md

no changes added to commit (use "git add" and/or "git commit -a")
Dropped refs/stash@{0} (de2b7f622af30b8141497a63c589cc0ff5b48666)

Yarım kalan iş geri geldi ve zula girdisi silindi. Son satır, silinen girdinin nesne kimliğini bildirir; bu kimlik saklanırsa girdi yanlışlıkla silinse bile geri getirilebilir.

İki komut arasındaki ayrım önemlidir:

Komut Etkisi
git stash apply İçeriği uygular, girdiyi listede bırakır
git stash pop İçeriği uygular ve girdiyi listeden düşürür
git stash drop Girdiyi uygulamadan siler
git stash clear Tüm girdileri siler

Uygulama sırasında çakışma çıkabileceği için, sonucun belirsiz olduğu durumlarda apply tercih edilir: uygulama başarısız olursa girdi hâlâ listededir.

İzlenmeyen Dosyaları Dâhil Etmek

git stash push -u -m "listeleme seçeneği, yarım"
Saved working directory and index state On main: listeleme seçeneği, yarım
git status --short

Çıktı boştur; TODO.md de zulaya alınmıştır. -u seçeneği izlenmeyen dosyaları da kapsar. Yoksayılan dosyalar için ayrı bir seçenek gerekir; varsayılan davranış onları yerinde bırakır.

Zula Nesne Modelinde Nedir

Zula, ayrı bir veri yapısı değildir. refs/stash adlı bir başvurudur ve gösterdiği şey bir işlemedir:

git rev-parse stash@{0}
8ac8f2017d7f01e1fb748baa81fa9cc387ed6acf
git cat-file -p stash@{0}
tree 67b9d0564a53a73b74f42170488295f1d2f53fb1
parent 498105a461806443b43bf3287f41a9fe045f7ef8
parent 529c6c8bd87596bd7c343b11f6374532386b1296
parent 0e958ff47522e4f1b686243da04d5acec59cd351
author Deniz Kaya <[email protected]> 1710226080 +0300
committer Deniz Kaya <[email protected]> 1710226080 +0300

On main: listeleme seçeneği, yarım

Üç öncül satırı vardır. Birincisi zulanın alındığı andaki dal ucudur; ikincisi hazırlık alanının o andaki durumunu saklayan bir işleme; üçüncüsü, -u kullanıldığı için, izlenmeyen dosyaları saklayan bir işlemedir. -u kullanılmasaydı iki öncül olurdu.

Bu yapı, dersin başındaki soruya nesne modeli düzeyinde yanıt verir: zula “geçici bir alan” değil, olağan işlemelerden yapılmış ama hiçbir dala bağlı olmayan küçük bir tarihçe parçasıdır. Zula girdileri de nesne veritabanında durur ve erişilemez hâle geldiklerinde çöp toplamanın kapsamına girerler.

Sınırlar

Zula yereldir ve paylaşılmaz; deponun bir kopyasındaki girdiler başka kopyalarda görünmez. Açıklamalar dışında hiçbir yapı taşımaz: girdiler ne sıralanır ne de gruplanır. Bu nedenle uzun süreli bekletme için uygun değildir — biriken girdilerin hangi işe ait olduğu kısa sürede belirsizleşir.

Yarım işin günler boyu bekletilmesi gerekiyorsa doğru araç zula değil, ayrı bir dal üzerinde yazılan işlemelerdir. Dallar Dallanma ve İşbirliği kursunun konusudur.

Örnek depoda girdi geri alınır:

git stash pop
On branch main
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
	modified:   ara.sh

Untracked files:
  (use "git add <file>..." to include in what will be committed)
	TODO.md

no changes added to commit (use "git add" and/or "git commit -a")
Dropped refs/stash@{0} (8ac8f2017d7f01e1fb748baa81fa9cc387ed6acf)

Ardından seçenek tamamlanır, TODO.md silinir ve değişiklik işlenir:

git commit -m "Tüm terimleri listeleyen -l seçeneğini ekle"
[main 701fa37] Tüm terimleri listeleyen -l seçeneğini ekle
 1 file changed, 6 insertions(+), 1 deletion(-)

Özet

  • Zula, izlenen dosyalardaki değişiklikleri kenara alır ve çalışma dizinini son işlemedeki hâline döndürür.
  • Girdiler yığıt düzeninde tutulur; stash@{0} en son eklenendir.
  • apply girdiyi listede bırakır, pop düşürür, drop uygulamadan siler.
  • -u seçeneği izlenmeyen dosyaları da kapsar.
  • Zula girdisi, iki ya da üç öncülü olan ve hiçbir dala bağlı olmayan bir işlemedir.

Sonraki Adım

Tarihçedeki belirli noktalara insan tarafından okunabilir adlar verilmedi; her şey kırk karakterlik kimliklerle ya da göreli gösterimlerle anıldı. Bir sürüm yayımlandığında o noktaya kalıcı bir ad vermek gerekir. Kursun son dersi etiketleri, dördüncü nesne türünü ve anlamlı sürümleme ile ilişkisini ele alacak.

İlerlemeni kaydetmek ve not almak için Giriş yap

Notlarım

Not almak için giriş yapmalısın.

Aramak için yazmaya başlayın.

↑↓ Esc gezin · aç · kapat