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ı,--stagedhazırlık alanı ile son işlemeyi,HEADile ç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:yolyazımıyla nesneler arası fark alınır. --statdosya başına özet,--word-diffsö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.