ToolDeck

টেক্সট ডিফ

দুটি টেক্সট পাশাপাশি তুলনা করুন এবং লাইন-বাই-লাইন পার্থক্য হাইলাইট করুন

একটি উদাহরণ চেষ্টা করুন

টেক্সট A

টেক্সট B

স্থানীয়ভাবে চলে · গোপন তথ্য পেস্ট করা নিরাপদ
স্থানীয়ভাবে চলে · গোপন তথ্য পেস্ট করা নিরাপদ

টেক্সট Diff কী?

টেক্সট diff ("difference" শব্দের সংক্ষিপ্ত রূপ) হলো দুটি টেক্সট ব্লক তুলনা করে কোন লাইনগুলি যোগ করা হয়েছে, কোনটি সরানো হয়েছে এবং কোনটি অপরিবর্তিত রয়েছে তা চিহ্নিত করার ফলাফল। এই ধারণাটির উৎপত্তি Unix diff ইউটিলিটি থেকে, যা ১৯৭৪ সালে Version 5 Unix-এর অংশ হিসেবে প্রথম প্রকাশিত হয়। আজ, টেক্সট diff হলো Git-এর মতো ভার্সন কন্ট্রোল সিস্টেমের মূল ভিত্তি, যেখানে প্রতিটি কমিট প্রতিটি ফাইলের পূর্ণ কপির পরিবর্তে একটি diff সংরক্ষণ করে।

একটি diff অ্যালগরিদম দুটি লাইনের ক্রমের মধ্যে Longest Common Subsequence (LCS) খুঁজে বের করে। LCS-এ থাকা লাইনগুলি অপরিবর্তিত হিসেবে চিহ্নিত হয়। মূল টেক্সটে আছে কিন্তু LCS-এ নেই এমন লাইনগুলি সরানো হিসেবে চিহ্নিত হয়। পরিবর্তিত টেক্সটে আছে কিন্তু LCS-এ নেই এমন লাইনগুলি যোগ করা হিসেবে চিহ্নিত হয়। ফলাফল হলো একটি টেক্সটকে অন্যটিতে রূপান্তর করতে প্রয়োজনীয় ন্যূনতম পরিবর্তনের সেট।

Diff আউটপুট বিভিন্ন ফরম্যাটে আসে। Unified diff (git diff-এর ডিফল্ট) সরানো লাইনের আগে মাইনাস চিহ্ন এবং যোগ করা লাইনের আগে প্লাস চিহ্ন যোগ করে। Side-by-side diff উভয় টেক্সটকে সমান্তরাল কলামে সাজায়। এই টুলটি রঙ-কোডেড আউটপুট সহ লাইন-বাই-লাইন তুলনা ব্যবহার করে: যোগ করা লাইনের জন্য সবুজ, সরানো লাইনের জন্য লাল এবং অপরিবর্তিত লাইনের জন্য নিরপেক্ষ রঙ। অপরিবর্তিত লাইনগুলি ডিফল্টভাবে কোনো উপসর্গ ছাড়াই দেখানো হয়, তবে শুধুমাত্র পরিবর্তনের দিকে মনোযোগ দিতে এগুলি লুকানো যেতে পারে।

কেন অনলাইন টেক্সট Diff টুল ব্যবহার করবেন?

টার্মিনালে টেক্সট তুলনা করতে diff ইউটিলিটি ইনস্টল করতে হয় এবং কমান্ড-লাইন ফ্ল্যাগ নিয়ে কাজ করতে হয়। ব্রাউজার-ভিত্তিক diff টুল সেই ঝামেলা সম্পূর্ণ দূর করে।

তাৎক্ষণিক তুলনা
দুটি টেক্সট ব্লক পেস্ট করুন এবং তাৎক্ষণিকভাবে পার্থক্য হাইলাইট দেখুন। কোনো ফাইল তৈরির দরকার নেই, কোনো কমান্ড মনে রাখার দরকার নেই, কোনো আউটপুট পার্স করার দরকার নেই।
🔒
ডেটা সম্পূর্ণ প্রাইভেট
সমস্ত তুলনা JavaScript ব্যবহার করে আপনার ব্রাউজারে চলে। আপনার টেক্সট আপনার ডিভাইস ছেড়ে যায় না, যা কনফিগারেশন ফাইল, ক্রেডেনশিয়াল, বা proprietary কোড diff করার সময় গুরুত্বপূর্ণ।
📋
সরাসরি কপি করুন
diff আউটপুট unified diff ফরম্যাটের সাথে মিলে যাওয়া মানক + / - উপসর্গ ব্যবহার করে। আপনি ফলাফলটি সরাসরি কমিট বার্তা, কোড রিভিউ মন্তব্য, বা বাগ রিপোর্টে কপি করতে পারেন।
🌐
লগইন বা ইনস্টলের প্রয়োজন নেই
ব্রাউজার সহ যেকোনো ডিভাইসে কাজ করে। কোনো অ্যাকাউন্ট তৈরি, কোনো এক্সটেনশন, কোনো ডেস্কটপ অ্যাপ নেই। পেজ খুলুন এবং তুলনা শুরু করুন।

