Yükleme yok, %100 yerel, hesap yok

Makale

Kod Parçacıklarını Yüklemeden Karşılaştırın

İki dosyayı çevrimiçi bir diff aracına her yapıştırdığınızda, o kod makinenizi terk eder. Yapılandırma dosyaları, veritabanı sorguları, bir .env parçacığına gömülü API anahtarları: bunların hepsi sizin kontrolünüzde olmayan bir sunucuya ulaşır. Bu makale, diff algoritmalarının nasıl çalıştığını, ayrıntı düzeyi seçeneklerinin pratikte ne anlama geldiğini ve karşılaştırmayı yerel tutmanın neden önemli olduğunu ele almaktadır.

Diff Neyi Hesaplar

Bir diff aracı iki metin alır ve birini diğerine dönüştüren minimum değişiklik kümesini bulur. Temel fikir, en uzun ortak alt dizi olan LCS'dir: her iki metinde de aynı sırayla, bitişik olmasa bile görünen en uzun satır (veya jeton) dizisi. Ortak alt dizide yer almayan her şey ya yeni sürümde bir ek ya da eskisinden bir silmedir. Bunun için kullanılan klasik algoritma Myers'a (1986) aittir; N ve M iki metnin uzunlukları, D ise düzenleme sayısı olmak üzere O((N+M)D) sürede en kısa düzenleme betiğini bulur. Pratikte çoğu araç, başta ortak satırları ve sondaki ortak satırları yok saymak için bir ön işleme adımı ekler; bu, sorunu değişen bölgeye indirger. Sonuç bir yamatır: her biri bitişik bağlam satırları, silmeler ve eklemeler bloğunu açıklayan bir dizi parçadan oluşur. Bu, Unix diff, Git ve çoğu kod inceleme aracının kullandığı formattır.

İki metin girişinin en uzun ortak alt dizilerine göre hizalandığını gösteren diyagram; eşleşen satırlar birbirine bağlanmış, farklı satırlar ekleme veya silme olarak işaretlenmiş

Satır, Kelime ve Karakter Ayrıntı Düzeyi

Bir diff'in ayrıntı düzeyi, karşılaştırma biriminin ne olduğunu belirler. Satır tabanlı diff çoğu araçta varsayılandır: her satır tek bir jeton olarak değerlendirilir. Bu hızlıdır ve bağlamda okunması kolay çıktı üretir; ancak o satırda yalnızca tek kelime değişmiş olsa bile tüm satırı değişmiş olarak işaretler. Kelime düzeyinde diff, LCS çalıştırmadan önce her satırı kelimelere böler. Bu, özellikle düzyazı, yapılandırma değerleri veya JSON için bir satır içinde neyin değiştiğine dair daha ayrıntılı bir resim sunar. Karakter düzeyinde diff daha da ileri giderek uzun bir tanımlayıcı içindeki tek bir değişmiş harfi vurgulayabilir. Boşluk işleme gürültü ekler. CRLF ile biten bir satır ile LF ile biten aynı satır, katı bir bayt karşılaştırmasında farklı görünür. Çoğu araç, diff yapmadan önce satır sonlarını normalleştirme seçeneği sunar. Benzer şekilde, sondaki boşluklar, sekme ile boşluk girintisi farkları ve boş satırlar da gereksiz diff çıktısı üretebilir. Farklı düzenleyicilerden veya işletim sistemlerinden gelen kodu karşılaştırırken boşluk normalleştirmesini etkinleştirmek genellikle doğru varsayılandır.

Çevrimiçi Diff Araçlarının Gizlilik Riski

Çevrimiçi diff ve yapıştırma hizmetleri kullanışlıdır: bir URL açarsınız, iki parçacığı yapıştırırsınız, renkli çıktıyı alırsınız. Sorun, yapıştırdığınız metnin üçüncü taraf bir sunucuya iletilmesidir. Hizmete bağlı olarak bu metin günlüğe kaydedilebilir, dizine eklenebilir, süresiz saklanabilir veya analiz sağlayıcılarıyla paylaşılabilir. Kod hassas materyal içerdiğinde bu durum en kritik öneme sahiptir. Doğrudan kodlanmış kimlik bilgileri, iç ana bilgisayar adları, tescilli iş mantığı veya kişisel olarak tanımlanabilir veriler bir yapıştırmada yer alabilir. Açık sırlar olmasa bile iç kodun yapısı, gizli tutmayı tercih ettiğiniz mimari kararları açığa çıkarabilir. Bu risk varsayımsal değildir. Güvenlik araştırmacıları, genel yapıştırmalarda defalarca kimlik bilgileri ve iç belirteçler bulmuştur. Bazı hizmetler, önbelleklerde veya yedeklerde kopyalar bulunduğundan kullanıcı sildikten sonra bile yapıştırmaları saklar. Metnin bir kez ulaştıktan sonra uzak hizmetin ne yaptığını doğrulamanın yolu yoktur. Tek güvenilir önlem, metni yerel tutmaktır; bu da onu ağ üzerinden hiçbir zaman göndermeyen bir araçta çalıştırmak anlamına gelir.

