ToolDeck

เปรียบเทียบข้อความ

เปรียบเทียบข้อความสองอย่างแบบเคียงข้างและเน้นความแตกต่างบรรทัดต่อบรรทัด

ลองตัวอย่าง

ข้อความ A

ข้อความ B

ประมวลผลในเครื่อง · ปลอดภัยในการวางข้อมูลลับ
ประมวลผลในเครื่อง · ปลอดภัยในการวางข้อมูลลับ

Text Diff คืออะไร?

Text diff (ย่อมาจาก "difference") คือผลลัพธ์ของการเปรียบเทียบข้อความสองบล็อกและระบุว่าบรรทัดใดถูกเพิ่ม ลบ หรือคงเดิม แนวคิดนี้มีต้นกำเนิดจากยูทิลิตี Unix diff ที่เปิดตัวครั้งแรกในปี 1974 ในฐานะส่วนหนึ่งของ Version 5 Unix ปัจจุบัน text diff เป็นรากฐานของระบบควบคุมเวอร์ชันอย่าง Git ซึ่งทุก commit เก็บ diff แทนที่จะเก็บสำเนาเต็มของแต่ละไฟล์

อัลกอริทึม diff ค้นหา Longest Common Subsequence (LCS) ระหว่างลำดับบรรทัดสองชุด บรรทัดที่อยู่ใน LCS จะถูกทำเครื่องหมายว่าไม่เปลี่ยนแปลง บรรทัดในข้อความต้นฉบับที่ไม่อยู่ใน LCS จะถูกทำเครื่องหมายว่าลบออก บรรทัดในข้อความที่แก้ไขที่ไม่อยู่ใน LCS จะถูกทำเครื่องหมายว่าเพิ่มใหม่ ผลลัพธ์คือชุดการเปลี่ยนแปลงขั้นต่ำที่จำเป็นเพื่อแปลงข้อความหนึ่งไปเป็นอีกข้อความหนึ่ง

ผลลัพธ์ diff มีหลายรูปแบบ Unified diff (ค่าเริ่มต้นสำหรับ git diff) ใส่คำนำหน้าบรรทัดที่ลบด้วยเครื่องหมายลบและบรรทัดที่เพิ่มด้วยเครื่องหมายบวก Side-by-side diff จัดเรียงข้อความทั้งสองในคอลัมน์คู่ขนาน เครื่องมือนี้ใช้การเปรียบเทียบบรรทัดต่อบรรทัดพร้อมสีที่กำหนด: สีเขียวสำหรับบรรทัดที่เพิ่ม สีแดงสำหรับบรรทัดที่ลบ และสีกลางสำหรับบรรทัดที่ไม่เปลี่ยนแปลง บรรทัดที่ไม่เปลี่ยนแปลงจะแสดงโดยไม่มีคำนำหน้าตามค่าเริ่มต้น แต่สามารถซ่อนได้เพื่อโฟกัสเฉพาะสิ่งที่เปลี่ยนแปลง

ทำไมต้องใช้เครื่องมือ Text Diff ออนไลน์?

การเปรียบเทียบข้อความในเทอร์มินัลต้องติดตั้งยูทิลิตี diff และจัดการกับ command-line flags เครื่องมือ diff บนเบราว์เซอร์ขจัดความยุ่งยากนั้นทั้งหมด

