---
title: 'Farkları İnceleme'
source: 'https://academia.sh/tr/kurslar/surum-kontrolune-giris/farklari-inceleme'
course: 'Sürüm Kontrolüne Giriş'
language: tr
updated: '2026-08-17T18:10:47+00:00'
license: 'CC BY-SA 4.0'
---

# Farkları İnceleme

Çalışma dizini, hazırlık alanı ve işlemeler arasındaki üç ayrı karşılaştırma; birleşik fark biçiminin okunması ve nesne düzeyinde fark alma.

Günlük, hangi işlemenin hangi dosyaya dokunduğunu söylüyor ama değişikliğin içeriğini
göstermiyor. Üstelik henüz işlenmemiş değişiklikler günlükte hiç görünmez: çalışma dizinindeki
bir düzenleme, işlenene kadar tarihçenin dışındadır.

Bu ders **fark (diff)** almanın üç ayrı biçimini tanımlar ve fark çıktısının nasıl okunacağını
gösterir. Üç bölgeli model burada pratik değerini kazanır: hangi iki bölgenin karşılaştırıldığı
sorusu, hangi seçeneğin yazılacağını belirler.

## Üç Karşılaştırma

| Komut | Karşılaştırılan | Yanıtladığı soru |
|---|---|---|
| `git diff` | Çalışma dizini ↔ hazırlık alanı | Henüz hazırlığa almadığım ne var? |
| `git diff --staged` | Hazırlık alanı ↔ son işleme | Bir sonraki işlemeye ne girecek? |
| `git diff HEAD` | Çalışma dizini ↔ son işleme | Son işlemeden bu yana toplam ne değişti? |

Üçüncü satır, ilk ikisinin birleşimidir. `--staged` seçeneğinin eş anlamlısı `--cached`'dir;
kurs boyunca ilki kullanılacaktır.

## Çalışma Dizini ile Hazırlık Alanı

Arama betiği, eşleşme bulunamadığında sessiz kalıyor ve sıfır çıkış koduyla sonlanıyor. Betik
şu hâle getirilir:

```sh
#!/bin/sh
# terimler.txt içinde arama yapar.

if [ $# -ne 1 ]; then
    echo "kullanım: ara.sh ARANAN" >&2
    exit 1
fi

if ! grep -i -- "$1" terimler.txt; then
    echo "eşleşme yok: $1" >&2
    exit 2
fi
```

```bash
git diff
```

```
diff --git a/ara.sh b/ara.sh
index b87baa8..582ddde 100755
--- a/ara.sh
+++ b/ara.sh
@@ -6,4 +6,7 @@ if [ $# -ne 1 ]; then
     exit 1
 fi
 
-grep -i -- "$1" terimler.txt
+if ! grep -i -- "$1" terimler.txt; then
+    echo "eşleşme yok: $1" >&2
+    exit 2
+fi
```

## Fark Çıktısının Anatomisi

Çıktı **birleşik fark biçimindedir (unified diff)** ve dört bölümden oluşur.

**Başlık satırı.** `diff --git a/ara.sh b/ara.sh` — karşılaştırılan iki sürüm `a/` ve `b/`
önekleriyle adlandırılır. `a` eski, `b` yeni taraftır.

**Nesne satırı.** `index b87baa8..582ddde 100755` — eski ve yeni blob kimlikleri ile dosya
kipi. Bu satır, farkın nesne veritabanındaki hangi iki nesne arasında hesaplandığını
kaydeder. Kip her iki tarafta aynıysa satırın sonunda tek bir değer yazar; kip değişmişse iki
ayrı satır eklenir.

**Dosya satırları.** `---` eski, `+++` yeni sürümü gösterir. Yeni oluşturulan bir dosyada
eski taraf `/dev/null` olur.

**Parça başlığı.** Değişikliğin geçtiği her bölgeye **parça (hunk)** denir ve her parça bir
başlıkla açılır. `@@ -6,4 +6,7 @@` — dört sayı taşır: eski dosyanın 6. satırından başlayan
4 satır, yeni dosyanın 6. satırından başlayan 7 satırla değiştirilmiştir. Başlığın sonundaki
`if [ $# -ne 1 ]; then` metni, değişikliğin bağlamını veren en yakın üst satırdır; farkın
parçası değildir.

Parça içindeki satırlar üç işaretle başlar: boşluk (değişmemiş bağlam satırı), `-` (silinen),
`+` (eklenen). Bağlam satırları varsayılan olarak üç satırdır; `-U` seçeneğiyle değiştirilir.
Değiştirilen bir satır, fark biçiminde silme ve ekleme çifti olarak görünür — biçimde
"değiştirme" diye bir işlem yoktur.

## Hazırlık Alanı ile Son İşleme

```bash
git add ara.sh
git diff
```

Komut hiçbir şey yazmaz: çalışma dizini ile hazırlık alanı artık aynıdır. Fark yer değiştirmiştir:

```bash
git diff --staged
```

```
diff --git a/ara.sh b/ara.sh
index b87baa8..582ddde 100755
--- a/ara.sh
+++ b/ara.sh
@@ -6,4 +6,7 @@ if [ $# -ne 1 ]; then
     exit 1
 fi
 
-grep -i -- "$1" terimler.txt
+if ! grep -i -- "$1" terimler.txt; then
+    echo "eşleşme yok: $1" >&2
+    exit 2
+fi
```

`git add` içeriği taşımadı; hazırlık alanının hangi bloba baktığını değiştirdi. Farkın kendisi
aynı iki nesne arasında hesaplandığı için çıktı harfi harfine aynıdır.

## İki Bölge Aynı Anda

