Metin Farkı

İki metni yan yana karşılaştırın ve satır satır farkları vurgulayın

Örnek dene

Metin A

Metin B

Yerel olarak çalışır · Gizli bilgi yapıştırmak güvenlidir
Yerel olarak çalışır · Gizli bilgi yapıştırmak güvenlidir

Metin Diff Nedir?

Metin diff ("fark" kelimesinin kısaltması), iki metin bloğunu karşılaştırıp hangi satırların eklendiğini, hangi satırların kaldırıldığını ve hangilerinin değişmeden kaldığını belirleyen bir işlemin sonucudur. Bu kavram, 1974'te Version 5 Unix'in bir parçası olarak ilk kez yayımlanan Unix diff yardımcı programından kaynaklanmaktadır. Günümüzde metin diff, her commit'in dosyaların tam bir kopyası yerine bir diff depoladığı Git gibi sürüm kontrol sistemlerinin temelini oluşturmaktadır.

Bir diff algoritması, iki satır dizisi arasındaki En Uzun Ortak Alt Diziyi (LCS — Longest Common Subsequence) bulur. LCS'de bulunan satırlar değişmeden kalmış olarak işaretlenir. Orijinal metinde olup LCS'de olmayan satırlar kaldırıldı olarak işaretlenir. Değiştirilmiş metinde olup LCS'de olmayan satırlar ise eklendi olarak işaretlenir. Sonuç, bir metni diğerine dönüştürmek için gereken minimum değişiklikler kümesidir.

Diff çıktısı çeşitli biçimlerde sunulur. Unified diff (git diff için varsayılan), kaldırılan satırların başına eksi işareti, eklenen satırların başına artı işareti koyar. Yan yana diff her iki metni paralel sütunlarda düzenler. Bu araç, renk kodlu çıktıyla satır satır karşılaştırma kullanır: eklemeler yeşil, kaldırmalar kırmızı ve değişmemiş satırlar nötr renkte gösterilir. Değişmemiş satırlar varsayılan olarak ön ek olmaksızın görünür; ancak yalnızca değişikliklere odaklanmak için gizlenebilir.

Çevrimiçi Metin Diff Aracı Neden Kullanılır?

Terminalde metin karşılaştırmak, diff yardımcı programlarını kurmayı ve komut satırı bayraklarıyla uğraşmayı gerektirir. Tarayıcı tabanlı bir diff aracı bu engeli tamamen ortadan kaldırır.

Anında Karşılaştırma
İki metin bloğunu yapıştırın ve farklılıkları hemen vurgulanmış şekilde görün. Dosya oluşturma gerekmez, hatırlanacak komut yok, ayrıştırılacak çıktı yok.
🔒
Gizlilik Öncelikli İşleme
Tüm karşılaştırma işlemi JavaScript kullanılarak tarayıcınızda gerçekleşir. Metniniz cihazınızı hiç terk etmez; bu durum yapılandırma dosyalarını, kimlik bilgilerini veya özel kodu karşılaştırırken önem kazanır.
📋
Kopyalamaya Hazır Çıktı
Diff çıktısı, unified diff biçimiyle örtüşen standart + / - ön eklerini kullanır. Sonucu doğrudan commit mesajlarına, kod inceleme yorumlarına veya hata raporlarına kopyalayabilirsiniz.
🌐
Giriş veya Kurulum Gerektirmez
Tarayıcısı olan her cihazda çalışır. Hesap oluşturma, uzantı veya masaüstü uygulaması yok. Sayfayı açın ve karşılaştırmaya başlayın.

Metin Diff Kullanım Senaryoları

Frontend Geliştirme
Bir derleme adımından önce ve sonra küçültülmüş CSS veya HTML çıktısını karşılaştırarak oluşturulan biçimlendirme veya stillerdeki istenmeyen değişiklikleri yakalayın.
Backend Mühendisliği
Bir dağıtımın beklenmedik veri değişikliklerine yol açmadığını doğrulamak için farklı ortamlardaki (hazırlık ile üretim) API yanıtlarını karşılaştırın.
DevOps ve Altyapı
Değişiklikleri canlı bir küme veya sunucuya uygulamadan önce Kubernetes manifest'lerini, Terraform planlarını veya Nginx yapılandırmalarını karşılaştırın.
QA ve Test
Gerçek sonucu depolanmış bir anlık görüntü dosyasıyla karşılaştırarak test çıktısının beklenen temel değerlerle eşleştiğini doğrulayın.
Veri Mühendisliği
Sütunların doğru eklendiğini veya yeniden adlandırıldığını doğrulamak için veritabanı göçleri arasında CSV başlıklarını veya SQL şema tanımlarını karşılaştırın.
Öğrenme ve Eğitim
Mantığınızın beklenen yaklaşımdan nerede saptığını bulmak için çözümünüzü bir referans uygulamasıyla satır satır karşılaştırın.

Diff Çıktı Biçimleri Karşılaştırması

Diff araçları çıktıyı çeşitli biçimlerde üretir. Aşağıdaki tablo en yaygın biçimleri, bunları neyin ürettiğini ve her birinin ne zaman yararlı olduğunu özetlemektedir.

