통합 diff 파일에서 문자 별 차이를 시각화하려면 어떻게해야합니까?


122

내가 만든 패치를 얻을 말 git format-patch. 이 파일은 기본적으로 일부 메타 데이터가 포함 된 통합 diff입니다. Vim에서 파일을 열면 어떤 줄이 수정되었는지 볼 수 있지만 변경된 줄에서 어떤 문자 가 다른 지는 볼 수 없습니다 . 문자 별 차이를 시각화하는 방법 (Vim 또는 Ubuntu에서 실행되는 다른 무료 소프트웨어)을 아는 사람이 있습니까?

문자 별 차이가 시각화되는 카운터 예는 vimdiff a b.

업데이트 금요일 11 월 12 일 22:36:23 UTC 2010

diffpatch는 단일 파일로 작업하는 시나리오에 유용 합니다.

업데이트 2016 년 6 월 16 일 목요일 17:56:10 UTC

git 2.9에서 diff-highlight를 확인하십시오 . 이 스크립트는 내가 원래 찾고 있던 것을 정확히 수행 합니다 .


이것은 superuser.com에서 더 나을 수 있습니다
Daenyth 2010

13
혹시. 자주 묻는 질문이는 "일반적으로 프로그래머가 사용하는 소프트웨어 도구"에 대한 질문을위한 장소입니다 언급 때문에 나는 stackoverflow.com를 선택
아담 Monsen

7
이것이 귀하의 질문에 직접 답할 수는 없지만 git diff --color-words일반적인 통합 diff 출력보다는 행 내에서 어떤 단어가 변경 되었는지 확인하는 데 매우 유용합니다. 그러나 문자 기반이 아니라 단어 기반이므로 비교하려는 내용에 공백이 많지 않으면 출력이 덜 깔끔 할 수 있습니다. (편집 됨 : - 그럼에도 불구하고 어쩌면이 댓글 누군가에게 도움이 될 것 아차, 나는 당신을 요구하고 내가 오해는 것을 알 수있다.)
마크 Longair

답변:


13

질문에서 Vim에 대한 언급을 감안할 때 이것이 원하는 대답인지 확실하지 않지만 Emacs는 이것을 할 수 있습니다. 은 diff가 포함 된 파일을 열고, 당신이에있어 있는지 확인 diff-mode(파일 이름이 지정되어있는 경우 foo.diff또는 foo.patch그렇지 않으면 입력이 자동으로 발생 M-x diff-mode RET, 당신은에 관심과 충돌하는 덩어리로 이동) C-c C-b를 위해 refine-hunk. 또는 파일을 한 번에 하나씩 M-n; 자동으로 정제됩니다.


1
나를 위해 작동합니다! Heh, 저는 Vim을 10 년 동안 사용해 왔지만 방금 emacs를 설치했습니다. :)
Adam Monsen

그러나 이맥스는 표준 입력에서 읽기를 지원하지 않습니다, 나는 예를 들면 할 수 없어git log master.. -p | emacs -
하이 천사

1
@ Hi-Angel Emacs를 열고 입력 M-!하여 명령을 실행하고 출력을 버퍼에 캡처 할 수 있습니다.
legoscia

172

git에서는 커밋하지 않고 병합 할 수 있습니다. 먼저 패치를 병합 한 후 다음을 수행하십시오.

git diff --word-diff-regex=.

등호 뒤에있는 점에 유의하십시오.


139
더 좋음 : git diff --color-words=..
ntc2 2013

4
@ ntc2 귀하의 의견을 답변으로 만들어야합니다.
Tyler Collier 2014 년

1
Upvoters는 내 원래 사용 사례는 패치 파일 만 있고 git repo 또는 기본 / 수정 버전이 없다고 가정합니다 . 그래서 @legoscia의 대답을 수락했습니다. 요청 된 내용을 정확히 설명합니다.
Adam Monsen 2014 년

2
@ ntc2 git diff --color-words=.git diff --color-words .다르게 작동합니다. 더 나은 것입니다 git diff --color-words ..
abhisekp

2
@abhisekp : 사진 감사합니다. 나는 그것을 알아 낸 생각 다음이 git diff --color-words .정말과 동일합니다 git diff --color-words -- .! 즉, .경로로 해석됩니다. 으로 확인할 수 있습니다 mkdir x y; echo foo > x/test; git add x/test; git commit -m test; echo boo > x/test; cd y; git diff --color-words=.; git diff --color-words .; git diff --color-words -- ..
ntc2 2015 년

145

다음은보다 시끄러운 출력이 git diff --word-diff-regex=<re>적고 입력이 덜 필요하지만 git diff --color-words --word-diff-regex=<re>.

단순 (공간 변경 강조 표시) :

git diff --color-words

단순 (개별 문자 변경 사항을 강조 표시하고 공간 변경 사항은 강조 표시하지 않음) :

git diff --color-words=.

더 복잡함 (공간 변경 강조 표시) :

git diff --color-words='[^[:space:]]|([[:alnum:]]|UTF_8_GUARD)+'

일반적으로 :

git diff --color-words=<re>

<re>변경을 식별 할 목적으로 "단어"를 정의하는 정규 표현식은 어디에 있습니까 ?

이들은 변경된 "단어"에 색상을 지정한다는 점에서 덜 시끄 럽습니다. 반면 --word-diff-regex=<re>일치하는 "단어"를 색상 -/+마커로 둘러싸기만하면 됩니다.


9
나는 부분 --color-words없이 좋아한다 =..
Tyler Collier 2014 년