টেক্সট Diff-এর ব্যবহারের ক্ষেত্র

ফ্রন্টএন্ড ডেভেলপমেন্ট
বিল্ড স্টেপের আগে ও পরে মিনিফাইড CSS বা HTML আউটপুট তুলনা করুন, যাতে জেনারেটেড মার্কআপ বা স্টাইলে অনিচ্ছাকৃত পরিবর্তন ধরা যায়।
ব্যাকএন্ড ইঞ্জিনিয়ারিং
পরিবেশ জুড়ে API রেসপন্স diff করুন (staging বনাম production) যাচাই করতে যে একটি ডিপ্লয়মেন্ট অপ্রত্যাশিত ডেটা পরিবর্তন আনেনি।
DevOps ও অবকাঠামো
লাইভ ক্লাস্টার বা সার্ভারে পরিবর্তন প্রয়োগের আগে Kubernetes ম্যানিফেস্ট, Terraform প্ল্যান, বা Nginx কনফিগ তুলনা করুন।
QA ও টেস্টিং
প্রকৃত ফলাফলকে একটি সংরক্ষিত স্ন্যাপশট ফাইলের সাথে diff করে যাচাই করুন যে টেস্ট আউটপুট প্রত্যাশিত বেসলাইনের সাথে মিলছে।
ডেটা ইঞ্জিনিয়ারিং
ডেটাবেজ মাইগ্রেশন জুড়ে 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 হলো পার্থক্যের সংখ্যা, যা বেশিরভাগ লাইন একই হলে দ্রুত কাজ করে।

১. DP টেবিল তৈরি করুন
একটি (m+1) x (n+1) ম্যাট্রিক্স তৈরি করুন। প্রতিটি লাইনের জুটির জন্য, এখন পর্যন্ত দেখা সবচেয়ে দীর্ঘ common subsequence-এর দৈর্ঘ্য সংরক্ষণ করুন। সমান লাইনগুলি কর্ণীয় মানকে ১ দিয়ে বাড়ায়।
২. ব্যাকট্র্যাক করুন
ম্যাট্রিক্সের নিচে-ডানদিকের কোণ থেকে (0,0)-এ ফিরে যান। সমান লাইনে কর্ণীয় মুভ "অপরিবর্তিত" এন্ট্রি তৈরি করে। অনুভূমিক বা উল্লম্ব মুভ "যোগ করা" বা "সরানো" এন্ট্রি তৈরি করে।
৩. আউটপুট রেন্ডার করুন
প্রতিটি এন্ট্রিকে একটি প্রদর্শন লাইনে ম্যাপ করুন: অপরিবর্তিত লাইনগুলি কোনো উপসর্গ পায় না, যোগ করা লাইনগুলি + পায়, সরানো লাইনগুলি - পায়। দৃশ্যমান স্পষ্টতার জন্য রঙ কোডিং প্রয়োগ করুন।

