`git diff --patience`는 무엇입니까?


219

인내 알고리즘은 기본 알고리즘과 어떻게 다르며 git diff언제 사용하고 싶습니까?


1
아마 그것은 느리게
움직일

Bazaar에서 Patience Diff의 독립형 스크립트를 추출했습니다. 다른 SO 스레드 에서 찾을 수 있습니다 .
TryPyPy

38
후속 질문. 언제 인내심 차이를 사용해서는 안됩니까?
balki

4
--histogram"... 낮은 발생 공통 요소를 지원하기 위해 인내 알고리즘을 확장하는"매개 변수 도 있습니다. git-scm.com/docs/git-diff.html
Robert

답변:


183

인내심 diff 알고리즘의 저자 인 Bram Cohen의 게시물을 읽을 수 있지만 인내심 diff 알고리즘을 잘 요약 한이 블로그 게시물 을 찾았 습니다 .

Patience Diff는 대신 텍스트에서 중요한 콘텐츠의 마커 또는 서명 역할을하는 저주파 고 콘텐츠 라인에 에너지를 집중시킵니다. 여전히 핵심은 LCS 기반의 차이점이지만, 시그니처 라인의 가장 긴 공통 하위 시퀀스 만 고려하므로 중요한 차이점이 있습니다.

양쪽에서 정확히 한 번만 나타나는 모든 줄을 찾은 다음 해당 줄에서 가장 긴 공통 하위 시퀀스를 수행하여 일치시킵니다.

언제 인내심 을 사용해야 합니까? 브람에 따르면, 인내심 차이는이 상황에 좋습니다 :

정말 나쁜 경우는 두 가지 버전이 급격히 확산되고 개발자가 패치 크기를 제어하지 않도록주의하지 않는 경우입니다. 이러한 상황에서 diff 알고리즘은 중괄호의 긴 섹션을 ​​함께 일치한다는 점에서 때때로 '잘못된 정렬'이 될 수 있지만 한 버전의 함수 중괄호와 다른 버전의 다음 함수의 중괄호를 상관시킵니다. 이 상황은 매우 추악 하며, 그러한 것들이 가장 일관성있게 제시되어야하는 상황에서 완전히 사용할 수없는 충돌 파일이 발생할 수 있습니다.


3
XML에 대한 나의 경험에서, 그것은 보통 diff와 정확히 같은 "나쁜"결과를 제공합니다.
stivlo

5
나는 XML에 대한 인내심의 차이로 훨씬 더 운이 좋았다. 확실히 내가 현재보고있는 diff에는 일반 diff 알고리즘으로 설명 된 정렬 오류가 정확하게 있지만 인내심 diff는 절대적으로 웅장합니다.
me_and

22
이 블로그는 프로세스의 애니메이션 GIF를 포함하여 훌륭한 설명이 있습니다 : alfedenzo.livejournal.com/170301.html
Quantum7

3
나는 매우 흥미와 알고리즘의 세부 사항에 더 링크와 함께 좋은 설명을 제공하는이 블로그를 발견했습니다 fabiensanglard.net/git_code_review/diff.php는 희망이 누군가에게 도움이 될 것입니다
SathOkh

frobnitz / FIB / 사실은 diff는에서 볼 수 있습니다 gist.github.com/roryokane/6f9061d3a60c1ba41237
조지 V. 라일리에게

52

병합에도 사용할 수 있습니다 (XML 충돌에 대해서는 실제로 잘 작동했습니다).

git merge --strategy-option=patience ...

51
또는git config --global diff.algorithm patience
Tobu

11
짧을 것입니다 git merge -X patience.
PythonNut

42

인내 diff 알고리즘은 경우에 따라 더 나은 결과를 보여주는 느린 diff 알고리즘입니다.

다음 파일을 git에 체크인했다고 가정하십시오.

.foo1 {
    margin: 0;
}

.bar {
    margin: 0;
}

이제 섹션을 재정렬하고 새 줄을 추가하십시오.

.bar {
    margin: 0;
}

.foo1 {
    margin: 0;
    color: green;
}

기본 diff 알고리즘은 섹션 제목이 변경되었다고 주장합니다.

$ git diff --diff-algorithm=myers   
diff --git a/example.css b/example.css
index 7f1bd1e..6a64c6f 100755
--- a/example.css
+++ b/example.css
@@ -1,7 +1,8 @@
-.foo1 {
+.bar {
     margin: 0;
 }

-.bar {
+.foo1 {
     margin: 0;
+    color: green;
 }

인내심 차이가 더 직관적 인 결과를 보여주는 반면 :

$ git diff --diff-algorithm=patience
diff --git a/example.css b/example.css
index 7f1bd1e..6a64c6f 100755
--- a/example.css
+++ b/example.css
@@ -1,7 +1,8 @@
-.foo1 {
-    margin: 0;
-}
-
 .bar {
     margin: 0;
 }
+
+.foo1 {
+    margin: 0;
+    color: green;
+}

거기에 주관적 DIFF 품질의 좋은 토론은 여기 , 그리고 2.11 더 DIFF 휴리스틱을 모색하고있다 이눔 아 .

참고 것이 인내심은 diff 알고리즘은 여전히 몇 가지 알려진 병적 인 경우가 있습니다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.