BiçimAraç / KaynakAçıklama
Unified diffdiff -u / git diffPrefixes lines with + / - / space; includes @@ hunk headers
Side-by-sidediff -y / sdiffTwo columns, changed lines aligned horizontally
Context diffdiff -cShows changed lines with surrounding context, marked with ! / + / -
HTML diffPython difflibColor-coded HTML table with inline change highlights
JSON PatchRFC 6902Array of add/remove/replace operations on a JSON document

Satır Diff Nasıl Çalışır: LCS Algoritması

Bu araç dahil çoğu satır diff aracı, En Uzun Ortak Alt Dizi (LCS) algoritmasını kullanır. LCS, her iki metinde de aynı göreli sırada görünen en büyük satır kümesini bulur; bu satırların bitişik olması gerekmez. LCS'de bulunmayan satırlar gerçek farklılıklardır.

Standart LCS algoritması dinamik programlama kullanır ve O(m x n) sürede çalışır; burada m ve n iki metnin satır sayılarıdır. Büyük dosyalar için Git tarafından kullanılan Myers diff algoritması gibi iyileştirilmiş varyantlar bunu O(n + d^2)'ye indirger; burada d fark sayısıdır; bu da satırların büyük çoğunluğu paylaşıldığında algoritmayı hızlandırır.

1. DP Tablosunu Oluşturun
Bir (m+1) x (n+1) matris oluşturun. Her satır çifti için şimdiye kadar görülen en uzun ortak alt dizinin uzunluğunu depolayın. Eşit satırlar köşegen değerini 1 artırır.
2. Geri İzleme
Matrisin sağ alt köşesinden (0,0) noktasına doğru yürüyün. Eşit satırlarda köşegen hareketler "değişmemiş" girişler üretir. Yatay veya dikey hareketler "eklendi" veya "kaldırıldı" girişleri üretir.
3. Çıktıyı Oluşturun
Her girişi bir görüntü satırına eşleyin: değişmemiş satırlar ön ek almaz, eklenen satırlar + alır, kaldırılan satırlar - alır. Görsel netlik için renk kodlaması uygulayın.

Kod Örnekleri

JavaScript, Python, Go ve komut satırında satır satır metin karşılaştırması uygulamaları. Her örnek unified biçiminde diff çıktısı üretir.

JavaScript
// Line-by-line diff using the LCS algorithm
function diffLines(a, b) {
  const linesA = a.split('\n')
  const linesB = b.split('\n')

  // Build LCS table
  const m = linesA.length, n = linesB.length
  const dp = Array.from({ length: m + 1 }, () => new Array(n + 1).fill(0))
  for (let i = 1; i <= m; i++)
    for (let j = 1; j <= n; j++)
      dp[i][j] = linesA[i-1] === linesB[j-1]
        ? dp[i-1][j-1] + 1
        : Math.max(dp[i-1][j], dp[i][j-1])

  // Backtrack to produce diff
  const result = []
  let i = m, j = n
  while (i > 0 || j > 0) {
    if (i > 0 && j > 0 && linesA[i-1] === linesB[j-1]) {
      result.unshift({ type: 'equal', text: linesA[i-1] }); i--; j--
    } else if (j > 0 && (i === 0 || dp[i][j-1] >= dp[i-1][j])) {
      result.unshift({ type: 'add', text: linesB[j-1] }); j--
    } else {
      result.unshift({ type: 'remove', text: linesA[i-1] }); i--
    }
  }
  return result
}

const diff = diffLines("alpha\nbeta\ngamma", "alpha\nbeta changed\ngamma\ndelta")
// → [
//   { type: 'equal',  text: 'alpha' },
//   { type: 'remove', text: 'beta' },
//   { type: 'add',    text: 'beta changed' },
//   { type: 'equal',  text: 'gamma' },
//   { type: 'add',    text: 'delta' }
// ]
Python
import difflib

text_a = """alpha
beta
gamma""".splitlines()

text_b = """alpha
beta changed
gamma
delta""".splitlines()

# Unified diff (same format as git diff)
for line in difflib.unified_diff(text_a, text_b, fromfile='a.txt', tofile='b.txt', lineterm=''):
    print(line)
# --- a.txt
# +++ b.txt
# @@ -1,3 +1,4 @@
#  alpha
# -beta
# +beta changed
#  gamma
# +delta

# HTML side-by-side diff
d = difflib.HtmlDiff()
html = d.make_file(text_a, text_b, fromdesc='Original', todesc='Modified')
Go
package main

import (
	"fmt"
	"strings"
)

