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가 잡을 수 있는 유일한 모드입니다
admlnistrator대administrator.
경험 법칙: 구조화된 텍스트 (줄당 의미 있는 하나의 문) 는 줄 모드를 원한다; 흐르는 텍스트는 단어 모드를 원한다; 문자 모드는 다른 두 사람이 "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 는 텍스트가 필요합니다. 먼저 텍스트를 추출하거나,형식별 도구를 사용하십시오.
- 케이스와 인코딩은 문자 그대로 비교됩니다.
README≠readme그리고,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 알고리즘 제품군을 사용합니다.



