Command Palette

Search for a command to run...

텍스트 차이 검사기: 실제로 볼 수 없는 눈알 변화를 중지합니다

텍스트 차이 검사기: 실제로 볼 수 없는 눈알 변화를 중지합니다

T
Toolz Team
|Jul 5, 2026|14 최소 읽기

텍스트 도구 모음의 일부

WP Adminify 고객은 한 번 나에게 자신의 플러그인 설정의 두 가지 내보내기를 보냈습니다 - & quot;업데이트 전에 모든 것이 작동; 후,관리자 메뉴가 깨졌습니다. 다른 아무것도 변경되지 않았습니다.& quot; 두 개의 JSON blob,각각 약 340 줄. 나는 나란히,두 번 읽고,자신있게 그와 동의했습니다: 동일. 아무것도 변경되지 않았습니다. 우리의 버그 여야합니다.

그것은 was't. 나는 마침내 내 눈을 신뢰 중지하고 두 파일을 diffed 때,거기에 라인 217 에 있었다: 메뉴 역할 키에서 갔다했다 "administrator""administrator "- 후행 공간으로. 보이지 않는 문자 하나. 나는 개인적으로 그것을 두 번 지나서 읽었습니다. 왜냐하면 인간의 눈은 don't 문자열을 비교하기 때문입니다; 그들은 패턴 일치 모양, 그리고 administrator 그리고 administrator 같은 모양을 가지세요.

그 지원 티켓은 내 규칙을 영구적으로 변경했습니다: 두 텍스트가 열 줄 정도보다 길면,나는 don't 를 읽음으로써 비교한다. 이제까지. diff 알고리즘은 속일 수 있는 패턴 일치 단축키가 없습니다 - 모든 문자를 비교하고 정확히 무엇이 다른지 보고합니다. The 텍스트 차이 도구 on Toolz.dev 는 브라우저에서 이 작업을 수행하며,이는 고객이 구성,계약 및 미공개 코드를 결코 머신을 떠나지 않는다는 것을 의미합니다. Here's diffing 이 실제로 작동하는 방식과 잘 사용하는 방법.

TL;DR: 몇 줄보다 긴 텍스트를 시각적으로 비교하지 마십시오. 눈은 후행 공백,바뀐 숫자 및 단일 단어 편집을 놓칩니다. 두 버전을 모두 에 붙여넣습니다 텍스트 차이 도구: 녹색 = 추가됨, 빨간색 = 제거됨, 동일한 마이어스 알고리즘 계열로 계산됩니다 git diff. 사용 라인 모드 코드 및 구성의 경우 워드 모드 산문과 계약서의 경우 구조화된 데이터의 경우 JSON 차이점 텍스트 대신 의미로 비교합니다. 모든 것이 클라이언트 측에서 실행됩니다.


Diff 알고리즘은 실제로 어떻게 작동합니까?

핵심 아이디어: 찾기 가장 긴 공통 부분 시퀀스 (LCS) 두 텍스트 중 - 둘 다에 나타나는 가장 긴 줄 (또는 단어 또는 문자) 순서는 동일한 순서입니다. LCS 의 모든 것은 "unchanged." 버전 A 에 남겨진 Whatever's 는 삭제; 버전 B 에 남겨진 whatever's 는 추가입니다. A "modified" line 은 단지 삭제이며 우연히 서로 옆에 앉게 되는 추가입니다.

이것을 효율적으로 계산하는 표준 방법은 Eugene Myers' 1986 년 논문, "O (ND) 차이 알고리즘과 그 변형". 우아한 부분은 복잡성 경계가 말하는 것입니다: N 는 입력 크기이지만 는 이다 차이 수. 거의 동일한 두 텍스트는 얼마나 오래 있든 거의 즉시 다릅니다. 왜냐하면 algorithm's 작업은 단지 얼마나 큰지가 아니라 얼마나 다른지에 따라 확장되기 때문입니다. That's 왜 한 줄씩 다른 두 개의 300줄 구성을 다르게 하면 즉각적으로 느껴집니다. 알고리즘은 거의 아무것도 하지 않고 있는데, 이는 바로 눈이 가장 많은 일을 하고 실패하는 상황입니다.

이 동일한 알고리즘 계열이 기본 엔진입니다 git diff, GNU diff그리고 대부분의 비교 도구 you've ever used. (Git 도 제공합니다 patience 그리고 histogram 때로는 동일한 변경 사항에 대해 사람이 읽을 수 있는 더 많은 그룹화를 생성하는 변형입니다 세트 변경 사항은 동일하며 프레젠테이션이 다릅니다.)

