긴 줄에 git diff를 어떻게 사용해야합니까?


235

파일 에서 git-diff 를 실행 하고 있지만 변경 사항이 길다.

커서 키를 사용하여 오른쪽으로 이동하면 색상 코딩이 손실되고 줄이 정렬되지 않아 변경 사항을 추적하기가 더 어려워집니다.

그 문제를 방지하거나 단순히 줄 바꿈을 만드는 방법이 있습니까?

mingw32를 통해 Git 1.5.5를 실행 중입니다.


6
'git diff --color-words'를 시도해보십시오. 스크롤 문제는 해결되지 않지만 단어 변경은 한 줄의 컨텍스트로 둘러싸여 있습니다!
kevinf

7
"fold"를 사용하면 꽤 잘 작동하는 것 같습니다 :git diff --color-words | fold
Amy

@Amy 사용하려고 fold했지만 색상이 제거됩니다. 지정했기 때문에에 --color-words색상을 전달했다고 가정합니다 fold. 어떻게?
Nero gris

답변:


120

출력 결과 표시 git diff는 사용중인 호출기에 의해 처리됩니다.

일반적으로 Linux에서는 less사용됩니다.

GIT_PAGER환경 변수 를 설정하여 git에게 다른 호출기를 사용하도록 지시 할 수 있습니다 . 페이징에 대해 신경 쓰지 않으면 (예를 들어, 터미널을 사용하여 뒤로 스크롤 할 수 있음) GIT_PAGER호출기를 사용하여 중지하도록 명시 적 으로 비워 두도록 시도 할 수 있습니다 . 리눅스에서 :

$ GIT_PAGER='' git diff

호출기가 없으면 줄이 줄 바꿈됩니다.

터미널이 컬러 출력을 지원하지 않는 경우 --no-color인수를 사용하거나 git config 파일의 컬러 섹션에 항목을 넣을 수도 있습니다.

$ GIT_PAGER='' git diff --no-color

1
GIT_PAGER을 공백으로 설정하면 줄이 줄 바꿈되는 것을 확인할 수 있습니다. 또한 읽기가 약간 어려운 기호를 삽입하지만 필요한 경우 다른 호출기를 찾을 수 있으므로 여전히 유효한 대답입니다. :) 감사.
Peter Boughton

1
읽기가 어려운 기호는 무엇입니까? 그 문제를 해결하기 위해 답변을 편집 할 수도 있습니다.
SpoonMeiser

대부분의 줄 바꿈마다 "<-[m"(<-는 단일 화살표 문자 임)뿐만 아니라 "<-[1m"및 "<-[32m"과 같이 각 색상이 시작된 마커도 있습니다.
피터 Boughton

1
--no-color 인수가 전혀 도움이되지 않습니까? 줄 바꿈 문자가 확실하지 않습니다.
SpoonMeiser

예, 모든 원치 않는 내용이 표시되지 않으므로 줄 바꿈 내용도 색상과 관련이 있어야합니다.
Peter Boughton

229

또는 기본 페이저로 less를 사용하는 경우 -S줄 바꿈을 다시 사용하려면 diff를 보면서 입력 하십시오.


60
관련 팁 사용 --word-diff색상 코드 변경된 단어의 강조 표시
조쉬 셰어

5
일부 사람들이 문제를 겪고있는 것을
보았으므로이

2
@ JoshDiehl : 나는 당신이 신경 쓰지 않기를 바랍니다 ... 나는 --word-diff근본적인 문제를 해결하기 위해 많은 일을하는 것처럼 파업하기 때문에 그 부분에 대해 스스로 대답 할 가치가 있다고 생각합니다 . 그래서 나는 그것을 만들었다 : stackoverflow.com/a/19253759/313756
lindes

1
참고 : 이것은 OS X (매버릭스)에서 작동하지 않는 것 같습니다.
DilithiumMatrix

