programing

수정된 라인만 표시하는 Gitdiff

javajsp 2023. 8. 17. 20:46

수정된 라인만 표시하는 Gitdiff

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에게 수정된 라인만 보여주고 수정되지 않은 다른 코드는 모두 무시해달라고 요청해도 됩니까?저는 앞에 "+" 또는 "-" 기호가 없는 모든 선을 제거하는 방법을 썼지만, 저는 이것을 하는 더 간단한 방법이 있을 것이라고 확신합니다.

저의 기트디프에서는 수정된 라인만 보는 것에 관심이 있습니다.

당신이 원하는 것은 문맥이 0줄인 diff입니다.다음을 사용하여 생성할 수 있습니다.

git diff --unified=0

또는

git diff -U0

이 옵션을 해당 리포지토리의 구성 옵션으로 설정할 수도 있습니다.

git config diff.context 0

모든 리포지토리에 대해 전역으로 설정하려면:

 git config --global diff.context 0

+그리고.-:

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

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

  • git diff -U0 lines 0을 합니다.
  • 는 첫번째 grep은음으로시작하모는든포다로 합니다.+또는-
  • 번째 는 두번째 grep는으로 하는 줄을 제외합니다.--- a/또는+++ b/

색.

색상 차이를 표시하려면 다음을 시도합니다.

