수정된 라인만 표시하는 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
내가 변했다고 말해줘요C
X
,E
Y
,그리고.G
Z
.
$ 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 --color
Git가 배관 작업 중에 색상을 비활성화하지 않도록 방지하기 위해 필요합니다. - 그
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-)'
- 그
-U0
변경된 줄 주위에 0줄의 컨텍스트를 포함하도록 합니다. 즉, 변경된 줄 자체만 포함합니다. 참조man git diff
. - 그
-E
for grep는 확장된 정규 표현식과 함께 작동할 수 있습니다. - 그
$''
구문은 ESC(탈출 또는 0x1b) 문자를 적절하게 해석하는 ANSI 견적을 허용합니다.여기 보세요. - 다음은 https://www.regex101.com 의 정규식 설명입니다.
- 기적으로본,
^
부분인 줄의시부일치분니다합과 합니다.\e
, 터미에서코색시이작인문일자다치니와 합니다.\[
코드의 인 상색코 의문일니치다즉합와자다와 합니다. ,[
그음에다.(this|that)
은 "과 일치합니다. "this는 "this" "this" "that"입니다. 여기서 "this"는32m+
, 이은녹 + 이고선,31m-
빨간색 선입니다. - 색은다음같습니다과상같다니습.
\e[32m
이고 녹이고색입니다.\e[31m
빨간색입니다. +
는 로표된선표다로 .git diff
처럼, 물론추가로, 그고리고.-
는 로표된선표다로 .git diff
삭제한 대로- :
--color=never
2일에 필요합니다.grep
일치하는 항목을 강조 표시하지 않도록 하기 위한 표현, 그렇지 않으면 들어오는 색상 코드를 스크루합니다.git diff
- 그
+
또한 탈출해야 합니다.\+
왜냐하면 그렇지 않으면+
하나 이상의 이전 요소를 지정하는 특수 정규식(정규식) 문자입니다.다음을 참조하십시오. https://en.wikipedia.org/wiki/Regular_expression#Basic_concepts .
참조:
- https://git-scm.com/docs/git-diff#_combined_diff_format
- @user650654에 의한 답변:수정된 라인만 표시하는 Gitdiff
- @wisbucky의 답변: 수정된 라인만 표시하는 Gitdiff
관련:
- [나만의 답] 줄 번호가 있는 Git diff (줄 번호가 있는 Git log)
- [누군가의 대답] 줄 번호가 있는 Git diff (줄 번호가 있는 Git log)
- 라인 번호 및 올바른 코드 정렬/해석을 사용한 gitdiff
git-filechange-search.sh
파일에서 변수 또는 함수 이름을 검색하고 해당 변수 또는 함수 이름의 변경 내용을 포함하는 커밋을 확인할 수 있는 스크립트입니다.예. 용도:./git-filechange-search.sh path/to/my/file.cpp variable_name
다음을 포함하는 file.cpp에 대한 변경 사항이 있는 모든 커밋을 찾습니다.variable_name
할 수 있습니다.특정 기능이 변경된 위치와 시기를 확인하는 데 유용합니다.마치 다음을 통해 표시되는 파일의 섹션을 관찰할 수 있는 검색과 같습니다.git blame
시간이 지남에 따라
git에게 수정된 라인만 보여주고 수정되지 않은 다른 코드는 모두 무시해달라고 요청해도 됩니까?
빠른 답변 감사합니다.은 제 , 의▁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
.
이 모든 기능을 종합하면 여기서 다른 모든 답변의 단점을 해결할 수 있습니다.
- 컬러 및 무컬러 출력을 처리합니다.바로 이 이이바이정수이행작는업다니입하식규로것▁that다.
^(\033\[(([0-9]{1,2};?){1,10})m)?
- 설정에서 설정할 수 있는 굵게 표시, 기울임꼴, 강조 표시 등을 포함한 모든 색상 및 모든 텍스트 서식 옵션을 처리합니다.그래서 위 정규식이
;?
그리고.{1,10}
그 안에서: 색상 또는 텍스트 형식 코드의 시작을 감지하면 최대 10개의 결합된 ANSI 코드 시퀀스와 일치합니다. - 또다음로시작라는포인않함습다로 하지 않습니다.
@@
그고그말리라는diff
일반적인 대답과 같이(솔직히 말해서, 나는 유용하다고 생각한다 :) 만약 당신이 그 대사들을 원한다면, 대신에 이것을 수행하세요:
또는git diff --unified=0
git diff -U0
- 출력은 다음과 동일한 방식으로 표시됩니다.
git diff
: 에서less
있는 (옵출색상출호있기는이력션(▁with▁pager기호출옵▁optional▁output-R
에만 ( ), 1페이지 이상일 경우 ( )-F
) 및 ) 시 페이지를 유지하면서 할 수 있습니다.q
uit)-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를 배우는 데 관심이 있다면 다음과 같은 자료가 있습니다.
gawk
GNU(GNU)awk
) 매뉴얼: https://www.gnu.org/software/gawk/manual/html_node/index.html#SEC_Contents- »
git diffn
그리고 그 안에 있는 논평들: https://github.com/ElectricRCAircraftGuy/eRCaGuy_dotfiles/blob/master/useful_scripts/git-diffn.sh - 네가 원한다면
git diffn
too,즉 시역즉, 시▁toogit diff
라인 번호의 경우, 여기를 참조하십시오. 라인 번호의 경우 Git diff(라인 번호의 경우 Git 로그) - 몇 가지 어색한 "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 diff
umbers)와에, 에밤썼다글, 니로습줄을어숫젯을 씁니다.git diffc
사소한 일이었습니다.나는 지식이 머릿속에 생생할 때 그것을 지금 하는 것이 좋겠다고 생각했습니다.
언급URL : https://stackoverflow.com/questions/18810623/git-diff-to-show-only-lines-that-have-been-modified
'programing' 카테고리의 다른 글
도커 파일의 이름이 도커 파일이 아닌 경우 도커 파일을 작성하려면 어떻게 해야 합니까? (0) | 2023.08.17 |
---|---|
다른 이름으로 저장 대화 상자에서 선택한 파일을 저장하는 방법은 무엇입니까? (0) | 2023.08.17 |
Gradle 버전을 어떻게 결정합니까? (0) | 2023.08.17 |
SQL Server에서 날짜 문자열을 날짜 시간과 비교하시겠습니까? (0) | 2023.08.17 |
#undef 앞에 #ifdef가 언제 필요합니까? (0) | 2023.08.17 |