@zhermes 그것은 매버릭스에서 418 이하로 저에게 효과적입니다. -S대문자 S 로 입력 하고 있는지 확인하십시오 -s. Less는 입력 한 후 맨 아래에“긴 줄 접음 (RETURN 누르기)”메시지를 표시 한 -S다음 Return 키를 누르면 줄 바꿈이 활성화됩니다.
Rory O'Kane

115

git config랩퍼를 설정하여 랩핑 할 수도 있습니다 .

$ git config core.pager 'less -r' 

현재 프로젝트의 호출기 설정을 설정합니다.

$ git config --global core.pager 'less -r' 

모든 프로젝트에 대해 호출기를 전체적으로 설정합니다


3
msysgit (1.8.1.msysgit.1)으로 큰 따옴표를 사용하여 나를 위해 일했습니다.git config --global core.pager "less -r"
kerim

이것은 OS X에서 git diff로 영구적으로 래핑되었습니다. 감사합니다!
Thomson Comer

작동하지만 이유를 이해하지 못합니다. 누군가 설명 할 수 있습니까? man less, -r포장에 대해 아무것도 말하지 않는다.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

@ThomsonComer '-r'은 OS X에 제어 문자를 표시하는 것과 관련이 있습니다. 어떻게 작동합니까?
DilithiumMatrix

나는 지금 확실히 기억할 수 없다. 그러나 더 설명하는 몇 가지 링크 발견 : michael.otacoo.com/linux-2/avoid-escape-characters-in-git superuser.com/questions/366930/... unix.stackexchange.com/questions/19317/...을
Shoan

49

전체 신용와 조쉬 셰어코멘트이 대답 , 나는 그럼에도 불구하고 그래서 추가,이 자체에게 대답되어야한다 같은 느낌 :

긴 줄의 차이점을 처리하는 한 가지 방법은 단어 중심의 diff를 사용하는 것입니다. 이것은 다음과 같이 할 수 있습니다 :

git diff --word-diff

이 경우 상당히 다른 diff 출력을 얻을 수 있으며, 이는 라인 내에서 변경된 내용을 구체적으로 보여줍니다.

예를 들어 다음과 같은 것을 얻는 대신 :

diff --git a/test-file.txt b/test-file.txt
index 19e6adf..eb6bb81 100644
--- a/test-file.txt
+++ b/test-file.txt
@@ -1 +1 @@
-this is a short line
+this is a slightly longer line

다음과 같은 것을 얻을 수 있습니다.

diff --git a/test-file.txt b/test-file.txt
index 19e6adf..eb6bb81 100644
--- a/test-file.txt
+++ b/test-file.txt
@@ -1 +1 @@
this is a [-short-]{+slightly longer+} line

또는 채색 대신 다음과 같이하십시오.

<code> git diff </ code>의 결과

당신은 이것을 얻을 수 있습니다 :

<code> git diff --word-diff </ code>의 결과

이제 실제로 긴 줄을 비교하는 경우 원래 설명한 호출기 상황에 문제가있을 수 있으며 다른 답변에서는 만족스럽게 해결되었습니다. 다행히도 이것이 회선상의 변경 사항을보다 쉽게 ​​식별 할 수있는 새로운 도구를 제공하기를 바랍니다.


6
이 두 옵션위한 --word-diff: color, plain,와 porcelain. 또한으로 단어 경계의 정규식을 변경할 수 있습니다 --word-diff-regex. 기본값은 \S+입니다. ( v2.1.1 )
Michael-Clay Shirky의 위치

3
--color-words의 속기 인 것처럼 보입니다 --word-diff=color. diff를 보지 않고 공유 할 때 좋습니다.
CivFan

아, 이것은 흥미롭고 잠재적으로 매우 유용합니다. 공유해 주셔서 감사합니다!
Darragh Enright

1
내가 좋아하는 --word-diff=porcelain보다 나은 --word-diff때문에 porcelain반면, 별도의 라인에 변화를 줄 것이다 --word-diff인라인 변경 사항을 넣어. 별도의 줄을 사용하면 차이가 미묘 할 때 차이를 더 쉽게 볼 수 있습니다.
wisbucky

1
LaTeX 파일의 수명이 바뀌 었습니다!
6005

