Text Diff

दो टेक्स्ट को साथ-साथ रखकर तुलना करें और पंक्ति दर पंक्ति अंतर हाइलाइट करें

उदाहरण देखें

टेक्स्ट A

टेक्स्ट B

स्थानीय रूप से चलता है · सीक्रेट पेस्ट करना सुरक्षित है
स्थानीय रूप से चलता है · सीक्रेट पेस्ट करना सुरक्षित है

Text Diff क्या है?

Text diff ("difference" का संक्षिप्त रूप) दो पाठ खंडों की तुलना करने और यह पहचानने का परिणाम है कि कौन-सी पंक्तियाँ जोड़ी गईं, हटाई गईं, या अपरिवर्तित रहीं। यह अवधारणा Unix diff उपयोगिता से उत्पन्न हुई, जो पहली बार 1974 में Version 5 Unix के भाग के रूप में जारी की गई थी। आज, text diff, Git जैसी संस्करण नियंत्रण प्रणालियों की आधारशिला है, जहाँ प्रत्येक कमिट प्रत्येक फ़ाइल की पूर्ण प्रतिलिपि के बजाय एक diff संग्रहीत करता है।

एक diff एल्गोरिदम दो पंक्ति-अनुक्रमों के बीच Longest Common Subsequence (LCS) खोजता है। LCS में उपस्थित पंक्तियाँ अपरिवर्तित चिह्नित होती हैं। मूल पाठ में मौजूद लेकिन LCS में अनुपस्थित पंक्तियाँ हटाई गई चिह्नित होती हैं। संशोधित पाठ में मौजूद लेकिन LCS में अनुपस्थित पंक्तियाँ जोड़ी गई चिह्नित होती हैं। परिणाम वह न्यूनतम परिवर्तन-समूह है जो एक पाठ को दूसरे में रूपांतरित करने के लिए आवश्यक है।

Diff आउटपुट कई प्रारूपों में आता है। Unified diff (git diff का डिफ़ॉल्ट प्रारूप) हटाई गई पंक्तियों को माइनस चिह्न और जोड़ी गई पंक्तियों को प्लस चिह्न से चिह्नित करता है। Side-by-side diff दोनों पाठों को समानांतर स्तंभों में व्यवस्थित करता है। यह उपकरण रंग-कोडित आउटपुट के साथ पंक्ति-दर-पंक्ति तुलना करता है: जोड़े गए के लिए हरा, हटाए गए के लिए लाल, और अपरिवर्तित के लिए तटस्थ रंग। अपरिवर्तित पंक्तियाँ डिफ़ॉल्ट रूप से बिना किसी उपसर्ग के दिखाई देती हैं, लेकिन केवल परिवर्तनों पर ध्यान केंद्रित करने के लिए उन्हें छिपाया जा सकता है।

ऑनलाइन Text Diff उपकरण क्यों उपयोग करें?

टर्मिनल में पाठ की तुलना करने के लिए diff उपयोगिताएँ स्थापित करनी पड़ती हैं और कमांड-लाइन विकल्पों से जूझना पड़ता है। ब्राउज़र-आधारित diff उपकरण यह बाधा पूरी तरह समाप्त कर देता है।

तत्काल तुलना
दो पाठ खंड चिपकाएँ और अंतर तुरंत हाइलाइट होते देखें। कोई फ़ाइल नहीं बनानी, कोई आदेश याद नहीं रखने, कोई आउटपुट पार्स नहीं करना।
🔒
गोपनीयता-केंद्रित प्रोसेसिंग
सभी तुलना JavaScript का उपयोग करके आपके ब्राउज़र में होती है। आपका पाठ आपके डिवाइस से बाहर नहीं जाता, जो कि कॉन्फ़िगरेशन फ़ाइलों, क्रेडेंशियल्स या स्वामित्व कोड की तुलना करते समय महत्त्वपूर्ण है।
📋
कॉपी-तैयार आउटपुट
diff आउटपुट मानक + / - उपसर्गों का उपयोग करता है जो unified diff प्रारूप से मेल खाते हैं। आप परिणाम को सीधे कमिट संदेशों, कोड समीक्षा टिप्पणियों, या बग रिपोर्ट में कॉपी कर सकते हैं।
🌐
कोई लॉगिन या इंस्टॉलेशन आवश्यक नहीं
ब्राउज़र वाले किसी भी डिवाइस पर कार्य करता है। कोई खाता नहीं, कोई एक्सटेंशन नहीं, कोई डेस्कटॉप एप्लिकेशन नहीं। पेज खोलें और तुलना शुरू करें।