เปรียบเทียบได้ทันที
วางข้อความสองบล็อกและดูความแตกต่างที่เน้นไว้ทันที ไม่ต้องสร้างไฟล์ ไม่ต้องจำคำสั่ง ไม่ต้องแยกวิเคราะห์ผลลัพธ์
🔒
ประมวลผลแบบเน้นความเป็นส่วนตัว
การเปรียบเทียบทั้งหมดเกิดขึ้นในเบราว์เซอร์ของคุณโดยใช้ JavaScript ข้อความของคุณไม่เคยออกจากอุปกรณ์ ซึ่งสำคัญเมื่อ diff ไฟล์คอนฟิก ข้อมูลรับรอง หรือโค้ดที่เป็นกรรมสิทธิ์
📋
ผลลัพธ์พร้อมคัดลอก
ผลลัพธ์ diff ใช้คำนำหน้ามาตรฐาน + / - ที่ตรงกับรูปแบบ unified diff คุณสามารถคัดลอกผลลัพธ์ไปใส่ใน commit message, ความคิดเห็น code review หรือรายงานบัก
🌐
ไม่ต้องเข้าสู่ระบบหรือติดตั้ง
ใช้งานได้บนอุปกรณ์ใดก็ได้ที่มีเบราว์เซอร์ ไม่ต้องสร้างบัญชี ไม่ต้องติดตั้ง extension ไม่ต้องใช้แอปพลิเคชันบนเดสก์ท็อป เปิดหน้าและเริ่มเปรียบเทียบได้เลย

กรณีการใช้งาน Text Diff

การพัฒนา Frontend
เปรียบเทียบ CSS หรือ HTML ที่ถูก minify ก่อนและหลัง build step เพื่อตรวจจับการเปลี่ยนแปลงที่ไม่ตั้งใจใน markup หรือสไตล์ที่สร้างขึ้น
วิศวกรรม Backend
Diff การตอบสนอง API ข้ามสภาพแวดล้อม (staging เทียบกับ production) เพื่อยืนยันว่า deployment ไม่ได้นำการเปลี่ยนแปลงข้อมูลที่ไม่คาดคิดมาใช้
DevOps และโครงสร้างพื้นฐาน
เปรียบเทียบ Kubernetes manifest, Terraform plan หรือการตั้งค่า Nginx ก่อนนำการเปลี่ยนแปลงไปใช้กับ cluster หรือเซิร์ฟเวอร์ที่ใช้งานจริง
QA และการทดสอบ
ยืนยันว่าผลลัพธ์การทดสอบตรงกับ baseline ที่คาดหวังโดย diff ผลลัพธ์จริงกับไฟล์ snapshot ที่จัดเก็บไว้
วิศวกรรมข้อมูล
เปรียบเทียบ CSV header หรือคำนิยาม SQL schema ข้ามการ migration ฐานข้อมูลเพื่อยืนยันว่าคอลัมน์ถูกเพิ่มหรือเปลี่ยนชื่ออย่างถูกต้อง
การเรียนรู้และการศึกษา
เปรียบเทียบวิธีแก้ปัญหาของคุณกับการ implement อ้างอิงบรรทัดต่อบรรทัดเพื่อหาว่า logic ของคุณแตกต่างจากแนวทางที่คาดหวังตรงไหน

รูปแบบผลลัพธ์ 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

การทำงานของ Line Diff: อัลกอริทึม LCS

เครื่องมือ line-diff ส่วนใหญ่ รวมถึงเครื่องมือนี้ ใช้อัลกอริทึม Longest Common Subsequence (LCS) LCS ค้นหาชุดบรรทัดที่ใหญ่ที่สุดที่ปรากฏในข้อความทั้งสองในลำดับสัมพัทธ์เดียวกัน โดยไม่จำเป็นต้องต่อเนื่องกัน บรรทัดที่ไม่อยู่ใน LCS คือความแตกต่างที่แท้จริง

อัลกอริทึม LCS มาตรฐานใช้ dynamic programming และทำงานใน O(m x n) โดยที่ m และ n คือจำนวนบรรทัดของข้อความทั้งสอง สำหรับไฟล์ขนาดใหญ่ ตัวแปรที่ปรับปรุงเช่น Myers' diff algorithm (ที่ใช้โดย Git) ลดความซับซ้อนเป็น O(n + d^2) โดยที่ d คือจำนวนความแตกต่าง ทำให้เร็วเมื่อส่วนใหญ่ของบรรทัดเหมือนกัน