30

호출기로 적게 사용하고 줄 바꿈을 영구적으로 만들려면 긴 줄 바꿈 옵션을 활성화하면됩니다.

git config --global core.pager 'less -+S'

이렇게하면 덜 사용하는 동안 입력하지 않아도됩니다.

건배


OS X 10.9.5에서 나를 위해 일했습니다. 감사!
Jay Taylor

마찬가지로, Git diff를 읽을 때 줄 바꿈을 비활성화하려면 설정도 비슷합니다.git config --global core.pager 'less -S
Topher Hunt

19

이걸 봤어 GIT_PAGER='less -r'나를 위해 일한다


9
더 나은 (나를 위해) : less -R(실제로 less -eiFRSX색상과 줄 바꿈 문제를 해결하는을 사용 합니다.)
cdunn2001

2
less -R은 -r과 비슷하지만 ANSI "color"이스케이프 시퀀스 만 "raw"형식으로 출력됩니다. -r과 달리 대부분의 경우 화면 모양이 올바르게 유지됩니다. (man less)
richk

19

Mac OSX : 덜 실행되는 반면에 someone45의 '-S'를 제외한 다른 대답은 저에게 효과적이지 않았습니다. 자동 줄 바꿈을 지속하려면 다음이 필요했습니다.

git config --global core.pager 'less -+$LESS -FRX'

이것은 나에게도 효과가 있었지만 그 이유를 이해하지 못합니다. -+$LESS매개 변수 는 무엇입니까 ? 자식이 정의하지 않으면 내 LESS 환경 변수도 설정되지 않습니다.
jakar

3
@ 자 카르 : 그럼 아무것도하지 않습니다. 일부 환경에서는 $LESS(예를 들어 a .login또는 a .profile또는 다른 것에 의해) 어떤 값으로 설정 되며 해당 옵션은 기본값을 추가 한 다음 -FRX그 위에 추가합니다 .
naught101

이것은 OS X Mavericks에서 작동 하지 않았습니다$LESS . 정의되지 않았습니다.
DilithiumMatrix

naught101은 +-$ LESS에 단순히 .login 또는 .profile (있는 경우)의 설정을 포함하는 것이 정확합니다. Mavericks에서 잘 작동하지만 문제가 발생하면 생략 할 수 있습니다.
John Lemberger



5

"git diff"를 사용 중이고 여러 페이지를 표시하는 경우 (페이지 끝에 ":"참조)이 경우 "-S"를 입력하고 Enter 키를 누릅니다 (S는 대문자 여야 함). 접는 긴 줄을 토글합니다.


이 모든 설정을 엉망으로하는 것보다 방법은 쉽습니다
chharvey을

4

지금까지 아무도 지적하지 않았습니다. 기억하기 쉽고 git config에서 추가 구성을 수행 할 필요가 없습니다.

git diff --color | less -R

이 페이지의 모든 답변 중 가장 간단한 답변입니다. 내 환경-Oracle Linux 7.6. git diff --color | less -FR스크롤 할 필요가없는 작은 변경 사항
Rakesh N

3

git diff의 출력을 더 많이 파이프 할 수 있습니다.

git diff | more

3

아니 완벽한 솔루션,하지만 gitk하고 git-gui모두이 정보를 표시하고, 스크롤을 할 수 있습니다.


1

현재 / 기본 구성을 나열하십시오.

  $ git config --global core.pager  
    less -FXRS -x2

그런 다음 -S를 업데이트하고 생략하십시오.

  $ git config --global core.pager 'less -FXR -x2'

-S : 화면 너비보다 긴 선이 접히지 않고 잘립니다.


-1

문제가 생길 때 종종 DiffMerge에 의지합니다. 인라인 차이 강조 표시가있는 뛰어난 차이 도구. 또한 최신 버전에서는 수평 모드를 갖는 모드를 추가했습니다.

그래도 git을 사용하도록 구성 할 수 없었습니다. 따라서 두 버전의 파일을 먼저 얻으려면 혼란을 겪어야합니다.

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