두 개의 파일 비교
비공개 및 보안
모든 것이 브라우저에서 발생합니다. 파일은 서버에 닿지 않습니다.
엄청나게 빠른
업로드도, 기다림도 없습니다. 파일을 놓는 순간 변환하세요.
정말로 무료
계정이 필요 없습니다. 숨겨진 비용이 없습니다. 파일 크기 트릭이 없습니다.
"Diff"는 변경의 공용어입니다. 그것들은 소스 코드, 산문, 데이터 세트와 같은 것의 두 버전 사이에 무엇이 이동했는지 알려주는 간결한 이야기이며, 모든 것을 다시 읽도록 강요하지 않습니다. 그 몇 가지 기호(+, -, @@) 뒤에는 최적성, 속도 및 인간의 이해를 균형있게 맞추는 알고리즘, 휴리스틱 및 형식의 깊은 스택이 있습니다. 이 기사는 diff에 대한 실용적인 알고리즘-워크플로 둘러보기입니다: 어떻게 계산되는지, 어떻게 형식화되는지, 병합 도구가 어떻게 사용하는지, 더 나은 검토를 위해 어떻게 조정하는지. 그 과정에서 우리는 1차 자료와 공식 문서에 주장을 근거를 둘 것입니다. 왜냐하면 공백이 계산되는지 여부와 같은 사소한 세부 사항이 정말로 중요하기 때문입니다.
"diff"란 실제로 무엇인가
공식적으로 diff는 삽입과 삭제를 사용하여 "오래된" 시퀀스를 "새로운" 시퀀스로 변환하는 최단 편집 스크립트(SES)를 설명합니다(때로는 삭제+삽입으로 모델링할 수 있는 대체도 포함). 실제로 대부분의 프로그래머 대상 diff는 줄 지향이며 가독성을 위해 선택적으로 단어나 문자로 구체화됩니다. 표준 출력은 컨텍스트 와 통합 형식입니다. 후자—코드 검토에서 일반적으로 보는 것—는 간결한 헤더와 "덩어 리"로 출력을 압축하며, 각 덩어리는 변경 사항 주변의 컨텍스트 이웃을 보여줍니다. 통합 형식은 -u/--unified를 통해 선택되며 패치 적용을 위한 사실상의 표준입니다. patch는 일반적으로 컨텍스트 줄의 이점을 활용합니다 변경 사항을 강력하게 적용하기 위해.
GNU diff 설명서는 노이즈를 줄이고 신호를 더 많이 원할 때 사용하는 스위치를 목록으로 제공합니다—공백 무시, 정렬을 위한 탭 확장, 또는 더 느리더라도 "최소" 편집 스크립트 요청 (옵션 참조). 이러한 옵션은 두 파일이 다르다는 것의 의미를 바꾸지 않습니다. 알고리즘이 더 작은 스크립트를 얼마나 공격적으로 검색하는지와 결과가 인간에게 어떻게 제시되는지를 바꿉니다.
LCS에서 마이어스까지: diff 계산 방법
대부분의 텍스트 diff는 최장 공통 부분 수열(LCS) 추상화에 기반합니다. 고전적인 동적 프로그래밍은 LCS를 O(mn) 시간과 공간에서 해결하지만, 큰 파일에는 너무 느리고 메모리를 많이 사용합니다. 히르쉬버그의 알고리즘 은 분할 정복을 사용하여 선형 공간(여전히 O(mn) 시간)에서 최적의 정렬을 계산하는 방법을 보여주었으며, 이는 실용적인 diff 구현에 영향을 미친 기본적 인 공간 절약 기술입니다.
속도와 품질을 위한 돌파구는 유진 W. 마이어스의 1986년 알고리즘이었습니다. 이 알고리즘은 O(ND) 시간(N ≈ 총 줄 수, D ≈ 편집 거리)과 거의 선형 공간에서 SES를 찾습니다. 마이어스는 "편집 그래프"에서 편집을 모델링하고 가장 멀리 도달하는 경계를 따라 진행하여 줄-diff 설정에서 빠르고 최소에 가까운 결과를 산출합니다. 이것이 많은 도구에서 "마이어스"가 기본값으로 남아 있는 이유입니다.
또한 헌트-시만스키 계열도 있습니다. 이는 몇 개의 위치만 일치할 때 LCS를 가속화하며(일치 항목을 미리 인덱싱하고 증가하는 부분 수열을 추적함으로써), 역사적으로 초기 diff 변형과 관련이 있습니다. 이러한 알고리즘은 트레이드오프를 조명합니다: 드문 일치 항목이 있는 입력에서는 하위 2차적으로 실행될 수 있습니다. 이론과 구현을 연결하는 실무자 개요는 닐 프레이저의 노트를 참조하십시오.
"최적"이 읽기 어려울 때: 인내와 히스토그램 전략
마이어스는 최소 편집 스크립트를 목표로 하지만, "최소" ≠ "가장 읽기 쉬움"입니다. 재정렬되거나 복제된 큰 블록은 순수한 SES 알고리즘을 어색한 정렬로 속일 수 있습니다. 브램 코헨에게 귀속되는 인내 diff를 입력하십시오: 정렬을 안정화하기 위해 독특하고 빈도가 낮은 줄에 고정하며, 종종 인간이 더 깨끗하다고 느끼는 diff를 생성합니다—특히 함수가 이동하거나 블록이 재구성된 코드에서. 많은 도구는 "인내" 옵션(예:diff.algorithm)을 통해 이를 노출합니다.
히스토그램 diff 는 빈도 히스토그램으로 인내를 확장하여 발생 빈도가 낮은 요소를 더 잘 처리하면서도 빠르게 유지합니다( JGit에서 대중화됨). --histogram이 시끄러운 파일에 대해 더 명확한 덩어리를 생성하는 것을 발견했다면, 그것은 의도된 것입니다. 최신 Git에서는 알고리즘을 전역적으로 또는 호출별로 선택할 수 있습니다:git config diff.algorithm myers|patience|histogram 또는 git diff --patience.
단어 수준의 명확성, 공백 제어 및 이동된 코드 강조
줄 diff는 간결하지만 사소한 편집을 가릴 수 있습니다. 단어 수준 diff (--word-diff)는 전체 줄 삽입/삭제로 검토를 넘치게 하지 않고 줄 내 변경 사항을 색칠합니다—산문, 긴 문자열 또는 한 줄짜리에 적합합니다.
재포맷 후 공백이 diff를 압도할 수 있습니다. Git과 GNU diff 모두 공백 변경을 무시하도록