// Minimal LCS-based line diff
func diffLines(a, b string) {
	la := strings.Split(a, "\n")
	lb := strings.Split(b, "\n")
	m, n := len(la), len(lb)

	dp := make([][]int, m+1)
	for i := range dp {
		dp[i] = make([]int, n+1)
	}
	for i := 1; i <= m; i++ {
		for j := 1; j <= n; j++ {
			if la[i-1] == lb[j-1] {
				dp[i][j] = dp[i-1][j-1] + 1
			} else if dp[i-1][j] >= dp[i][j-1] {
				dp[i][j] = dp[i-1][j]
			} else {
				dp[i][j] = dp[i][j-1]
			}
		}
	}

	var result []string
	i, j := m, n
	for i > 0 || j > 0 {
		if i > 0 && j > 0 && la[i-1] == lb[j-1] {
			result = append([]string{" " + la[i-1]}, result...)
			i--; j--
		} else if j > 0 && (i == 0 || dp[i][j-1] >= dp[i-1][j]) {
			result = append([]string{"+" + lb[j-1]}, result...)
			j--
		} else {
			result = append([]string{"-" + la[i-1]}, result...)
			i--
		}
	}

	for _, line := range result {
		fmt.Println(line)
	}
}

// Output:
//  alpha
// -beta
// +beta changed
//  gamma
// +delta
CLI (diff / git)
# Compare two files with unified diff (3 lines of context)
diff -u original.txt modified.txt

# Git diff between working tree and last commit
git diff HEAD -- file.txt

# Git diff between two branches
git diff main..feature -- src/

# Side-by-side diff in the terminal
diff -y --width=120 original.txt modified.txt

# Color-coded diff (requires colordiff)
diff -u original.txt modified.txt | colordiff

Sıkça Sorulan Sorular

Satır diff ile karakter diff arasındaki fark nedir?
Satır diff, metni satır satır karşılaştırır: bir satırdaki herhangi bir karakter değişirse, satırın tamamı kaldırıldı olarak işaretlenir ve yeni sürüm eklendi olarak işaretlenir. Karakter diff (veya kelime diff) daha ince bir ayrıntı düzeyinde çalışır; satır içinde değişen belirli karakterleri veya kelimeleri işaretler. Satır diff, kod incelemesi için standarttır; karakter diff ise düzyazı düzenleme için daha kullanışlıdır.
git diff içeride nasıl çalışır?
Git varsayılan olarak Myers diff algoritmasını kullanır; bu algoritma iki dosya arasındaki en kısa düzenleme komut dosyasını (minimum ekleme ve silme sayısını) bulur. Git sonucu, satır numaralarını belirten @@ öbek başlıklarıyla unified diff biçiminde depolar. git diff çalıştırdığınızda Git, açıkça HEAD belirtmediğiniz sürece çalışma ağacını son commit'e değil dizinle (hazırlık alanı) karşılaştırır.
İkili dosyaları metin diff aracıyla karşılaştırabilir miyim?
Hayır. Metin diff araçları girişi yeni satır karakterlerinde böler ve dizeleri karşılaştırır. İkili dosyalar anlamsız satır bölmelerine yol açan rastgele bayt dizileri içerir. İkili karşılaştırma için bir hex diff aracı veya dosya düzeyinde sağlama toplamı karşılaştırması (her iki dosyada sha256sum) kullanın.
Bu aracı kullanırken verilerim sunucuya gönderiliyor mu?
Hayır. Bu araç tamamen tarayıcınızda çalışır. Diff hesaplama, istemci tarafında çalışan bir JavaScript LCS uygulaması kullanır. Metin içeriğinizle herhangi bir ağ isteği yapılmaz. Bunu doğrulamak için aracı kullanırken tarayıcınızın Ağ sekmesini açabilirsiniz.
Unified diff biçimi nedir?
Unified diff, diff -u ve git diff tarafından kullanılan çıktı biçimidir. Değiştirilen satırları - (kaldırıldı) ve + (eklendi) ön ekleriyle gösterir; bunların önünde her iki dosyadaki satır numarası aralıklarını belirten @@ başlıkları bulunur. Bağlam satırları (değişmemiş) bir boşluk ön ekine sahiptir. Unified diff, yamalar, pull request'ler ve kod inceleme araçları için en yaygın biçimdir.
Birçok farklılık içeren büyük dosyaları nasıl karşılaştırırım?
Binlerce satırlık dosyalar için tarayıcı tabanlı araç çalışır; ancak LCS algoritması ikinci dereceden ölçeklendiğinden yavaşlayabilir. Çok büyük diff'ler için diff veya git diff gibi komut satırı araçları, optimize edilmiş C uygulamaları kullandıkları ve çıktıyı akışla iletebildikleri için daha hızlıdır. Yalnızca değişikliklere odaklanmak için bu araçtaki "Değiştirilmemiş satırları göster" seçeneğini kapatarak değişmemiş satırları da filtreleyebilirsiniz.
Üç yönlü birleştirme diff nedir?
Üç yönlü birleştirme, bir dosyanın iki değiştirilmiş sürümünü ortak atalarıyla (taban) karşılaştırır. Git bunu git merge ve git rebase sırasında kullanır. Tabana göre her dalda yapılan değişiklikleri belirler ve bunları birleştirir. Her iki dal da aynı satırı değiştirdiğinde Git bir birleştirme çakışması bildirir. Üç yönlü birleştirme üç girdi gerektirirken standart diff yalnızca iki girdi gerektirir.