Git diff는 수정 된 행만 표시합니다


128

git diff를 수행하면 추가 된 행이 표시됩니다.

+ this line is added

제거 된 줄 :

- this line is removed

그러나 수정되지 않은 많은 행을 보여줍니다.

this line is not modified
this line is also not modified

결과적으로 실제 git diff는 다음과 같이 보입니다.

+ this line is added
  this line is not modified
- this line is removed
  this line is not modified

git에게 수정 된 줄만 표시하고 수정되지 않은 다른 모든 코드는 무시하도록 요청할 수 있습니까? "+"또는 "-"기호가없는 모든 줄을 제거하는 방법을 작성했지만 더 간단한 방법이 있어야합니다.

내 자식 diff에서 수정 된 줄을 보는 것에 만 관심이 있습니다.

미리 감사드립니다.

답변:


182

원하는 것은 0 줄의 내용을 가진 diff입니다. 다음을 사용하여이를 생성 할 수 있습니다.

git diff --unified=0

또는

git diff -U0

해당 저장소의 구성 옵션으로 설정할 수도 있습니다.

git config diff.context 0

모든 저장소에 대해 전역으로 설정하려면 다음을 수행하십시오.

 git config --global diff.context 0

4
빠른 답변 감사합니다. 이것은 내 문제의 절반을 해결하지만 여전히 내 diff에서 "@@ -1 +1 @@"과 같은 줄을 얻었고 내 자식 diff의 상단에는 "diff --git a / db / xxxxxxx b / db / xxxx index가 있습니다. xxxxx..aaaaaaa bbbbbbbb
r3b00t

3
git이 줄을 출력하지 않는 방법을 제공하지 않는다고 생각합니다. diff가 없으면 의미가 없기 때문입니다 (보고있는 파일이나 파일의 위치를 ​​알 수 없었습니다).
Chris Hayes

8
@Rakesh : git-diff는 확장하기 위해 실제로 소스 파일에 대한 패치로 사용할 수있는 diff를 만들려고 시도합니다.이 정보 없이는 불가능합니다. 그것을 제거하는 유일한 방법은 via와 같이 직접 후 처리하는 것 git diff | egrep "^(\+|-) "입니다.
Chris Hayes

1
git config --global diff.context 0 가지고는 전 세계적으로 설정
의 Andrzej Rehmann을

특정 디렉토리에서보고 싶다면 git diff -U0 <dir>
Eswar Yaganti

41

로 시작하는 줄만 표시하는 또 다른 핵 (unxx) +-:

git diff -U0 | grep '^[+-]' | grep -Ev '^(--- a/|\+\+\+ b/)'

위의 코드는 다음을 수행합니다.

  • git diff -U0: 0 컨텍스트 라인을 선택하십시오
  • 첫 번째 grep은 다음으로 시작하는 모든 줄만 포함합니다 + or로-
  • 두 번째 grep은 --- a/or로 시작하는 줄을 제외합니다+++ b/

색깔

컬러 차이를 표시하려면 다음을 시도하십시오.