1. สร้างตาราง DP
สร้างเมทริกซ์ขนาด (m+1) x (n+1) สำหรับแต่ละคู่บรรทัด เก็บความยาวของ common subsequence ที่ยาวที่สุดที่พบจนถึงขณะนั้น บรรทัดที่เท่ากันจะขยายค่าแนวทแยงมุมขึ้น 1
2. ย้อนกลับ
เดินจากมุมล่างขวาของเมทริกซ์กลับไปที่ (0,0) การเคลื่อนที่ตามแนวทแยงมุมบนบรรทัดที่เท่ากันสร้างรายการ "ไม่เปลี่ยนแปลง" การเคลื่อนที่แนวนอนหรือแนวตั้งสร้างรายการ "เพิ่ม" หรือ "ลบ"
3. แสดงผลลัพธ์
แมปแต่ละรายการเป็นบรรทัดที่แสดง: บรรทัดที่ไม่เปลี่ยนแปลงไม่มีคำนำหน้า บรรทัดที่เพิ่มได้รับ + บรรทัดที่ลบได้รับ - ใส่สีเพื่อความชัดเจนในการมองเห็น

ตัวอย่างโค้ด

การ implement การเปรียบเทียบข้อความบรรทัดต่อบรรทัดใน JavaScript, Python, Go และ command line แต่ละตัวอย่างสร้างผลลัพธ์ในรูปแบบ 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

คำถามที่พบบ่อย

ความแตกต่างระหว่าง line diff และ character diff คืออะไร?
Line diff เปรียบเทียบข้อความบรรทัดต่อบรรทัด: ถ้าอักขระใดบนบรรทัดเปลี่ยน บรรทัดทั้งหมดจะถูกทำเครื่องหมายว่าลบและเวอร์ชันใหม่จะถูกทำเครื่องหมายว่าเพิ่ม Character diff (หรือ word diff) ทำงานในระดับที่ละเอียดกว่า โดยทำเครื่องหมายอักขระหรือคำที่เฉพาะเจาะจงที่เปลี่ยนภายในบรรทัด Line diff เป็นมาตรฐานสำหรับ code review; character diff มีประโยชน์มากกว่าสำหรับการแก้ไขงานเขียน
git diff ทำงานภายในอย่างไร?
Git ใช้ Myers' diff algorithm ตามค่าเริ่มต้น ซึ่งค้นหา edit script ที่สั้นที่สุด (จำนวนการแทรกและการลบขั้นต่ำ) ระหว่างสองไฟล์ Git เก็บผลลัพธ์ในรูปแบบ unified diff พร้อม @@ hunk header ที่ระบุหมายเลขบรรทัด เมื่อคุณรัน git diff, Git เปรียบเทียบ working tree กับ index (staging area) ไม่ใช่ commit ล่าสุด เว้นแต่คุณจะส่ง HEAD อย่างชัดเจน
ฉันสามารถ diff ไฟล์ไบนารีด้วยเครื่องมือ text diff ได้หรือไม่?
ไม่ได้ เครื่องมือ text diff แบ่งอินพุตตามอักขระขึ้นบรรทัดใหม่และเปรียบเทียบสตริง ไฟล์ไบนารีมีลำดับไบต์ตามอำเภอใจที่สร้างการแบ่งบรรทัดที่ไม่มีความหมาย สำหรับการเปรียบเทียบไบนารี ให้ใช้เครื่องมือ hex diff หรือการเปรียบเทียบ checksum ระดับไฟล์ (sha256sum บนทั้งสองไฟล์)
ข้อมูลของฉันถูกส่งไปยังเซิร์ฟเวอร์เมื่อใช้เครื่องมือนี้หรือไม่?
ไม่ เครื่องมือนี้ทำงานทั้งหมดในเบราว์เซอร์ของคุณ การคำนวณ diff ใช้การ implement LCS ใน JavaScript ที่ประมวลผลฝั่งไคลเอนต์ ไม่มีการส่งคำขอเครือข่ายพร้อมเนื้อหาข้อความของคุณ คุณสามารถยืนยันได้โดยเปิดแท็บ Network ของเบราว์เซอร์ขณะใช้เครื่องมือ
รูปแบบ unified diff คืออะไร?
Unified diff คือรูปแบบผลลัพธ์ที่ใช้โดย diff -u และ git diff แสดงบรรทัดที่เปลี่ยนแปลงด้วยคำนำหน้า - (ลบ) และ + (เพิ่ม) นำหน้าด้วย @@ header ที่ระบุช่วงหมายเลขบรรทัดในทั้งสองไฟล์ บรรทัดบริบท (ไม่เปลี่ยนแปลง) มีคำนำหน้าเป็นช่องว่าง Unified diff เป็นรูปแบบที่พบบ่อยที่สุดสำหรับ patch, pull request และเครื่องมือ code review
ฉันจะเปรียบเทียบไฟล์ขนาดใหญ่ที่มีความแตกต่างจำนวนมากได้อย่างไร?
สำหรับไฟล์ที่มีหลายพันบรรทัด เครื่องมือบนเบราว์เซอร์ใช้ได้แต่อาจช้าลงเนื่องจากอัลกอริทึม LCS ปรับขนาดแบบกำลังสอง สำหรับ diff ขนาดใหญ่มาก เครื่องมือ command-line อย่าง diff หรือ git diff เร็วกว่าเพราะใช้การ implement C ที่ปรับปรุงและสามารถ stream ผลลัพธ์ได้ คุณยังสามารถกรองบรรทัดที่ไม่เปลี่ยนแปลง (ปิด "แสดงบรรทัดที่ไม่เปลี่ยนแปลง" ในเครื่องมือนี้) เพื่อโฟกัสเฉพาะการเปลี่ยนแปลง
three-way merge diff คืออะไร?
Three-way merge เปรียบเทียบสองเวอร์ชันที่แก้ไขของไฟล์กับ ancestor ร่วม (base) Git ใช้สิ่งนี้ระหว่าง git merge และ git rebase มันระบุการเปลี่ยนแปลงที่เกิดขึ้นในแต่ละ branch เทียบกับ base และรวมเข้าด้วยกัน เมื่อทั้งสอง branch แก้ไขบรรทัดเดียวกัน Git รายงาน merge conflict Three-way merge ต้องการอินพุตสามรายการ ในขณะที่ diff มาตรฐานต้องการเพียงสองรายการ