কোড উদাহরণ

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 working tree-কে index (staging area)-এর সাথে তুলনা করে, শেষ কমিটের সাথে নয়, যদি না আপনি স্পষ্টভাবে HEAD পাস করেন।
আমি কি টেক্সট diff টুল দিয়ে বাইনারি ফাইল diff করতে পারি?
না। টেক্সট diff টুলগুলি নিউলাইন ক্যারেক্টারে ইনপুট বিভক্ত করে এবং স্ট্রিং তুলনা করে। বাইনারি ফাইলে নির্বিচারে বাইট ক্রম থাকে যা অর্থহীন লাইন বিভাজন তৈরি করে। বাইনারি তুলনার জন্য একটি hex diff টুল বা ফাইল-স্তরের চেকসাম তুলনা (উভয় ফাইলে sha256sum) ব্যবহার করুন।
এই টুল ব্যবহার করার সময় কি আমার ডেটা সার্ভারে পাঠানো হয়?
না। এই টুলটি সম্পূর্ণরূপে আপনার ব্রাউজারে চলে। diff গণনা একটি JavaScript LCS implementation ব্যবহার করে যা ক্লায়েন্ট-সাইডে রান হয়। আপনার টেক্সট বিষয়বস্তু নিয়ে কোনো নেটওয়ার্ক অনুরোধ করা হয় না। আপনি টুল ব্যবহার করার সময় আপনার ব্রাউজারের Network ট্যাব খুলে এটি যাচাই করতে পারেন।
Unified diff ফরম্যাট কী?
Unified diff হলো diff -u এবং git diff দ্বারা ব্যবহৃত আউটপুট ফরম্যাট। এটি পরিবর্তিত লাইনগুলি - (সরানো) এবং + (যোগ করা) উপসর্গ সহ দেখায়, যার আগে @@ হেডার থাকে যা উভয় ফাইলে লাইন নম্বরের পরিসীমা নির্দিষ্ট করে। প্রসঙ্গ লাইনগুলি (অপরিবর্তিত) একটি স্পেস উপসর্গ পায়। Unified diff হলো প্যাচ, pull request এবং কোড রিভিউ টুলের জন্য সবচেয়ে সাধারণ ফরম্যাট।
অনেক পার্থক্য সহ বড় ফাইল কীভাবে তুলনা করব?
হাজার হাজার লাইনের ফাইলের জন্য, ব্রাউজার-ভিত্তিক টুল কাজ করে তবে ধীর হতে পারে কারণ LCS অ্যালগরিদম quadratic হারে বাড়ে। খুব বড় diff-এর জন্য, diff বা git diff-এর মতো কমান্ড-লাইন টুলগুলি দ্রুত কারণ তারা অপ্টিমাইজড C implementation ব্যবহার করে এবং আউটপুট স্ট্রিম করতে পারে। আপনি এই টুলে অপরিবর্তিত লাইনগুলিও ফিল্টার করতে পারেন ("অপরিবর্তিত লাইনগুলি দেখান" টগল বন্ধ করুন) শুধুমাত্র পরিবর্তনের দিকে মনোযোগ দিতে।
থ্রি-ওয়ে মার্জ diff কী?
একটি থ্রি-ওয়ে মার্জ একটি ফাইলের দুটি পরিবর্তিত সংস্করণকে তাদের সাধারণ পূর্বপুরুষ (ভিত্তি)-এর বিপরীতে তুলনা করে। Git এটি git merge এবং git rebase-এর সময় ব্যবহার করে। এটি ভিত্তির তুলনায় প্রতিটি শাখায় করা পরিবর্তন চিহ্নিত করে এবং সেগুলি একত্রিত করে। উভয় শাখা একই লাইন পরিবর্তন করলে, Git একটি merge conflict রিপোর্ট করে। থ্রি-ওয়ে মার্জের জন্য তিনটি ইনপুট প্রয়োজন, যেখানে একটি মানক diff-এর শুধুমাত্র দুটি প্রয়োজন।

সম্পর্কিত টুলস

শব্দ গণনাকারীশব্দ, অক্ষর, বাক্য, অনুচ্ছেদ গণনা করুন এবং পড়ার সময় অনুমান করুনকেস রূপান্তরকারীটেক্সট uppercase, lowercase, title case, camelCase, snake_case এবং আরও কেসের মধ্যে রূপান্তর করুনলোরেম ইপসাম জেনারেটরকনফিগারযোগ্য অনুচ্ছেদ ও শব্দ সহ লোরেম ইপসাম প্লেসহোল্ডার টেক্সট তৈরি করুনলাইন সর্টারলাইনগুলি বর্ণানুক্রমিক, দৈর্ঘ্য অনুযায়ী, বিপরীত বা র্যান্ডমলি সাজানসদৃশ লাইন অপসারণকারীপাঠ্য থেকে সদৃশ লাইনগুলি সরান, শুধুমাত্র অনন্য লাইনগুলি রাখুনRegex পরীক্ষকস্ট্রিং-এ রেগুলার এক্সপ্রেশন পরীক্ষা করুন এবং সমস্ত ম্যাচ হাইলাইট দেখুনMarkdown প্রিভিউরিয়েল টাইমে Markdown টেক্সট HTML হিসেবে রেন্ডার করে প্রিভিউ দেখুনপাসওয়ার্ড জেনারেটরকাস্টমাইজযোগ্য দৈর্ঘ্য এবং ক্যারেক্টার সেট দিয়ে শক্তিশালী র‍্যান্ডম পাসওয়ার্ড তৈরি করুনস্লাগ জেনারেটরযেকোনো টেক্সটকে পরিষ্কার URL-বান্ধব স্লাগে রূপান্তর করুন