하나의 중요한 비명백한 속성: diff 는 항상 고유하지 않습니다. 기존의 두 빈 줄 사이에 빈 줄을 추가하면 "which" 빈 줄은 새롭습니다. 진정으로 모호하며 다른 도구는 다른 것을 강조 표시 할 수 있습니다. 두 답변 모두 정확합니다.

줄, 단어 또는 문자 차이 - 언제 어떤 모드가 있나요?

당신이 비교하는 세분성은 출력이 좋은 것을 변화시킵니다. 이것을 잘못 얻는 것은 사람들이 diff 출력 "noisy."를 찾는 주된 이유입니다

라인 수준 단어 수준 캐릭터 레벨
비교합니다 전체 선을 원자로 표시합니다 개별 단어 개별 캐릭터
한 단어로 된 편집은 다음과 같이 표시됩니다 전체 라인 제거 + 재추가 그냥 그 단어 바뀐 글자들만
위한 최고의 코드, 구성, CSV 행 산문, 계약서, 문서 오타, 해시, 인코딩된 문자열
약점 긴 단락 편집: 여전히 줄 내에서 사냥합니다 리플로우/리랩된 텍스트에서 시끄럽습니다 큰 편집에는 읽을 수 없습니다
클래식 사용자 git diff 법적 블랙라인/편집 검토 "이 두 API 키는 동일하게 보입니다"

구체적인 예. 원본: The quick brown fox jumps over the lazy dog. 수정됨: The quick red fox leaps over the lazy cat.

  • 라인 모드 전체 문장을 변경된 것으로 표시합니다. 정확하고 도움이 되지 않습니다.
  • 워드 모드 정확히 강조표시합니다 brown→red, jumps→leaps, dog→cat.
  • 문자 모드 여기서는 과잉이지만 it's가 잡을 수 있는 유일한 모드입니다 admlnistratoradministrator.

경험 법칙: 구조화된 텍스트 (줄당 의미 있는 하나의 문) 는 줄 모드를 원한다; 흐르는 텍스트는 단어 모드를 원한다; 문자 모드는 다른 두 사람이 "changed" 라고 말할 때 꺼내는 돋보기이며,당신은 can't 이유를 알 수 있습니다. 내 후행 공간 버그는 표준 문자 모드 경우입니다.

독립형 Diff 도구가 Git보다 나은 때는 언제입니까?

Git's diff 가 우수합니다 같은 저장소에 사는 것들에니다.놀라운 양의 비교 작업 does't:

지원 티켓. 내 소개에서 시나리오 - 두 설정은 고객에서 내보냅니다. 그들은're 어떤 repo 에 없습니다. 둘 다 붙여 넣기 텍스트 차이 도구 그리고 답은 두 번의 실패한 읽기 대신 몇 초 안에 나타납니다.

구성 드리프트. Nginx config 대 프로덕션 nginx config 를 준비합니다. 현재 .env vs 일이 터지기 전의 백업. git diff can't 는 2 개의 다른 서버에 파일을 봅니다; copy-paste 는 할 수 있습니다.

포맷터 검증. 파일 전체에서 Prettier(또는 PHPCS 또는 Black)를 실행했으며 파일이 변경되었다는 확신을 원합니다 서식만. 전과 후를 다르게 하라: 공백,따옴표, 세미콜론 이외의 것을 본다면,포맷터는 로직을 만졌고 지금 알고 싶어한다.

