İçeriğe geç
academia.sh

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.
  • author ve committer — 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: HEADrefs/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.

Aramak için yazmaya başlayın.

↑↓ Esc gezin · aç · kapat