text-diff aracında iki kod parçacığı karşılaştırılırken sıfır giden istek gösteren tarayıcı ağ panelinin ekran görüntüsü

Yerel Diff İçin Pratik Kullanım Alanları

Diff yalnızca kod incelemesi için değildir. Yerel bir diff'in yararlı olduğu birkaç yaygın durum: Bir belge veya yapılandırma dosyasındaki değişiklikleri kaydetmeden önce inceleme. İki dağıtım arasında tam olarak neyin değiştiğini anlamak için bir Dockerfile, Nginx yapılandırması veya Kubernetes manifestosunun iki sürümünü karşılaştırma. Ortamlar arasındaki yapılandırma kaymasını kontrol etme. Üretim ve hazırlık ortamı yapılandırmalarının ana bilgisayar adları ve sırlar dışında aynı olması gerekiyorsa, bir diff anında istenmeyen sapmaları gösterir. Hata ayıklama sırasında API yanıtlarını karşılaştırma. REST veya GraphQL API'sinden iki JSON yükünü yapıştırıp kelime düzeyinde diff çalıştırmak, yüzlerce satırı manuel okumadan eklenen alanları, değişen değerleri veya kaldırılan anahtarları tespit eder. Bir temel çizgiye karşı yapay zeka tarafından üretilen kodu inceleme. Bir model bir işlevi yeniden yazdığında, satır düzeyinde diff hangi mantığın değiştiğini ve hangisinin aynı kaldığını her iki sürümü bağımsız olarak okumaktan daha hızlı gösterir. Tüm bu durumlarda ilgili metin hassas olabilir ve uzak bir sunucudan uzak tutmak açık seçimdir.

Yüklemeden Tarayıcıda Yapma

Bu sitedeki text-diff aracı, tüm diff hesaplamayı JavaScript kullanarak tarayıcınızda çalıştırır. İki metni iki panele yapıştırırsınız ve diff, taraf başına 3000 satıra kadar, satır satır hemen oluşturulur. Bir sunucuya hiçbir şey gönderilmez. Metin hiçbir zaman cihazınızı terk etmez. Uygulama, satırlar üzerinde çalışan standart bir LCS tabanlı algoritma kullanır: her satır bir token'dır ve araç, iki sürüm arasındaki en uzun ortak alt diziyi bularak bir satırın değişmeden mi kaldığını, eklendiğini mi yoksa kaldırıldığını mı belirler. Değişmeyen satırlar vurgusuz, eklenen satırlar yeşil, kaldırılan satırlar kırmızı renkte gösterilir; yanlarında çalışan bir ekleme ve silme sayacı bulunur. Bugün kelime düzeyinde veya karakter düzeyinde bir mod ve boşluk normalleştirme seçeneği yoktur, bu yüzden yalnızca sondaki boşluk veya satır sonu biçiminde farklılık gösteren bir satır yine de değişmiş olarak görünür. Hesaplama istemci tarafında çalıştığından çevrimdışı çalışır. Hesap, geçmiş veya saklama yoktur. Yerel bir yapılandırma dosyasını bir şablonla karşılaştırabilir, uygulamadan önce bir yamayı inceleyebilir veya bu metnin herhangi bir üçüncü tarafa ulaşması olmadan iki API yanıtını kontrol edebilirsiniz.

Bu makaledeki araçlar

Sıkça sorulan sorular

Kod için satır tabanlı diff mi yoksa kelime tabanlı diff mi daha iyidir?

Çoğu kod inceleme görevi için satır tabanlı diff standarttır ve okunması en kolay olandır; çünkü kod satırlara göre yapılandırılmıştır. Kelime tabanlı diff, tek satırlık bir JSON değeri gibi satırlar uzun ve yalnızca küçük bir kısmı değiştiğinde yardımcı olabilir, ancak bu araç yalnızca satır düzeyinde karşılaştırma yapar; bu durumda, vurgulanan satırı bir işaretçi olarak kullanıp içindeki daha küçük farkı gözle bulun.

HTTPS kullansalar bile çevrimiçi diff araçları neden gizlilik riski oluşturur?

HTTPS, metni iletim sırasında dinlemeye karşı korur; ancak sunucuya ulaştıktan sonra koruma sağlamaz. Hizmet operatörü yapıştırılan içeriğe tam erişime sahiptir ve bunu günlüğe kaydedebilir, saklayabilir veya paylaşabilir. TLS, taşıma güvenliğiyle ilgilidir; alıcının verilerle ne yaptığıyla değil.

text-diff aracı geçmiş karşılaştırmaları saklar mı?

Hayır. Aracın arka ucu yoktur ve herhangi bir ağ isteği yapmaz. Sekmeyi kapattığınızda veya yeniden yüklediğinizde metin kaybolur. Hesap, kaydedilmiş geçmiş ve sunucu tarafı günlüğü yoktur.