두 개의 API 응답. 스테이징은 하나의 JSON 본체를 반환하고 프로덕션은 다른 본체를 반환하며 프런트 엔드는 스테이징에서만 중단됩니다. 응답을 다르게 합니다. (JSON의 경우 구체적으로 다음을 선호합니다 JSON 차이점- 그것은 구문 분석된 구조를 비교하므로 키 순서와 공백 don't 는 오탐지를 만듭니다. 를 통해 두 페이로드를 모두 실행합니다 JSON 포맷터 먼저 대신 읽을 수있는 텍스트 diff 를 원한다면.)

문서 및 계약서. 공급 업체는 반환 "사소한 업데이트와 동일한 계약." 워드 모드 diff 는 지불 조건이 40 페이지 문서에서 Net 30 에서 Net 15 로 이동 한 것을 발견하는 방법입니다. 편집자와 변호사는 이것을 영원히 알고 있습니다 - 그들은 블랙 라인 또는 레드 라인이라고 부릅니다.

번역 및 현지화 파일. a의 두 가지 버전을 비교합니다 .po 번역가에게 다시 보내기 전에 실제로 변경된 문자열을 확인하는 파일 - 변경되지 않은 문자열 400개를 다시 번역하기 위해 비용을 절약하는 실제 WP Adminify 워크플로입니다.

공통 스레드: 두 버전이 모두 선택할 수 있는 텍스트로 존재하는 순간 diff 도구는 "what changed?" mechanically. 그리고 Toolz.dev 도구가 클라이언트 측이기 때문에 customer's config 또는 서명되지 않은 계약 doesn't 를 아무 곳이나 전송합니다 - 나머지 부분과 동일한 인수 개인 정보 보호 우선 도구 상자.

자신을 속이지 않고 Diff Output을 어떻게 읽습니까?

색상 규칙은 보편적입니다: 빨간색은 이전 버전's 독점 콘텐츠 (제거), 녹색은 새 버전's (추가), 변경되지 않은 텍스트는 컨텍스트에 대해 일반으로 렌더링합니다. 변경된 선은 빨간색 선 뒤에 녹색 대체가 표시됩니다.

diff 리뷰를 실제로 신뢰할 수 있게 만드는 세 가지 습관:

버전을 올바른 슬롯에 넣으십시오. 왼쪽 (또는 첫 번째 필드) 의 이전/원본,오른쪽에서 새/수정. 그들을 교환하고 모든 추가는 삭제로 읽습니다 - I & # 39;ve 는 사람들이이 때문에 십분 동안 잘못된 방향을 디버깅 보았다 출력이 거꾸로 보면,아마.

시작하기 전에 소음이 무엇인지 결정하십시오. 재포맷된 코드 비교하기? 공백 변경은 노이즈입니다 - 정규화하거나 무시합니다. YAML 구성 비교하기? 공백은 의미- 들여쓰기는 YAML의 구조이므로 양쪽의 유효성을 검사합니다 야엘 검증인 그리고 모든 공간을 신호로 취급합니다. 같은 도구,반대 정책,잘못된 선택은 소음의 실제 변화를 묻거나 숨깁니다.

첫 번째 덩어리뿐만 아니라 모든 덩어리를 읽으십시오. Customer's 후행 공간은 1 의 변화 #1 이었다. 그러나 diff 가 4 개의 변화를 보여주고 첫번째 것이 너의 증후를 설명할 때,읽기를 멈추는 유혹은 강하다 - 그리고 변화 #3 은 때때로 너를 다음 주에 물는 diff 는 이미 단단한 부분을 했다; don't 는 마지막 단계에서 인간적인 표본 추출 과실을 다시 소개한다.

Can't a 텍스트 차이가 알려주는 것은 무엇입니까?

한계에 대해 솔직하게 말할 가치가 있습니다:

  • 이동된 블록은 삭제 + 추가로 읽혀집니다. 파일의 상단에서 함수를 잘라 하단에 붙여 넣습니다: diff는 제거 및 추가 된 것을보고하고 이동하지 않았습니다. 일부 특수 도구는 이동을 감지합니다; 일반 LCS doesn't.
  • 의미가 아닌 텍스트를 비교합니다. 0.1 + 0.2 그리고 0.3 다르지만(그렇습니다) 또한 다릅니다 행동하다 부동 소수점에서는 다르게, 반대로 "key": 1"key": 1.0 텍스트적으로는 다를 수 있지만 언어에서는 의미상 동일할 수 있습니다. 구조화된 비교(like the JSON 차이점) 데이터 형식에 대한 이러한 격차의 일부를 닫습니다.
  • 바이너리 콘텐츠가 범위를 벗어났습니다. 이미지,바이트로 PDF,실행 파일 - text diff 는 텍스트가 필요합니다. 먼저 텍스트를 추출하거나,형식별 도구를 사용하십시오.
  • 케이스와 인코딩은 문자 그대로 비교됩니다. READMEreadme그리고,UTF-8 곱슬 따옴표 ≠ 대부분의 글꼴에서 동일하게 보이지만 ASCII 직선 따옴표입니다. (눈에 대한 또 다른 모양 패턴 트랩,알고리즘에 대한 또 다른 승리.) Pre-normalize with the 케이스 변환기 경우에 should't 당신의 비교를 위해 사정.

자주 묻는 질문

파일을 비교할 수 있나요, 아니면 붙여넣은 텍스트만 비교할 수 있나요?

X-1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 텍스트 차이 도구 붙여넣은 텍스트에 대한 작업: 모든 편집기에서 각 파일을 열고, 복사하고, 양면을 붙여넣습니다. 그러면 형식에 구애받지 않습니다. that's 읽기 가능한 텍스트(코드, 구성, CSV, SQL, 산문)는 확장자에 관계없이 비교할 수 있습니다.

비교를 위한 크기 제한이 있나요?

실제적인 한계는 처리가 브라우저에서 이기 때문에,당신의 device's 기억입니다. 몇 천개의 선을 가진 파일은 즉시 비교합니다; Myers algorithm's 는의 수에 가늠자를 요합니다 차이점, 그래서 크지만 비슷한 텍스트도 빠르게 유지됩니다. 엄청난 차이가 있는 수십만 줄의 줄은 몇 초가 걸릴 수 있습니다.

코드에 어떤 diff 모드를 사용해야 하나요?

라인 모드. 코드는 당연히 한 줄당 하나의 문장이므로 라인 수준 출력은 변경 사항에 대해 어떻게 생각하는지 깔끔하게 매핑됩니다. 라인이 변경된 것으로 플래그가 지정되고 can't 그 안에 차이를 발견 할 때만 단어 또는 문자 모드로 전환하십시오 - that's 보통 공백,따옴표 또는 단일 문자.

계약과 산문에는 어떤 모드가 가장 적합합니까?

단어 모드. 산문 변경은 일반적으로 단어 대체 및 긴 단락 안에 삽입 절; 라인 모드는 전체 단락 플래그 것 그리고 당신을 사냥을 떠날 것 이다. 단어 수준 강조 표시는 정확히 어떤 단어가 변경 된 보여줍니다-법적 블랙 라인과 같은 접근 방식.

diff가 내 텍스트를 수정하거나 저장합니까?

아니요. 하이라이트는 렌더링된 출력에만 존재합니다; 입력 텍스트는 변경되지 않으며 도구가 완전히 클라이언트 측에서 실행되기 때문에 어느 버전도 전송되거나 저장되지 않습니다. 탭을 닫으면 텍스트가 사라집니다.

왜 diff 가 똑같이 생긴 선을 강조합니까?

거의 항상 보이지 않는 문자: 후행 공백, 탭 대 공백, Windows \r\n 대 유닉스 \n 선 끝,비 끊는 공간,또는 유니코드 닮은꼴 (곱슬하게 대 똑바른 따옴표). 이것은 정확하게 변화 인간 눈은 볼 수 없고 diff 산법은 항상 붙잡는다 - 나의 후행 공간 지원 표는 이것의 한개이었다.

이동된 텍스트를 감지할 수 있나요?

이동으로 아닙니다. 표준 LCS 기반 diffing 은 이전 위치에서 삭제되고 새 위치에 추가 된 이동 된 블록을보고합니다. 이동이 의심되는 경우 & quot;added" 원본의 텍스트를 검색하십시오 - 파일의 다른 곳에서 정확한 히트가 확인됩니다.

JSON Diff 는 Text Diff 와 어떻게 다른가요?

텍스트 차이는 문자를 비교합니다; JSON 차이점 두 문서를 모두 구문 분석하고 구조를 비교합니다. 재정렬된 키,변경된 들여쓰기,후행 쉼표는 구조적 차이가 0 이므로 실제 값과 키의 변경 사항만 볼 수 있습니다. 양면이 유효할 때마다 사용하십시오. JSON; fall back to text diff when they aren't.

텍스트를 비교할 때 공백이나 대소문자를 어떻게 무시합니까?

공백이 잡음인지 신호인지 먼저 결정하십시오: 다시 포맷 된 코드에서는 잡음이지만 YAML 또는 Python 들여 쓰기에서는 구조입니다. 잡음 일 때 diff 전에 양쪽을 정규화하십시오 - 반복되는 공간을 축소하고,후행 공백을 제거하고,선 끝을 일관되게 만드십시오 - 따라서 실제 변경 사항 만 남습니다. 대소문자를 무시하려면 비교하기 전에 두 텍스트를 모두 소문자로 처리하십시오. diff 는 기본적으로 README 와 readme 를 다르게 취급하기 때문입니다.

git diff 는 어떤 알고리즘을 사용하나요?

기본적으로 git diff 는 Eugene Myers & # 39 의 동일한 가장 긴 공통 하위 시퀀스 접근 방식 인 Myers 알고리즘의 변형을 사용합니다; 대부분의 diff 도구가 공유하는 1986 년 논문. Git 은 또한 변화를보다 쉽게 그룹화 할 수있는 인내심과 히스토그램 변형을 제공하지만 동일한 차이점 집합을보고합니다 - 프레젠테이션 만 변경됩니다. 이 도구는 동일한 Myers 알고리즘 제품군을 사용합니다.

Frequently Asked Questions

The Text Diff tool works on pasted text: open each file in any editor, copy, paste both sides. That makes it format-agnostic — anything that's readable text (code, config, CSV, SQL, prose) can be compared, regardless of extension.

Comments

0 comments

0/2000 characters

No comments yet. Be the first to share your thoughts!