Text Diff के उपयोग के अवसर

Frontend विकास
अनपेक्षित परिवर्तन पकड़ने के लिए किसी बिल्ड चरण से पहले और बाद में संकुचित CSS या HTML आउटपुट की तुलना करें।
Backend इंजीनियरिंग
यह सत्यापित करने के लिए कि किसी deployment ने अप्रत्याशित डेटा परिवर्तन नहीं किए, विभिन्न environments (staging बनाम production) में API प्रतिक्रियाओं की तुलना करें।
DevOps और Infrastructure
किसी सक्रिय क्लस्टर या सर्वर पर परिवर्तन लागू करने से पहले Kubernetes मैनिफ़ेस्ट, Terraform योजनाएँ, या Nginx कॉन्फ़िगरेशन की तुलना करें।
QA और परीक्षण
वास्तविक परिणाम की किसी संग्रहीत स्नैपशॉट फ़ाइल से तुलना करके सत्यापित करें कि परीक्षण आउटपुट अपेक्षित आधार रेखाओं से मेल खाता है।
डेटा इंजीनियरिंग
यह पुष्टि करने के लिए कि स्तंभ सही ढंग से जोड़े या नाम बदले गए, डेटाबेस माइग्रेशन में CSV शीर्षकों या SQL स्कीमा परिभाषाओं की तुलना करें।
अध्ययन और पाठ्यक्रम
अपने तर्क के अपेक्षित दृष्टिकोण से कहाँ भिन्न है यह जानने के लिए अपने समाधान की संदर्भ कार्यान्वयन से पंक्ति-दर-पंक्ति तुलना करें।

Diff आउटपुट प्रारूपों की तुलना

Diff उपकरण कई प्रारूपों में आउटपुट उत्पन्न करते हैं। नीचे दी गई तालिका सबसे सामान्य प्रारूपों का सारांश देती है, उन्हें कौन उत्पन्न करता है, और प्रत्येक कब उपयोगी है।

प्रारूपउपकरण / स्रोतविवरण
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

पंक्ति Diff कैसे कार्य करता है: LCS एल्गोरिदम

अधिकांश पंक्ति-diff उपकरण, इस उपकरण सहित, Longest Common Subsequence (LCS) एल्गोरिदम का उपयोग करते हैं। LCS पंक्तियों के सबसे बड़े समुच्चय को खोजता है जो दोनों पाठों में समान सापेक्ष क्रम में उपस्थित हों, बिना सन्निकट होने की आवश्यकता के। LCS में न आने वाली पंक्तियाँ ही वास्तविक अंतर हैं।

मानक LCS एल्गोरिदम गतिशील प्रोग्रामिंग का उपयोग करता है और O(m x n) समय में चलता है, जहाँ m और n दोनों पाठों की पंक्ति संख्याएँ हैं। बड़ी फ़ाइलों के लिए, Myers' diff एल्गोरिदम (Git द्वारा उपयोग किया गया) जैसे अनुकूलित संस्करण इसे O(n + d^2) तक घटाते हैं, जहाँ d अंतरों की संख्या है, जो तब तेज़ होता है जब अधिकांश पंक्तियाँ साझा हों।

