---
title: 'Değişiklikleri İşleme'
source: 'https://academia.sh/tr/kurslar/surum-kontrolune-giris/degisiklikleri-isleme'
course: 'Sürüm Kontrolüne Giriş'
language: tr
updated: '2026-08-17T18:10:47+00:00'
license: 'CC BY-SA 4.0'
---

# 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ığı.

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

```bash
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.

```bash
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:

```bash
git cat-file -p HEAD
```

```
tree 378e434005c6c42021d4398a15e89149b0fd8671
author Deniz Kaya <deniz@ornek.test> 1709532720 +0300
committer Deniz Kaya <deniz@ornek.test> 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

```bash
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.

```bash
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:

```bash
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.

```bash
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`:

```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:

```bash
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:

```bash
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:

```bash
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

```bash
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.