เครื่องมือที่เกี่ยวข้อง

เครื่องนับคำนับคำ ตัวอักษร ประโยค ย่อหน้า และประมาณเวลาอ่านตัวแปลง Caseแปลงข้อความระหว่าง uppercase, lowercase, title case, camelCase, snake_case และรูปแบบอื่นๆเครื่องมือสร้าง Lorem Ipsumสร้างข้อความตัวอย่าง Lorem Ipsum โดยกำหนดจำนวนย่อหน้าและคำได้ตัวเรียงบรรทัดเรียงบรรทัดตามตัวอักษร ตามความยาว ย้อนกลับ หรือสุ่มลำดับบรรทัดตัวลบบรรทัดซ้ำลบบรรทัดที่ซ้ำกันออกจากข้อความ เก็บไว้เฉพาะบรรทัดที่ไม่ซ้ำกันตัวทดสอบ Regexทดสอบ regular expressions กับข้อความและดูผลการจับคู่ที่เน้นสีทั้งหมดดูตัวอย่าง Markdownดูตัวอย่างข้อความ Markdown ที่แสดงผลเป็น HTML แบบเรียลไทม์ตัวสร้างรหัสผ่านสร้างรหัสผ่านสุ่มที่แข็งแกร่งด้วยความยาวและชุดอักขระที่กำหนดเองตัวสร้าง URL Slugแปลงข้อความใดๆ เป็น slug ที่สะอาดและเป็นมิตรต่อ URL