git diff -U0 --color | grep '^\e\[[^m]*m[-+]' | grep -Ev '(--- a/|\+\+\+ b/)'
  • , 표현식 ^\e\[[^m]*m[-+]은 줄의 시작 ( ^), 이스케이프 문자 ( \e) [, 이스케이프 시퀀스를 함께 시작한 다음 "m"이 아닌 문자 (숫자, 세미콜론 또는 아무것도 없음), " 이스케이프 시퀀스를 종료하는 m ".
  • 참고 다음의 모든 유효한 이스케이프 시퀀스 것을 : \e[0m(리셋), \e[m(또 다시), \e[1m(굵게), \e[31m(적색), \e[32m(녹색) \e[9;31m, (+ 빨간색 삼진)\e[31;9m (삼진 + 적색), \e[1;4;9;31m(굵게 + 밑줄 + 취소 선 + 빨간색). 기본 자식 색상은 빨강과 녹색을 사용하지만 재구성 할 수 있습니다.
  • --color 와 같다 --color=always .
  • 에 대한 제한 --- a/이나 +++ b/광고의 시작에 표시하는 이스케이프 시퀀스를 수용하기 위해 제거되었으며, 이것은 에지 경우가 발생할 수있다.

추가 사항 :

  • -R,, 와 같은 추가 git diff 옵션을 사용하는 경우 위의 솔루션을 수정해야합니다 --src-prefix.--dst-prefix , --no-prefix, 등
  • 두 개의 grep -E -v '^(\+\+\+ b/|--- a/|@@ |diff --git|index )'grep을 하나로 결합 할 수 있지만 이중 grep 버전을 이해하기가 더 쉽다는 것을 알았습니다.

2
좋은데 각 필터에 대한 명확한 설명이 필요합니다.
henrebotha

git diff로 시작하는 "헤더"유형의 줄이 많이 @@있지만, 또는로 git diff시작하는 줄 은 무엇 입니까? 나는 그것들을 몰랐다. ---+++
Gabriel Staples

아, 신경 쓰지 마 추가 ( +++) 또는 삭제 ( ---) 가 포함 된 파일의 파일 이름을 나타냅니다 . git-scm.com/docs/git-diff#_combined_diff_format 여기에 있습니다 .
Gabriel Staples

다시 수정 : --- a/filename"왼쪽에있는 파일"또는 이전과 +++ b/filename같은 파일을 나타내는 것으로 보이고 "오른쪽에있는 파일"또는 현재 파일을 변경 한대로 나타냅니다. 나는 git difftoolmeld와 함께 사용하는 데 익숙해 있는데, 이는 나란히 아름다운 비교를 보여 주므로 결코 익숙해지지 않았 git diff으므로 여전히 나에게 이상해 보이며 결코 이전에 이러한 뉘앙스를 보지 못했습니다.
Gabriel Staples

1
@GabrielStaples, 색상 지원이 추가되었습니다. 감사.
user650654

6

Chris의 최근 의견에 이어 사후 처리의 주요 문제는 줄을 시작으로 유지하고으로 시작하는 줄 -|+을 필터링하려는 것입니다 ---|+++. 반면에 repo에 패치 파일을 저장하는 경우 ( Pydoop에서 )으로 시작하는 줄을 유지 --|++하려면 정규 표현식이 약간 관여하게됩니다.

git diff | grep -P '^\+(?:(?!\+\+))|^-(?:(?!--))'

정규 표현식은 부정적인 예측을 사용합니다. 이 질문에 대한 Peter Boughton의 답변 참조 . 자세한 설명 대한 .

이 작업을 자주 수행하면 git 별칭을 설정할 수 있습니다.

git config --global alias.diffonly '!git diff | grep -P "^\+(?:(?!\+\+))|^-(?:(?!--))"'

1
이것은 Windows git bash에서 작동하지 않았습니다. 왜 그런지 알지 못합니다 (grep가 유효하지 않은 옵션 P라고 말했습니다).
Dennis

1
-P또는 --perl-regexp패턴을 Perl 일반 rexpression으로 해석하는 데 사용되지만 항상 구현되는 것은 아닙니다. OSX에서는 작동하지 않았습니다. gnu.org/software/grep/manual/grep.html#grep-Programs
Willington Vega

5

간단한 경우에는 정규 표현식이 훨씬 짧고 기억하기 쉬울 수 있다고 생각합니다. 라인 자체 +또는-

$ git diff | grep '^[+|-][^+|-]'

정규 표현식에 따르면 줄은 +또는로 시작해야 -하며 바로 뒤에 나오는 문자는 그 문자가 아니어야합니다. 내가 탈출했는지 여부에 관계없이 동일한 결과를 얻었습니다 +.


예:

$ cat testfile
A
B
C
D
E
F
G

말 I 변화 CX, EY, 그리고 GZ.

$ git diff | grep '^[+|-][^+|-]'
-C
+X
-E
+Y
-G
+Z

위에서 말했듯이 이것은 대부분의 경우에 해당됩니다. 해당 출력을 file로 파이프 dout하면 동일한 정규식을 시도해도 작동하지 않습니다.

$ git diff dout | grep '^[+|-][^+|-]'
$

어쨌든, 당신의 경우에 도움이되기를 바랍니다.


줄이 "-"로 시작하는 경우 작동하지 않습니다. 예 : - name: No pdbyaml 파일
anapaulagomes

3

이 답변은 가독성을 위해 원래의 빨강 / 녹색을 유지합니다. 구문에 몇 가지 변형을 제공했습니다.

git diff --color | grep --color=never $'^\e\[3[12]m'
git diff --color | grep --color=never $'^\033\[3[12]m'
git diff --color | grep --color=never -P '^\e\[3[12]m'
git diff --color | grep --color=never -P '^\033\[3[12]m'

설명:

  • 그만큼 git diff --color 이 파이프되는 색상을 사용하지 않도록 설정에서 자식을 방지하기 위해 필요하다.
  • 그만큼 grep --color=never grep이 원래 색상을 제거하고 일치하는 문자열을 강조 표시하지 않도록합니다.
  • 빨간색 ( \e[31m) 또는 녹색 (\e[32m ) 이스케이프 코드로 찾습니다.
  • $'...'(ANSI-C 인용 구) 또는 -P(펄 구문)하게하는 grep해석 \e또는 \033int로서 ESC문자.

고마워 내가 방금 생각 해낸 대체 양식이 있습니다. 당신의 $''부분은 특히 나를 도왔습니다. stackoverflow.com/a/61929887/4561887
Gabriel Staples

1

색상이나 텍스트 서식을 고려 awk하여 +and -줄만 표시 하는 방법을 사용 하여 git diff출력 할 수 있습니다.

여기에 다른 답변 중 하나 ( 내 다른 답변 포함 )가 100 % 올바르게 원하는 것을 정확하게 수행하지는 않습니다. 그러나이 답변은 그렇습니다. 다음은 터미널에 복사하여 붙여 넣을 수있는 1 라이너입니다. 가독성을 위해 여러 줄을 만들었습니다. 같은 방식으로 복사하여 붙여 넣을 수 있으므로 읽을 수 있습니다! awk프로그래밍 언어 에 의존 합니다 :

git diff --color=always "$@" | awk '
# 1. Match and then skip "--- a/" and "+++ b/" lines
/^(\033\[(([0-9]{1,2};?){1,10})m)?(--- a\/|\+\+\+ b\/)/ {
    next 
} 
# 2. Now print the remaining "+" and "-" lines ONLY! Note: doing step 1 above first was required or
# else those lines would have been matched by this matcher below too since they also begin with 
# the "+" and "-" symbols.
/^(\033\[(([0-9]{1,2};?){1,10})m)?[-+]/ {
    print $0 
}
' | less -RFX

그 기능은 다음과 같습니다. 이러한 모든 기능을 함께 사용하면 다른 모든 답변의 단점을 해결할 수 있습니다.

  1. 컬러 및 무 컬러 출력을 처리합니다. 이것이이 정규 표현식의 기능입니다.^(\033\[(([0-9]{1,2};?){1,10})m)?
  2. 그것은 모든 색상과 당신이 수 등 굵게, 기울임 꼴, 취소,를 포함하여 모든의 텍스트 서식 옵션, 처리 하여 설정 git config설정을 . 즉, 위의 정규식이 이유 ;?{1,10}그것에서 : 그것이 색상이나 텍스트 서식 코드의 시작을 감지하면, 이러한 결합 ANSI 코드 (10 개) 순서까지 일치합니다.
  3. 또한 허용되는 답변 과 같이로 시작 @@하는 단어와 단어 가 포함되지 않습니다. 그 줄을 원한다면 (정말로 유용하다고 생각합니다 :)) 대신 다음을 수행하십시오.diff

    git diff --unified=0
    

    또는

    git diff -U0
    
  4. 이 같은 정확한 방법으로 출력을 보여줍니다 git diff겠습니까 다음의 less옵션 컬러 출력 (와 호출기 -R), 텍스트 인 경우에만> 1 페이지 ( -F) 화면에 텍스트의 현재 페이지를 유지하면서 때 qUIT ( -X) .

또한 awk 프로그래밍 언어를 사용하기 때문에 강력 하고 쉽게 구성 할 수 있다는 이점이 있습니다.

awk 학습에 관심이 있다면 다음 자료를 참조하십시오.

  1. gawk(GNU awk) 매뉴얼 : https://www.gnu.org/software/gawk/manual/html_node/index.html#SEC_Contents
  2. 연구 git diffn및 의견 : https://github.com/ElectricRCAircraftGuy/eRCaGuy_dotfiles/blob/master/useful_scripts/git-diffn.sh
    1. 라인 번호 git diffngit diff있는 원한다면 라인 번호 가 있는 Git diff (라인 번호가있는 Git log)를 참조하십시오.
  3. awk "hello world"및 구문 테스트 예제 : https://github.com/ElectricRCAircraftGuy/eRCaGuy_hello_world/tree/master/awk

보너스로, 나는 또한로 사용될 위의 내용을 마무리했다. git diffc"git diff는 오직 'c'hanges"를 표시한다. 사용법은 동일git diff; 그냥 git diffc대신 사용하십시오! 모든 옵션을 지원합니다. 색상은 기본적으로 켜져 있습니다. 끄려면 간단히 git diffc --no-color또는을 사용하십시오 git diffc --color=never. 자세한 내용 man git diff을 참조하십시오.

어제 밤에 ( 'n'umbers git diffn로 표시하는 도구)를 마쳤 기 때문에 git diff글쓰기 git diffc는 간단했습니다. 나는 지식이 머리 속에 신선하지만 지금은 더 잘 할 것이라고 생각했다.

설치 git diffc:

지침에 표시된 곳을 제외 하고이 답변 끝 부분의 지침을 따르십시오 . 대신 git-diffn사용 하십시오 git-diffc. 그것은 wget명령에도 포함됩니다 . 다운로드 및 설치 git diffc가 쉽습니다. 몇 가지 명령 일뿐입니다.


0

다음은 수정 된 행만 찾는 간단한 방법 중 하나이므로 색상 출력을 유지하면서 단일 +또는로 시작 -합니다.

git diff -U0 --color=always HEAD~ | grep --color=never -E $'^\e\[(32m\+|31m-)'
  1. -U0바로 변경 선 자신을 포함 : 예 - 변경된 라인 주변 상황의 0 선을 포함하도록했다. 참조하십시오 man git diff.
  2. -E그렙에 대한 확장 정규 표현식으로 작동하도록 할 수 있습니다
  3. $''구문은 ESC (이스케이프 또는 0x1b) 문자를 올바르게 해석하는 ANSI 인용을 허용합니다. 여기를 참조 하십시오 .
  4. https://www.regex101.com 의 정규식 설명은 다음과 같습니다.여기에 이미지 설명을 입력하십시오
  5. 기본적으로 ^\e의 시작 \[과 일치하고 터미널의 색상 코드의 시작 인 이스케이프 문자와 일치하며 색상 코드 의 다음 문자 인 [, 그리고 (this|that)구문은 "this"또는 "that"과 일치합니다. 여기서 "this"는 32m+녹색 + 선이며 31m-빨간색 선입니다.
  6. 색상은 다음과 같습니다 : \e[32m녹색이고 \e[31m빨간색입니다.
  7. +프로그램에 의해 표시 라인 git diff첨가 물론하고 -방송 라인에 의해 표시 git diff를 삭제한다.
  8. 참고 --color=never되어 필요한 2에 grep달리에서 들어오는 컬러 코드를 망치는 것 그 경기, 강조하는 것을 방지하기 위해 표현 git diff왼쪽으로합니다.
  9. +으로도 탈출해야합니다 \+그렇지 않으면이 때문에 +지정하는 특수 정규 표현식 (정규식) 문자 앞의 요소의 하나 또는 그 이상의 발생을 . 여기 참조 : https://en.wikipedia.org/wiki/Regular_expression#Basic_concepts를 .

참고 문헌 :

  1. https://git-scm.com/docs/git-diff#_combined_diff_format
  2. 의해 답변을 @ user650654 : Git diff 수정 된 줄만 표시
  3. 의해 답변을 @wisbucky : Git diff 수정 된 줄만 표시

관련 :

  1. [나만의 답변] 줄 번호가있는 Git diff (줄 번호가있는 Git 로그)
  2. [다른 사람의 대답] 줄 번호가있는 Git diff (줄 번호가있는 Git 로그)
  3. 줄 번호와 적절한 코드 정렬 / 들여 쓰기가있는 git diff
  4. git-filechange-search.sh-파일에서 변수 또는 함수 이름을 검색하고 해당 변수 또는 함수 이름에 대한 변경 사항이 포함 된 커밋을 파악할 수있는 스크립트입니다 . 전의. 사용법 : file.cpp에 포함 된 ./git-filechange-search.sh path/to/my/file.cpp variable_name모든 커밋 을 찾습니다 variable_name. 특정 기능이 언제 어디서 변경되었는지 확인하는 데 유용합니다. git blame시간이 지남에 따라 표시되는 파일의 섹션을 관찰 할 수있는 검색 인 것처럼 보입니다 .
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.