Bu Örnek Ne Gösteriyor
Yukarıdaki iki fonksiyon, farklı yaklaşımlar kullanarak aynı sonucu hesaplar. Orijinal, değişebilir bir let değişkeni ile imperatif bir for döngüsü kullanır. Değiştirilmiş sürüm, const bağlaması ile Array.reduce kullanır. Diff, bu yeniden düzenleme sırasında tam olarak neyin değiştiğini vurgular.
Yan yana görünüm, soldan hangi satırların kaldırıldığını ve sağa hangilerinin eklendiğini netleştirir. Fonksiyon imzası ve return ifadesi değişmemiştir. Orijinalin üç orta satırı, değiştirilmiş sürümde dört satır olur.
Diff Algoritmaları Nasıl Çalışır
Myers algoritması
Myers algoritması, orijinal Unix diff komutu da dahil olmak üzere çoğu diff aracının temelidir. Karşılaştırmayı en kısa düzenleme betiği problemi olarak modeller: iki satır dizisi verildiğinde, birinciyi ikinciye dönüştürmek için minimum sayıda ekleme ve silme bulunur.
Algoritma, sol üstten sağ alta her yolun olası bir düzenleme dizisini temsil ettiği bir grafik üzerinde çalışır. Çapraz hareket etmek, satırların eşleştiği anlamına gelir (düzenleme gerekmez). Sağa hareket etmek ekleme anlamına gelir. Aşağı hareket etmek silme anlamına gelir. Myers, bu grafikteki en kısa yolu bulur, bu da en az düzenlemeye karşılık gelir.
Patience diff
Patience diff alternatif bir algoritmadır. İlk olarak her dosyada tam olarak bir kez görünen satırları (benzersiz satırlar) belirler, bunları bağlantı noktası olarak kullanır ve ardından bağlantı noktaları arasındaki bölgelerde tekrarlar. Bu, kod önemli ölçüde yeniden düzenlendiğinde daha temiz diff’ler üretir çünkü benzersiz satırlar yapısal işaretler olarak hareket eder. Git, git diff --patience çalıştırdığınızda varsayılan olarak patience diff kullanır.
Karakter düzeyinde vurgulama
Hangi satırların değiştiğini bulduktan sonra, bir diff aracı aynı algoritmayı değiştirilen her satır içinde karakter düzeyinde uygulayabilir. Bu, yalnızca bir satırın değiştiğini değil, tam olarak hangi karakterlerin eklendiğini veya kaldırıldığını gösterir. Kod incelemesi için bu en kullanışlı görünümdür: let kırmızı vurgulanmış ve const yeşil vurgulanmış olarak görürsünüz, iki satırı zihinsel olarak karşılaştırmak zorunda kalmazsınız.
Unified Diff Formatını Anlama
git diff veya diff -u çalıştırdığınızda, çıktı unified formatını kullanır. İşte bu iki fonksiyon arasındaki diff’in unified diff olarak nasıl görüneceğine dair bir örnek:
@@ -1,7 +1,8 @@
function calculateTotal(items) {
- let total = 0;
- for (let i = 0; i < items.length; i++) {
- total += items[i].price * items[i].quantity;
- }
+ const total = items.reduce(
+ (sum, item) => sum + item.price * item.quantity,
+ 0
+ );
return total;
}
@@ -1,7 +1,8 @@ başlığı şunu söyler: bu yığın orijinalin 1. satırında başlar (7 satır gösterilir) ve değiştirilmişin 1. satırında (8 satır gösterilir). - ön ekli satırlar kaldırılır. + ön ekli satırlar eklenir. Boşluk ön ekli satırlar bağlamdır, her iki sürümde de bulunur.
Yan Yana ve Satır İçi Görünüm
Her iki görünüm de aynı değişiklikleri gösterir. Seçim, karşılaştırdığınız içerik türüne bağlıdır.
Yan yana, orijinali sola ve değiştirilmişi sağa yerleştirir. Aynı anda her sürümün tam bağlamını görmek istediğiniz kod ve yapılandırılmış metin için daha iyidir. Yatay hizalama, karşılık gelen bölümleri taramayı kolaylaştırır.
Satır içi görünüm, kaldırılan ve eklenen satırları tek bir sütunda sırayla gösterir. Daha kompakttır ve yatay alanın sınırlı olduğu uzun belgeler için veya satır karşılığını izlemektense diff’i yukarıdan aşağıya okumanın daha önemli olduğu metinler için daha iyidir.
Online Diff vs Git Diff Ne Zaman Kullanılır
Git diff yalnızca bir git reposundaki dosyalar üzerinde çalışır. Bir repo dışındaki içerikler için veya dosya olarak var olmayan şeyleri (tarayıcıdan kopyalanan API yanıtları, log çıktısı, bir sunucudan kopyalanan yapılandırma) karşılaştırmak için çevrimiçi bir diff aracı pratik seçimdir.
Online diff aracının git’ten daha hızlı olduğu yaygın durumlar:
- Dağıtımlar arasında neyin değiştiğini bulmak için bir JSON API yanıtının iki sürümünü karşılaştırma
- Aynı olması gereken iki oluşturulmuş dosyanın gerçekten aynı olup olmadığını kontrol etme
- Yerel bir yapılandırmayı, SSH ile girdiğiniz bir üretim yapılandırmasıyla karşılaştırma
- Eşdeğerliği doğrulamak için iki farklı komutun çıktısını diff’leme
- Uygulamaya karar vermeden önce bir yamanın hızlı incelemesi