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ığı.
Yayın Güncelleme
Bu derste
- Yarım kalmış bir değişikliği kaydetmeden saklar ve geri getirir
- Zula girdilerini listeler ve içeriklerini inceler
- Zulanın nesne veritabanında nasıl temsil edildiğini gösterir
İç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ş. Bu durumu kurmak için kullanım satırı değiştirilir ve yapılacaklar dosyası yazılır:
sed -i.bak 's/ara.sh ARANAN/ara.sh ARANAN | ara.sh -l/' ara.sh rm ara.sh.bak echo "- [ ] -l seçeneğini gerçekleştir" > TODO.md
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
Zula girdisi de bir işlemedir ve işleme gibi zaman damgası taşır; çıktılarınızın bu derstekiyle aynı kalması için tarih önce yazılır (tarih değişkenleri açık oturumda tanımlıdır; yeni bir terminal açtıysanız yeniden yazın):
export GIT_AUTHOR_DATE="2024-03-12 09:30:00 +0300" export GIT_COMMITTER_DATE="2024-03-12 09:30:00 +0300" 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 sıra 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..078ea08 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 ARANAN | ara.sh -l" >&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:
cat >> README.md <<'SON' Arama büyük/küçük harfe duyarlı değildir. SON export GIT_AUTHOR_DATE="2024-03-12 09:48:00 +0300" export GIT_COMMITTER_DATE="2024-03-12 09:48:00 +0300" git commit -a -m "Aramanın harf duyarsızlığını README'de belirt"
[main 11fe7e8] 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} (f319b5815214cb386c16d3fe061c284d6ff9936d)
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
export GIT_AUTHOR_DATE="2024-03-12 10:05:00 +0300" export GIT_COMMITTER_DATE="2024-03-12 10:05:00 +0300" 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}
48acf5295ce885fe839291522c1d8e48d7ad73e1
git cat-file -p stash@{0}
tree fa90a8ed35bd3b7bad8a3f7048186a030b33df2e parent 11fe7e8840e866dda55da81f522f27f3268f1751 parent 22beea37c86e26d1cbe008233684b5d656b87945 parent f5310757c803a7c475d9ee8c0a7f972b8db76418 author Deniz Kaya <[email protected]> 1710227100 +0300 committer Deniz Kaya <[email protected]> 1710227100 +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} (48acf5295ce885fe839291522c1d8e48d7ad73e1)
Ardından seçenek tamamlanır: betik, -l verildiğinde yalnızca Türkçe sütunu yazacak biçimde
yeniden yazılır, TODO.md silinir ve değişiklik işlenir:
cat > ara.sh <<'SON' #!/bin/sh # terimler.txt içinde arama yapar. if [ $# -ne 1 ]; then echo "kullanım: ara.sh ARANAN | ara.sh -l" >&2 exit 1 fi if [ "$1" = "-l" ]; then cut -d '|' -f 1 terimler.txt exit 0 fi if ! grep -i -- "$1" terimler.txt; then echo "eşleşme yok: $1" >&2 exit 2 fi SON rm TODO.md export GIT_AUTHOR_DATE="2024-03-12 10:20:00 +0300" export GIT_COMMITTER_DATE="2024-03-12 10:20:00 +0300" git commit -a -m "Tüm terimleri listeleyen -l seçeneğini ekle"
[main a0e3bfe] 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. applygirdiyi listede bırakır,popdüşürür,dropuygulamadan siler.-useç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.