1. DP तालिका बनाएँ
एक (m+1) x (n+1) matrix बनाएँ। प्रत्येक पंक्ति-युग्म के लिए, अब तक देखे गए सबसे लंबे सामान्य अनुक्रम की लंबाई संग्रहीत करें। समान पंक्तियाँ विकर्ण मान को 1 से बढ़ाती हैं।
2. Backtracking
matrix के निचले-दाएँ कोने से (0,0) तक वापस चलें। समान पंक्तियों पर विकर्ण चाल "अपरिवर्तित" प्रविष्टियाँ उत्पन्न करती हैं। क्षैतिज या ऊर्ध्वाधर चाल "जोड़ी गई" या "हटाई गई" प्रविष्टियाँ उत्पन्न करती हैं।
3. आउटपुट प्रस्तुत करें
प्रत्येक प्रविष्टि को एक प्रदर्शन पंक्ति में रूपांतरित करें: अपरिवर्तित पंक्तियों को कोई उपसर्ग नहीं, जोड़ी गई पंक्तियों को +, हटाई गई पंक्तियों को - मिलता है। दृश्य स्पष्टता के लिए रंग-कोडिंग लागू करें।

कोड उदाहरण

JavaScript, Python, Go, और कमांड लाइन में पंक्ति-दर-पंक्ति पाठ तुलना के कार्यान्वयन। प्रत्येक उदाहरण unified-style diff आउटपुट उत्पन्न करता है।

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

अक्सर पूछे जाने वाले प्रश्न