Terim listesine bir satır eklenir ama hazırlık alanına alınmaz:

```bash
git status --short
```

```
M  ara.sh
 M terimler.txt
```

İki sütunun anlamı burada belirginleşir: `ara.sh` birinci sütunda (hazırlığa alınmış),
`terimler.txt` ikinci sütunda (yalnızca çalışma dizininde) işaretlidir.

```bash
git diff
```

```
diff --git a/terimler.txt b/terimler.txt
index 11660ec..17af3b8 100644
--- a/terimler.txt
+++ b/terimler.txt
@@ -4,3 +4,4 @@ kuyruk | queue
 ağaç | tree
 karma tablosu | hash table
 bağlı liste | linked list
+küme | set
```

`git diff` yalnızca `terimler.txt` değişikliğini, `git diff --staged` yalnızca `ara.sh`
değişikliğini gösterir. İkisini birden görmek için `HEAD` ile karşılaştırılır:

```bash
git diff HEAD --stat
```

```
 ara.sh       | 5 ++++-
 terimler.txt | 1 +
 2 files changed, 5 insertions(+), 1 deletion(-)
```

`--stat`, satır satır çıktı yerine dosya başına özet verir. Artı ve eksi işaretlerinden oluşan
çubuk, eklenen ve silinen satırların oranını ölçekli gösterir; büyük farklarda toplam sayı
sabit genişliğe sığdırılır.

## İki İşleme Arasındaki Fark

İki başvuru verildiğinde fark, ilkinden ikincisine geçişi anlatır:

```bash
git diff 13d31bf 60e13bd -- terimler.txt
```

```
diff --git a/terimler.txt b/terimler.txt
index 9b9ef70..11660ec 100644
--- a/terimler.txt
+++ b/terimler.txt
@@ -1,3 +1,6 @@
 yığıt | stack
 kuyruk | queue
 çizge | graph
+ağaç | tree
+karma tablosu | hash table
+bağlı liste | linked list
```

Sıra önemlidir: `git diff B A`, aynı farkı ters yönde gösterir. Yol ayırıcısı burada da
çıktıyı tek dosyayla sınırlamak için kullanılmıştır.

## Nesne Düzeyinde Fark

Karşılaştırma başvurularla sınırlı değildir; `başvuru:yol` yazımı, o başvurudaki belirli bir
nesneyi adlandırır:

```bash
git diff 13d31bf:README.md 3132c78:README.md
```

```
diff --git a/README.md b/README.md
index 49daf90..c0a6e3d 100644
--- a/README.md
+++ b/README.md
@@ -6,4 +6,4 @@ Bilgisayar bilimi terimlerinin Türkçe karşılıklarını tutan küçük bir l
 
 `terimler.txt` dosyasında her satır şu biçimdedir:
 
-    turkce | english
+    türkçe | english
```

Bu yazım, dosya adı iki sürüm arasında değişmiş olsa bile karşılaştırma yapmayı sağlar.

## Sözcük Düzeyinde Fark

Satır tabanlı fark, uzun satırlarda küçük bir değişikliği tüm satırın silinip yeniden
eklenmesi olarak gösterir. `--word-diff` bu durumda okunabilirliği artırır:

```bash
git diff --word-diff HEAD -- terimler.txt
```

```
diff --git a/terimler.txt b/terimler.txt
index 11660ec..17af3b8 100644
--- a/terimler.txt
+++ b/terimler.txt
@@ -4,3 +4,4 @@ kuyruk | queue
ağaç | tree
karma tablosu | hash table
bağlı liste | linked list
{+küme | set+}
```

Eklenen bölüm `{+ +}`, silinen bölüm `[- -]` içine alınır. Sunum biçimi değişmiştir; farkın
kendisi ve kaydedilecek içerik aynıdır.

## Değişikliklerin Kaydedilmesi

İki değişiklik ayrı işlemelere ayrılır:

```bash
git commit -m "Eşleşme bulunamadığında hata bildir"
git commit -a -m "Küme terimini ekle"
```

```
[main 2c883a7] Eşleşme bulunamadığında hata bildir
 1 file changed, 4 insertions(+), 1 deletion(-)
[main ece664b] Küme terimini ekle
 1 file changed, 1 insertion(+)
```

Birinci komut hazırlık alanındaki `ara.sh` değişikliğini kaydetti; ikincisi `-a` seçeneğiyle
kalan izlenen değişikliği aldı.

## Özet

- `git diff` çalışma dizini ile hazırlık alanını, `--staged` hazırlık alanı ile son işlemeyi,
  `HEAD` ile çağrılan biçim ikisini birden karşılaştırır.
- Birleşik fark çıktısı başlık, nesne, dosya ve parça satırlarından oluşur; parça başlığı
  eski ve yeni taraftaki başlangıç satırı ile satır sayısını verir.
- Biçimde "değiştirme" işlemi yoktur; değişen satır bir silme ve bir ekleme olarak görünür.
- İki başvuru verilerek işlemeler arası, `başvuru:yol` yazımıyla nesneler arası fark alınır.
- `--stat` dosya başına özet, `--word-diff` sözcük düzeyinde gösterim verir.

## Sonraki Adım

Depoda yalnızca elle yazılan dosyalar bulunuyor. Oysa çalışırken üretilen dosyalar da oluşur:
betiğin çıktısı, düzenleyicinin bıraktığı yedekler, derleme sonuçları. Bunların tarihçeye
girmesi hem gürültü hem de risktir. Sonraki ders, hangi dosyaların depodan uzak tutulacağını
belirleyen yoksayma kurallarını ve kuralların izlenen dosyalara neden işlemediğini ele alacak.
