İçeriğe geç
academia.sh

Ders 08 / 15

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.

İçindekiler

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:

#!/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
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

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:

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:

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.

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:

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:

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:

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:

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:

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.

İ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