git diff -U0 --color | grep '^\e\[[^m]*m[-+]' | grep -Ev '(--- a/|\+\+\+ b/)'
  • ^\e\[[^m]*m[-+] 부분을 .^그에 이스케이프 (, ), 그다음이스프이문자케런문(자▁),▁(),▁char▁the▁thenacer▁escape프().\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/줄의 시작 부분에 나타나는 것은 이스케이프 시퀀스를 수용하기 위해 제거되었으며, 이는 에지 케이스로 이어질 수 있습니다.

추가 참고 사항:

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

쉽다고 하는데, 행가 간한경수있쉬며, 줄자시는줄되로 하는 행 .+또는-

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

이 정식은행다시로한말작합다다니고야해로 .+또는-그리고 바로 뒤에 나오는 캐릭터는 둘 중 하나가 아니어야 합니다.내가 탈출했든 간에 같은 결과를 얻었습니다.+아니면 여기가 아니던가, 근데...


예:

$ cat testfile
A
B
C
D
E
F
G

내가 변했다고 말해줘요CX,EY,그리고.GZ.

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

하지만 위에서 말했듯이, 이것은 대부분의 경우에만 해당됩니다.해당 출력을 파일로 파이프로 연결하는 경우dout그럼 같은 정규식을 시도해 보세요, 작동하지 않을 거예요.

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

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

Chris의 최근 의견에 따라, 사후 처리의 주요 문제는 다음과 같이 라인을 계속 유지하려는 것입니다.-|+ 지만당신또한그시로작것는하들싶걸다어니로 싶을 거예요.---|+++반면에, 당신이 당신의 레포에 패치 파일을 저장하는 경우(나는 Pydoop에서), 당신은 다음으로 시작하는 줄을 유지하기를 원합니다.--|++관여하게 . regexp 약간 여관됩니다게하가됩▁so니.

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

정규 표현은 부정적인 전망을 사용합니다. 자세한 설명은 이 질문에 대한 피터 부용의 답변을 참조하십시오.

이 작업을 자주 수행하는 경우 다음과 같이 Git 별칭을 설정할 수 있습니다.

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

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

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 --colorGit가 배관 작업 중에 색상을 비활성화하지 않도록 방지하기 위해 필요합니다.
  • grep --color=never문자열을 표시하는 것을 것입니다. grep 원 래 색 제 하 고 하 을 합 다 니 표 시 하 않 록 지 도 조 가 강 열 자 문 는 치 일 을 거 ▁gre ▁is 다니▁togrep합▁preventing
  • 합니다.\e[31m 녹색입니다.\e[32m 코드 이스케이프 코드.
  • $'...' 구문) (ANSI-C 견적) 견-P은 (으)ㄹ 수 있게 하는 입니다.grep\e또는\033한 사람으로서ESC성격.

줄만 , 의 기여수된수있더간는방단있법다로 시작하는 또 다른 간단한 따라서 단일 줄로 시작합니다.+또는-출력을 : 색상출유는동안하지력:

git diff -U0 --color=always HEAD~ | grep --color=never -E $'^\e\[(32m\+|31m-)'
  1. -U0변경된 줄 주위에 0줄의 컨텍스트를 포함하도록 합니다. 즉, 변경된 줄 자체만 포함합니다. 참조man git diff.
  2. -Efor grep는 확장된 정규 표현식과 함께 작동할 수 있습니다.
  3. $''구문은 ESC(탈출 또는 0x1b) 문자를 적절하게 해석하는 ANSI 견적을 허용합니다.여기 보세요.
  4. 다음은 https://www.regex101.com 의 정규식 설명입니다.
  5. 기적으로본,^ 부분인 줄의시부일치분니다합과 합니다.\e, 터미에서코색시이작인문일자다치니와 합니다.\[코드의 인 상색코 의문일니치다즉합와자다와 합니다. ,[ 그음에다.(this|that)은 "과 일치합니다. "this는 "this" "this" "that"입니다. 여기서 "this"는32m+, 이은녹 + 이고선,31m-빨간색 선입니다.
  6. 색은다음같습니다과상같다니습.\e[32m이고 녹이고색입니다.\e[31m빨간색입니다.
  7. +는 로표된선표다로 .git diff처럼, 물론추가로, 그고리고.-는 로표된선표다로 .git diff삭제한 대로
  8. :--color=never2일에 필요합니다.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에 의한 답변:수정된 라인만 표시하는 Gitdiff
  3. @wisbucky의 답변: 수정된 라인만 표시하는 Gitdiff

관련:

  1. [나만의 답] 줄 번호가 있는 Git diff (번호가 있는 Git log)
  2. [누군가의 대답] 줄 번호가 있는 Git diff (번호가 있는 Git log)
  3. 라인 번호 및 올바른 코드 정렬/해석을 사용한 gitdiff
  4. git-filechange-search.sh 파일에서 변수 또는 함수 이름을 검색하고 해당 변수 또는 함수 이름의 변경 내용을 포함하는 커밋을 확인할 수 있는 스크립트입니다.예. 용도:./git-filechange-search.sh path/to/my/file.cpp variable_name다음을 포함하는 file.cpp에 대한 변경 사항이 있는 모든 커밋을 찾습니다.variable_name할 수 있습니다.특정 기능이 변경된 위치와 시기를 확인하는 데 유용합니다.마치 다음을 통해 표시되는 파일의 섹션을 관찰할 수 있는 검색과 같습니다.git blame시간이 지남에 따라

git에게 수정된 라인만 보여주고 수정되지 않은 다른 코드는 모두 무시해달라고 요청해도 됩니까?

그리고 주요 답변 아래 OP의 후속 논평에서:

빠른 답변 감사합니다.은 제 , 의▁like▁lines▁some▁this다▁getting있▁still니▁am습▁i▁but받고이▁solves▁of것▁problem대▁half사를과 같은 대사를 받고 있습니다.@@ -1 +1 @@의 맨 에는 나의곤과내기꼭에대기의프디트경▁in에꼭기대▁of나▁top▁my의▁have▁g▁and.diff --git a/db/xxxxxxx b/db/xxxx index xxxxx..aaaaaaa bbbbbbbb

위의 해결하기 , 에 위두가요청라모두해위결, 여에는사 1인이다있을 .git-diffc.sh awk-제가 쓴 언어 기반의 포장지git diff:

git diffc

알았어!

은 다은의기다니입의 특징입니다.git diffc.
이 모든 기능을 종합하면 여기서 다른 모든 답변의 단점을 해결할 수 있습니다.

  1. 컬러 및 무컬러 출력을 처리합니다.바로 이 이이바이정수이행작는업다니입하식규로것▁that다.^(\033\[(([0-9]{1,2};?){1,10})m)?
  2. 설정에서 설정할 수 있는 굵게 표시, 기울임꼴, 강조 표시 등을 포함한 모든 색상 및 모든 텍스트 서식 옵션을 처리합니다.그래서 위 정규식이;?그리고.{1,10}그 안에서: 색상 또는 텍스트 형식 코드의 시작을 감지하면 최대 10개의 결합된 ANSI 코드 시퀀스와 일치합니다.
  3. 또다음로시작라는포인않함습다로 하지 않습니다.@@ 그고그말리라는 diff일반적인 대답과 같이(솔직히 말해서, 나는 유용하다고 생각한다 :) 만약 당신이 그 대사들을 원한다면, 대신에 이것을 수행하세요:
    git diff --unified=0
    
    또는
    git diff -U0
    
  4. 출력은 다음과 동일한 방식으로 표시됩니다.git diff: 에서less있는 (옵출색상출호있기는이력션(▁with▁pager기호출옵▁optional▁output-R에만 ( ), 1페이지 이상일 경우 ( )-F ) 및 ) 시 페이지를 유지하면서 할 수 있습니다.quit)-X).

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

『 』 『 』의 예git diff 8d4d4fd3b60f200cbbb87f2b352fb097792180b2~2..8d4d4fd3b60f200cbbb87f2b352fb097792180b2~3:

diff --git a/useful_scripts/rg_replace.sh b/useful_scripts/rg_replace.sh
index 74bc5bb..0add69d 100755
--- a/useful_scripts/rg_replace.sh
+++ b/useful_scripts/rg_replace.sh
@@ -2,12 +2,11 @@
 
 # This file is part of eRCaGuy_dotfiles: https://github.com/ElectricRCAircraftGuy/eRCaGuy_dotfiles
 
-# STATUS: functional and ready-to-use
-
+# WORK IN PROGRESS! <===========
 # This is a simple wrapper around RipGrep (`rg`) to allow in-place find-and-replace, since the
 # `rg --replace` option replaces only the stdout, NOT the contents of the file.
 # `man rg` under the `--replace` section states: "Neither this flag nor any other ripgrep
-# flag will modify your files." This wrapper overcomes that limitation.
+# flag will modify your files."
 
 # INSTALLATION INSTRUCTIONS:
 # 1. Install RipGrep: https://github.com/BurntSushi/ripgrep#installation

샘 출 력 비 대의 샘플 git diffc 8d4d4fd3b60f200cbbb87f2b352fb097792180b2~2..8d4d4fd3b60f200cbbb87f2b352fb097792180b2~3에만 주의하십시오.-그리고.+, ▁as▁such▁lines▁other▁are▁lines다▁lines니▁shown▁are표시됩,선▁and▁all▁whereas▁contexting▁surround이모▁gone선이든다른,같과 같은 다른 모든 선들이 표시됩니다.diff,index,---,+++,그리고.@@역시 사라졌습니다!:

-# STATUS: functional and ready-to-use
-
+# WORK IN PROGRESS! <===========
-# flag will modify your files." This wrapper overcomes that limitation.
+# flag will modify your files."

git diffc는 "git diff changes"의 약자로, 코드의 변경된 행만 표시하고 다른 것은 표시하지 않음을 의미합니다.나는 적었다.그것은 일반 깃의 일부가 아닙니다.

에서 지원 모및매변지다에서 하는 모든 합니다.git diff그냥 가벼운 포장지이기 때문에.git diff.

git-diffc.sh 에서 다운로드하십시오.이것은 나의 eRCaGuy_dot files repo의 일부입니다.

설치 방법:

git clone https://github.com/ElectricRCAircraftGuy/eRCaGuy_dotfiles.git
cd eRCaGuy_dotfiles/useful_scripts
mkdir -p ~/bin
ln -si "${PWD}/git-diffc.sh" ~/bin/git-diffc

하십시오. 하십시오.~/bin Ubuntu의 dir인 Ubuntu의 기본 dir를 .~/.profile를 추가할 파일~/bin의 신에게에.PATH 않으면 를 당신의 로그아웃 후에 추가하세요.~/.profile파일을 저장한 다음 Ubuntu에서 로그아웃하고 다시 로그인합니다.

# set PATH so it includes user's private bin if it exists
if [ -d "$HOME/bin" ] ; then
    PATH="$HOME/bin:$PATH"
fi

바로 그거야!

용도: 다음과 같습니다.git diff 예:

git diffc
git diffc -h
git diffc commit1 commit2
git diffc --no-color
# etc.

추가 설치 참고 사항:

여기에 제가 작성한 에 대한 다른 답변의 설치 섹션도 참조하십시오.네가 보는 모든 곳에서git-diffn해당지서사용에를 합니다.git-diffc대신.여기에는 내부도 포함됩니다.wget도다운. 로드및 다운로드git diffc몇 가지 명령만 실행하면 됩니다.

awk단지 그것을 보여주기 위해+그리고.- 형식 지정 색, 또텍트형식설명선스는상,git diff출력 중일 수 있습니다.

는 아의코다구다니성합음을 입니다.git diffc포장지

여기에 나와 있는 다른 답변 중 단 하나(나의 다른 답변 포함)도 귀하가 원하는 것을 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

awk를 배우는 데 관심이 있다면 다음과 같은 자료가 있습니다.

  1. gawkGNU(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
  3. 네가 원한다면git diffntoo,즉 시역즉, 시▁toogit diff라인 번호의 경우, 여기를 참조하십시오. 라인 번호의 경우 Git diff(라인 번호의 경우 Git 로그)
  4. 가지 어색한 "hello world" 및 구문 테스트 예: https://github.com/ElectricRCAircraftGuy/eRCaGuy_hello_world/tree/master/awk

보너스로, 저는 또한 위의 것들을 포장하여 사용하였습니다.git diffc즉, "변화만 보여주기는 어렵다"는 뜻입니다.용도는 다음과 같습니다.git diff 냥쓰기를 합니다.git diffc! 모든 합니다.모든 옵션을 지원합니다.색상은 기본적으로 켜져 있습니다.끄면다사니다용합음을려▁use를 사용하면 됩니다.git diffc --no-color또는git diffc --color=never를 참조하십시오.man git diff상세한 것은

이제 막 끝났으니까 (보여주는 도구)git diffumbers)와에, 에밤썼다글, 니로습줄을어숫젯을 씁니다.git diffc사소한 일이었습니다.나는 지식이 머릿속에 생생할 때 그것을 지금 하는 것이 좋겠다고 생각했습니다.

언급URL : https://stackoverflow.com/questions/18810623/git-diff-to-show-only-lines-that-have-been-modified