Ders 05 / 15
Değişiklikleri İşleme
Hazırlık alanının kalıcı kayda dönüşmesi; ağaç ve işleme nesnelerinin içeriği, dört nesne türü, başvuruların rolü ve atomik işleme alışkanlığı.
İçindekiler
Hazırlık alanında iki girdi bulunuyor, ancak tarihçe hâlâ boş. Bu ders o iki girdiyi kalıcı bir kayda dönüştürür ve kayıt sırasında oluşan nesneleri tek tek açar. Sonunda, bir işlemenin neden “tek bir iş” içermesi gerektiği tartışılacaktır.
İlk İşleme
git commit -m "Terim listesini ve biçim belgesini ekle"
[main (root-commit) 13d31bf] Terim listesini ve biçim belgesini ekle 2 files changed, 12 insertions(+) create mode 100644 README.md create mode 100644 terimler.txt
Köşeli parantez içindeki root-commit, bu işlemenin öncülü olmadığını — çizgenin kaynağı
olduğunu — bildirir. 13d31bf, işleme kimliğinin kısaltılmış hâlidir. Kimlik yazardan,
zamandan, mesajdan ve içerikten hesaplandığı için kendi deponuzda başka bir değer görürsünüz;
kurs boyunca gösterilen bütün kimlikler için bu geçerlidir.
git status
On branch main nothing to commit, working tree clean
Üç bölge de aynı içeriği gösteriyor: çalışma dizini, hazırlık alanı ve son işleme örtüşüyor.
İşleme Nesnesinin İçi
İşleme, nesne veritabanında saklanan bir metindir ve doğrudan okunabilir:
git cat-file -p HEAD
tree 378e434005c6c42021d4398a15e89149b0fd8671 author Deniz Kaya <[email protected]> 1709532720 +0300 committer Deniz Kaya <[email protected]> 1709532720 +0300 Terim listesini ve biçim belgesini ekle
Dört bileşen vardır:
tree— projenin o andaki tam görüntüsünü tutan ağaç nesnesinin kimliği.authorvecommitter— değişikliği yazan ve kaydeden kişi, ardından Unix zaman damgası ve saat dilimi kayması. İki alanın neden ayrı olduğu üçüncü konuda görülecektir.- Boş satırdan sonraki metin — işleme mesajı.
Kök işleme dışındaki her işlemede bir de parent satırı bulunur. Öncül işlemenin kimliği
metnin içinde yer aldığına göre, kimlik hesabına da girer: geçmişteki bir işlemenin
değiştirilmesi ondan sonraki tüm kimlikleri değiştirir.
Ağaç Nesnesi
git ls-tree HEAD
100644 blob 49daf9067744c72d7f5427d163f983c326ff37b5 README.md 100644 blob 9b9ef7052d54292add1ed75823a454c1fe66e3bb terimler.txt
Ağaç nesnesi (tree object) bir dizinin içeriğini tutar: her satırda kip, girdi türü, nesne
kimliği ve ad bulunur. Girdi türü blob ise bir dosya, tree ise bir alt dizin söz konusudur.
Alt dizinler kendi ağaç nesnelerine bağlanır; böylece proje dizini, kökü işlemenin gösterdiği
ağaç olan bir ağaç yapısına dönüşür. Veri Yapıları kursundaki terimlerle: iç düğümler ağaç
nesneleri, yapraklar bloblardır.
Blob kimliklerinin hazırlık alanındaki değerlerle aynı olduğuna dikkat edin. git commit
yeni blob yazmadı; hazırlık alanının girdilerini bir ağaç nesnesine dönüştürdü ve bu ağacı
işaret eden bir işleme nesnesi oluşturdu.
find .git/objects -type f
.git/objects/13/d31bf17fdc8a5292b7fff288de94088d5c1440 .git/objects/37/8e434005c6c42021d4398a15e89149b0fd8671 .git/objects/49/daf9067744c72d7f5427d163f983c326ff37b5 .git/objects/9b/9ef7052d54292add1ed75823a454c1fe66e3bb
Dört nesne: iki blob, bir ağaç, bir işleme.
Dört Nesne Türü
| Tür | Tuttuğu şey | Neye bağlanır |
|---|---|---|
| blob | Dosya içeriği | — |
| ağaç | Bir dizinin girdileri | Bloblara ve alt ağaçlara |
| işleme | Bir anlık görüntü ve üstverisi | Bir ağaca ve öncül işlemelere |
| etiket | Adlandırılmış bir işaret ve notu | Genellikle bir işlemeye |
Dördü de aynı biçimde saklanır: tür ve uzunluk başlığı, ardından içerik, kimlik ise bu bütünün karma değeri. Dördüncü tür kursun son dersinde ele alınacaktır.
Başvurular
İşleme kimliğinin kırk karakterlik bir karma değeri olması, insanın bu değeri akılda tutmasını gerektirmez. Başvurular bu boşluğu doldurur:
cat .git/refs/heads/main
13d31bf17fdc8a5292b7fff288de94088d5c1440
refs/heads/main dosyası tek bir satır içerir: bir işleme kimliği. Önceki derste HEAD
dosyasının bu başvuruyu gösterdiği görülmüştü. Zincir şudur: HEAD → refs/heads/main →
işleme → ağaç → bloblar.
git rev-parse HEAD
13d31bf17fdc8a5292b7fff288de94088d5c1440
git rev-parse, bir adı nesne kimliğine çeviren komuttur. HEAD, HEAD~1 (bir önceki
işleme), main gibi adların tümü bu yolla çözülür.
Atomik İşleme
Örnek projeye arama betiği eklenir. ara.sh:
#!/bin/sh # terimler.txt içinde arama yapar. if [ $# -ne 1 ]; then echo "kullanım: ara.sh ARANAN" >&2 exit 1 fi grep -- "$1" terimler.txt
Betik yazılırken README.md içindeki biçim örneğinde bir yazım hatası fark edilir ve
turkce | english satırı türkçe | english olarak düzeltilir. Çalışma dizininde artık iki
ilgisiz değişiklik vardır:
git status --short
M README.md ?? ara.sh
Bu ikisini tek işlemede kaydetmek, tarihçeye “yeni betik ve bir yazım düzeltmesi” biçiminde bulanık bir kayıt bırakır. Atomik işleme, tek bir amaca hizmet eden en küçük tutarlı değişiklik kümesidir. Ölçütü şudur: işleme geri alındığında geriye tutarlı bir durum kalmalı ve geri alma, amaçlanandan fazlasını götürmemelidir.
Hazırlık alanı bu ayrımı mümkün kılar:
git add ara.sh git commit -m "Terim arama betiği ekle"
[main 546c174] Terim arama betiği ekle 1 file changed, 9 insertions(+) create mode 100755 ara.sh
create mode 100755 satırı, dosyanın çalıştırma izniyle kaydedildiğini gösterir; izin bilgisi
ağaç nesnesinde tutulur ve tarihçenin parçasıdır.
İkinci değişiklik ayrı kaydedilir. İzlenen dosyalardaki değişiklikler -a seçeneğiyle hazırlık
alanına alınmadan doğrudan işlenebilir:
git commit -a -m "Biçim örneğindeki yazımı düzelt"
[main 3132c78] Biçim örneğindeki yazımı düzelt 1 file changed, 1 insertion(+), 1 deletion(-)
-a seçeneği yalnızca izlenen dosyaları kapsar; izlenmeyen bir dosya bu yolla işlemeye
girmez. Kolaylığı, hazırlık alanının sağladığı seçme yetkisini devre dışı bırakması pahasına
gelir — bu nedenle birden çok konuya dokunulan durumlarda kullanılmamalıdır.
Değişmeyen İçerik Yeniden Yazılmaz
git ls-tree HEAD
100644 blob c0a6e3d5d4d0a0d117519512a1fb771c8a60bfee README.md 100755 blob 4bc98c87b25ceac31de2e48015e81a943d2e73c8 ara.sh 100644 blob 9b9ef7052d54292add1ed75823a454c1fe66e3bb terimler.txt
terimler.txt blobu ilk işlemedeki değerin aynısıdır: 9b9ef70. Üç işleme boyunca dosya
değişmediği için tek bir nesne üç ağaç tarafından paylaşılmaktadır. Anlık görüntü modelinin
“her kayıtta tüm dosyalar yeniden yazılır mı” itirazına verilen yanıt budur: aynı içerik aynı
kimliği ürettiğinden, ikinci kez yazılacak bir şey yoktur.
Özet
git commit, hazırlık alanının girdilerini bir ağaç nesnesine dönüştürür ve bu ağacı gösteren bir işleme nesnesi yazar.- İşleme nesnesi bir ağaç kimliği, yazar ve işleyen bilgisi, mesaj ve (kök işleme dışında) öncül kimliklerini içerir.
- Ağaç nesnesi bir dizinin girdilerini tutar; alt dizinler kendi ağaç nesnelerine bağlanır.
- Dört nesne türü vardır: blob, ağaç, işleme, etiket. Tümü tür ve uzunluk başlıklı içeriğin karma değeriyle adlandırılır.
- Atomik işleme, geri alındığında tutarlı bir durum bırakan en küçük değişiklik kümesidir; hazırlık alanı bu bölmeyi mümkün kılar.
Sonraki Adım
Üç işleme yazıldı ve üçünün de mesajı tek satırlık. Bir düzeltmenin nedeni, denenip vazgeçilen seçenekler ya da bir kararın gerekçesi tek satıra sığmaz. Sonraki ders, işleme mesajının yapısını — konu satırı, gövde ve gerekçe — ve bu yapının tarihçeyi okunabilir kılan kurallarını ele alacak.
İlerlemeni kaydetmek ve not almak için Giriş yap
Notlarım
Not almak için giriş yapmalısın.