1
git diff --color-words='\w'분음 부호 (git v1.7.10.4)에서 더 잘 작동합니다
nr

1
더 복잡한 버전이 훌륭하게 작동합니다. 나는 추가 --word-diff=plain로 추가 [-하고 -]서라운드 삭제 {++}서라운드 추가를 추가했습니다. 매뉴얼은 경고로하지만, 소스에서 이러한 구분 기호의 실제 발생은되어 있지 어떤 방식으로 탈출
토비아스 Kienzler

2
불행하게도 예를 들어, 들여 쓰기 변화를 강조하지 않는 것 당신의 더 복잡한 버전, 나는 연 질문 이에
토비아스 Kienzler에게

이 대답은 훌륭합니다! 그러나 실제로 이러한 변경 사항의 배경을 녹색 / 빨간색으로 변경하는 방법이 있습니까?
WoLfPwNeR

45
git diff --color-words="[^[:space:]]|([[:alnum:]]|UTF_8_GUARD)+"

위의 정규식 ( Thomas Rast )은 구두점 / 문자 수준에서 diff 조각을 분리하는 적절한 작업을 수행 --word-diff-regex=.합니다.

여기에 결과 출력의 스크린 샷을 게시했습니다 .


최신 정보:

이 기사 에는 몇 가지 훌륭한 제안이 있습니다. 특히, contrib/git repo 의 트리에는 diff-highlight세분화 된 하이라이트를 보여주는 perl 스크립트가 있습니다.

사용을위한 빠른 시작 :

$ curl https://git.kernel.org/cgit/git/git.git/plain/contrib/diff-highlight/diff-highlight > diff-highlight
$ chmod u+x diff-highlight
$ git diff --color=always HEAD~10 | diff-highlight | less -R

5
단축 할 수 있습니다--color-words=[^[:space:]]|([[:alnum:]]|UTF_8_GUARD)+'
Eddified

나는 '거기에 가치의 시작에 추가 해야했다. 그렇지 않으면 오류가 발생했습니다. 또한, 나는 단순히 --color-words그 정규 표현식을 사용하는 것과 똑같은 동작을 얻습니다.
gcb

3
@gcb 텍스트 내용이 중요합니다. 변경 사항이 공백으로 구분 되어도 차이가 없습니다. 이 같은 변경하는 경우 그러나 당신은 변경하는 경우 foo.barfoo.qux당신이 그 차이를 볼 수 있습니다.
Justin M. Keyes

5
더 간단하게 : git diff --color-words='[^[:space:]]|([[:alnum:]]|UTF_8_GUARD)+'.
ntc2 2013

1
Homebrew와 함께 git을 설치했고 이미 /usr/local/share/git-core/contrib/diff-highlight/diff-highlight. 이것은 Homebrew의 git이 전체 contrib을 /usr/local/share/git-core/contrib/. 그래서 마지막으로, 다음은 나를 위해 일한git diff --color=always | /usr/local/share/git-core/contrib/diff-highlight/diff-highlight
아슈 JINDAL에게

6

NodeJS 설치에 반대하는 것이 없다면 "diff-so-fancy"( https://github.com/so-fancy/diff-so-fancy ) 라는 패키지 가 있습니다. 이것은 설치가 매우 쉽고 완벽하게 작동합니다.

npm install -g diff-so-fancy
git diff --color | diff-so-fancy | less -R

편집 : 실제로 공식 diff-highlight의 래퍼라는 것을 알았습니다.


2

문자 별 차이 도구는 모르지만 단어 별 차이 도구 인 wdiff가 있습니다.

예를 참조 DIFF, Colordiff, Wdiff, Vimdiff - UNIX / Linux에서 최고 4 파일 차이 도구 .


wdiff는 흥미 롭습니다, 감사합니다! 내 원래 질문을 명확히하기 위해 통합 된 diff 형식으로 발생하는 단일 파일에 대해 향상된 구문 강조 표시를 제공하는 것을 찾고 있습니다.
Adam Monsen

약간의 주제에서 벗어남 (단어 간 비교, 기존의 diff 출력을 향상시키지 않음)하지만 단어 별 시각화에 가장 적합한 조합을 찾았습니다. * wdiff old_file new_file | cdiff * vimdiff , :windo wincmd K수직 창 레이아웃으로 전환하기 위해 vim 내부 (다른 하나 아래) 나란히 하나씩. 이 레이아웃은 줄이 긴 파일에 훨씬 좋습니다.
Aleksander Adamowski는

2
: BTW, 일부 다른 도구의 가치가 체크 아웃 링크 된 문서에서 언급되지 않은 wdiff2, mdiff그리고 구글의 온라인 도구 .
Aleksander Adamowski

1

약간의 조사 끝에 최근 Vim 메일 링리스트에이 질문이 두 번 올라 왔다는 것을 알게되었습니다. NrrwRgn 플러그인 언급 한 (두 개의 좁은 지역을 그들을 차이). Christian Brabandt가 설명한대로 NrrwRgn을 사용하는 것은 해결책 이라기보다는 해결 방법처럼 느껴지지만, 그것만으로도 충분할 것입니다.

나는 NrrwRgn을 사용해 보았고 : diffthis와 함께 단일 파일의 일부 내에서 문자 별 차이를 설명하는 데 실제로 유용했습니다. 그러나 많은 키 입력이 필요했습니다. 내 Vimscript는 꽤 녹슬었지만 스크립트로 작성 될 수 있습니다. 원하는 기능을 제공하도록 NrrwRgn을 향상시킬 수 있습니다.

생각?

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