पंक्ति diff और वर्ण diff में क्या अंतर है?
पंक्ति diff पाठ की पंक्ति-दर-पंक्ति तुलना करता है: यदि किसी पंक्ति पर कोई भी वर्ण बदलता है, तो पूरी पंक्ति हटाई गई चिह्नित होती है और नया संस्करण जोड़ी गई चिह्नित होता है। वर्ण diff (या word diff) अधिक सूक्ष्म स्तर पर कार्य करता है, किसी पंक्ति के भीतर बदले गए विशिष्ट वर्णों या शब्दों को चिह्नित करता है। पंक्ति diff कोड समीक्षा के लिए मानक है; वर्ण diff गद्य संपादन के लिए अधिक उपयोगी है।
git diff आंतरिक रूप से कैसे कार्य करता है?
Git डिफ़ॉल्ट रूप से Myers' diff एल्गोरिदम का उपयोग करता है, जो दो फ़ाइलों के बीच सबसे छोटी संपादन स्क्रिप्ट (सम्मिलन और विलोपन की न्यूनतम संख्या) खोजता है। Git परिणाम को unified diff प्रारूप में @@ hunk शीर्षकों के साथ संग्रहीत करता है जो पंक्ति संख्याएँ दर्शाते हैं। जब आप git diff चलाते हैं, Git कार्यशील ट्री की तुलना इंडेक्स (staging area) से करता है, न कि अंतिम कमिट से, जब तक आप स्पष्ट रूप से HEAD नहीं देते।
क्या मैं text diff उपकरण से बाइनरी फ़ाइलों की तुलना कर सकता हूँ?
नहीं। Text diff उपकरण इनपुट को नई पंक्ति वर्णों पर विभाजित करते हैं और स्ट्रिंग की तुलना करते हैं। बाइनरी फ़ाइलों में मनमाने बाइट अनुक्रम होते हैं जो अर्थहीन पंक्ति विभाजन उत्पन्न करते हैं। बाइनरी तुलना के लिए, hex diff उपकरण या फ़ाइल-स्तरीय चेकसम तुलना (दोनों फ़ाइलों पर sha256sum) उपयोग करें।
क्या इस उपकरण का उपयोग करते समय मेरा डेटा किसी सर्वर पर भेजा जाता है?
नहीं। यह उपकरण पूरी तरह आपके ब्राउज़र में चलता है। diff गणना एक JavaScript LCS कार्यान्वयन का उपयोग करती है जो क्लाइंट-साइड निष्पादित होती है। आपके पाठ के साथ कोई नेटवर्क अनुरोध नहीं किया जाता। आप उपकरण का उपयोग करते समय अपने ब्राउज़र का Network टैब खोलकर इसे सत्यापित कर सकते हैं।
Unified diff प्रारूप क्या है?
Unified diff, diff -u और git diff द्वारा उपयोग किया जाने वाला आउटपुट प्रारूप है। यह परिवर्तित पंक्तियों को - (हटाई गई) और + (जोड़ी गई) उपसर्गों के साथ दिखाता है, जिसके पहले @@ शीर्षक होते हैं जो दोनों फ़ाइलों में पंक्ति संख्या श्रेणियाँ निर्दिष्ट करते हैं। संदर्भ पंक्तियाँ (अपरिवर्तित) में एक रिक्त स्थान उपसर्ग होता है। Unified diff पैच, pull request और कोड समीक्षा उपकरणों के लिए सबसे सामान्य प्रारूप है।
मैं अनेक अंतरों वाली बड़ी फ़ाइलों की तुलना कैसे करूँ?
हज़ारों पंक्तियों वाली फ़ाइलों के लिए, ब्राउज़र-आधारित उपकरण कार्य करता है लेकिन धीमा हो सकता है क्योंकि LCS एल्गोरिदम quadratically बढ़ता है। बहुत बड़े diff के लिए, diff या git diff जैसे कमांड-लाइन उपकरण तेज़ हैं क्योंकि वे अनुकूलित C कार्यान्वयन का उपयोग करते हैं और आउटपुट स्ट्रीम कर सकते हैं। आप अपरिवर्तित पंक्तियों को भी छिपा सकते हैं (इस उपकरण में "अपरिवर्तित पंक्तियां दिखाएं" बंद करें) ताकि केवल परिवर्तनों पर ध्यान केंद्रित हो सके।
Three-way merge diff क्या है?
Three-way merge दो संशोधित फ़ाइल संस्करणों की उनके सामान्य पूर्वज (आधार) से तुलना करता है। Git इसका उपयोग git merge और git rebase के दौरान करता है। यह आधार के सापेक्ष प्रत्येक शाखा में किए गए परिवर्तनों की पहचान करता है और उन्हें संयुक्त करता है। जब दोनों शाखाएँ एक ही पंक्ति को संशोधित करती हैं, तो Git एक merge conflict की सूचना देता है। Three-way merge के लिए तीन इनपुट आवश्यक हैं, जबकि एक मानक diff को केवल दो की आवश्यकता होती है।

संबंधित टूल

Word Counterशब्द, वर्ण, वाक्य, अनुच्छेद गिनें और पढ़ने का अनुमानित समय जानेंCase Converterटेक्स्ट को uppercase, lowercase, title case, camelCase, snake_case और अन्य फ़ॉर्मैट में बदलेंLorem Ipsum Generatorकॉन्फ़िगर करने योग्य पैराग्राफ और शब्दों के साथ lorem ipsum प्लेसहोल्डर टेक्स्ट जेनरेट करेंलाइन सॉर्टरपंक्तियों को वर्णमाला, लंबाई या यादृच्छिक क्रम में क्रमबद्ध करें या क्रम उलटेंDuplicate Line Removerटेक्स्ट से डुप्लीकेट पंक्तियाँ हटाएँ, केवल अद्वितीय पंक्तियाँ बनाए रखेंRegex Testerकिसी स्ट्रिंग के विरुद्ध रेगुलर एक्सप्रेशन का परीक्षण करें और सभी मिलान हाइलाइट देखेंMarkdown PreviewMarkdown टेक्स्ट को रियल-टाइम में HTML के रूप में प्रदर्शित करेंPassword Generatorकस्टम लंबाई और character set के साथ मज़बूत random पासवर्ड बनाएंSlug Generatorकिसी भी टेक्स्ट को साफ URL-अनुकूल स्लग में परिवर्तित करें