내가 할 때 git diff
또는 a를git log -p
출력과 인라인 된 소스 파일의 줄 번호를 어떻게 얻습니까?
나는 그것을 찾아 man git-diff | grep "line numbers"
보려고 노력했고 인터넷 검색을 시도했지만 빨리 아무것도 얻지 못했습니다.
답변:
git diff
현재 행 번호를 옆에 세로로 표시하는 옵션은 없습니다. git diff
.
해당 정보는 diff의 각 변경 사항에 대한 (c) hunk 헤더에서 사용할 수 있지만 통합 된 diff 형식입니다 .
@@ -start,count +start,count @@
파일의 원래 상태는로 표시되고 -
새 상태는로 표시됩니다 +
(덩어리 헤더의 추가 및 삭제를 의미하지는 않습니다. start
파일의 각 버전의 시작 줄 번호를 나타내며 포함 된 줄 수를 count
나타냅니다.) , 시작 지점에서 시작합니다.
diff --git a/osx/.gitconfig b/osx/.gitconfig
index 4fd8f04..fcd220c 100644
--- a/osx/.gitconfig
+++ b/osx/.gitconfig
@@ -11,7 +11,7 @@ <== HERE!
[color "branch"]
upstream = cyan
[color "diff"]
- meta = yellow
+ meta = cyan
plain = white dim
old = red bold
new = green bold
덩어리 헤더
@@ -11,7 +11,7 @@
파일의 이전 버전이 11 행에서 시작하고 7 행이 포함되어 있다고 말합니다.
11 [color "branch"]
12 upstream = cyan
13 [color "diff"]
14 - meta = yellow
14 + meta = cyan
15 plain = white dim
16 old = red bold
17 new = green bold
다음 버전의 파일도 11 행에서 시작하며 7 행도 포함합니다.
아시다시피, 통합 차이 형식은 줄 번호를 쉽게 알아낼 수 없습니다 (최소한 기계가 아닌 경우). 정말로 읽을 수있는 줄 번호를 원한다면, 그것들을 표시 할 diffing 도구를 사용해야합니다.
--unified=0
하거나 -U0
하지만,.
git diffn
되는 드롭 인 교체 (래퍼)를 방금 완료했습니다 . stackoverflow.com/questions/24455377/…git diff
git diff
Andy Talkowski의 코드를 확장하는 두 가지 솔루션이 더 있습니다.
일반 텍스트:
git diff | gawk 'match($0,"^@@ -([0-9]+),[0-9]+ [+]([0-9]+),[0-9]+ @@",a){left=a[1];right=a[2];next};\
/^(---|\+\+\+|[^-+ ])/{print;next};\
{line=substr($0,2)};\
/^-/{print "-" left++ ":" line;next};\
/^[+]/{print "+" right++ ":" line;next};\
{print "(" left++ "," right++ "):"line}'
\033[66m
색상 코드의 형식을 가정 한 색상 텍스트 :
git diff --color=always | \
gawk '{bare=$0;gsub("\033[[][0-9]*m","",bare)};\
match(bare,"^@@ -([0-9]+),[0-9]+ [+]([0-9]+),[0-9]+ @@",a){left=a[1];right=a[2];next};\
bare ~ /^(---|\+\+\+|[^-+ ])/{print;next};\
{line=gensub("^(\033[[][0-9]*m)?(.)","\\2\\1",1,$0)};\
bare~/^-/{print "-"left++ ":" line;next};\
bare~/^[+]/{print "+"right++ ":" line;next};\
{print "("left++","right++"):"line;next}'
코드는 시작 라인 변경 -
과 +
에 -1:-
와 +1:+
아무것도 시작 각각, 그리고 라인 에를
(5,6):
. 번호는 각 파일의 줄 번호입니다.
git diff
는 정렬을 신중하게 유지합니다. 이 코드는 현재 제 머리 위에 있습니다. 기꺼이 수정 하시겠습니까? 즉, 한 줄이 +240:+
이고 다음 줄이라고 (241,257):
표시 될 때 코드가 아래쪽 줄의 코드와 적절한 정렬 및 들여 쓰기를 유지하도록하려면 위쪽 줄에 추가 공백을 추가해야합니다. 아마도 이것은 인쇄로 쉽게 할 수 있습니까?
printf
.
git diffn
. 여기를 참조하십시오 : stackoverflow.com/a/61997003/4561887 . 귀하의 답변에 대해 @PFudd에게 감사드립니다. 나는 그것을 공부하고 배우는 데 사용했고, 처음부터 시작하여 git diffn
. 일단 당신의 코드를 읽을 수 있도록 포맷을 했고 (@EdMorton에게 감사합니다), 저에게 도움이되는 몇 가지 훌륭한 것들을 배울 수있었습니다.
이 문제를 해결하려는 스크립트가 있습니다. 분노로 테스트하지는 않았지만 괜찮아 보입니다. git diff가 생성하는 레코드에 의존하고 awk를 사용하여 줄 수를 유지합니다.
# Massage the @@ counts so they are usable
function prep1() {
cat | awk -F',' 'BEGIN { convert = 0; }
/^@@ / { convert=1; }
/^/ { if ( convert == 1 ) { print $1,$2,$3;
} else { print $0;
}
convert=0;
}'
}
# Extract all new changes added with the line count
function prep2() {
cat | awk 'BEGIN { display=0; line=0; left=0; out=1;}
/^@@ / { out=0; inc=0; line=$4; line--; display=line; left=line; }
/^[-]/ { left++; display=left; inc=0; }
/^[+]/ { line++; display=line; inc=0; }
/^[-+][-+][-+] / { out=0; inc=0; }
/^/ {
line += inc;
left += inc;
display += inc;
if ( out == 1 ) {
print display,$0;
} else {
print $0;
}
out = 1;
inc = 1;
display = line;
}'
}
git diff $1 | prep1 | prep2
git difftool
줄 번호를 표시하는 외부 편집기로 diff를 수행하는 데 사용할 수 있습니다 . vim / vimdiff로 수행하는 방법은 다음과 같습니다.
vimdiff를 git의 difftool로 설정하십시오.
git config --global diff.tool vimdiff
~/.vimrc
vimdiff를 사용할 때 자동으로 줄 번호를 표시하도록 구성 합니다.
if &diff
set number
endif
줄 번호와 함께 vimdiff를 사용하는 git difftool을 실행합니다.
git difftool
빠른 방법은 git diff -U0
. 그러면 컨텍스트 줄이 0으로 설정되어 @@ 값이 실제 변경된 줄과 일치하게됩니다. 기본적으로 @@ 값은 3 줄의 전후 컨텍스트를 포함하므로 사람에게는 편리하지 않습니다.
예:
git diff # default
@@ -10,8 +10,8 @@
라인 10은 이전 컨텍스트의 첫 번째 라인을 참조하기 때문에 변경된 라인의 라인 번호를 계산하기 어렵습니다. 첫 번째 변경된 줄의 실제 줄 번호는 10 + 3 = 13입니다. 변경된 줄의 수를 계산하려면 전후 컨텍스트 (8-3-3 = 2)도 빼야합니다.
git diff -U0
@@ -13,2 +13,2 @@
보시다시피 context = 0으로 설정하면 사람이 @@ 값을 더 쉽게 읽을 수 있습니다. 변경된 라인이 13 행에서 시작하고 2 개의 변경된 라인이 있음을 알 수 있습니다.
이것은 각 블록의 줄 번호 만 보여주기 때문에 완벽하지 않습니다. 모든 줄의 줄 번호를 보려면 외부 편집기에 difftool을 사용하십시오. 참조 https://stackoverflow.com/a/50049752를
나는 내 difftool git difftool
로 meld 와 함께 사용 하는 것을 좋아합니다 . 보다보기 쉽고 git diff
, 나란히있는 GUI 비교가 좋으며, 각면에 줄 번호가 표시됩니다.
난 그냥 쓴 git diffn
드롭 인 교체로 지난 몇 일 동안 git diff
명령 줄에서. 한번 시도해보세요. 여기 내 다른 대답을 참조하십시오 .
2020 년 5 월 24 일부로 이제 git diffn
이러한 목적 으로 타사 도구 (전체 공개 : 내가 작성)를 사용할 수 있습니다. 패턴 / 액션 기반 프로그래밍 언어로 git diff
작성된 경량 래퍼 awk
입니다. 다음은 실행의 샘플 출력입니다 git diffn
.
다음은 데모입니다.
git diffn
:이 파일을 만듭니다.
hello_world.c :
#include <stdio.h>
int main()
{
printf("Hello World\n");
return 0;
}
커밋 :
git add hello_world.c
git commit -m "add hello_world.c"
이것을 변경하고 파일을 저장하십시오.
hello_world.c :
// Basic hello world example
#include <stdio.h>
int main(int argc, char *argv[])
{
printf("Hello Gabriel\n");
int i = 700;
printf("i = %i\n", i);
return 0;
}
이제 실행 :
git diff
다음 git diff
은 비교 목적을위한 first 의 출력입니다 .
$ git diff
diff --git a/hello_world.c b/hello_world.c
index e01704a..e971b73 100644
--- a/hello_world.c
+++ b/hello_world.c
@@ -1,8 +1,12 @@
+// Basic hello world example
+
#include <stdio.h>
-int main()
+int main(int argc, char *argv[])
{
- printf("Hello World\n");
-
+ printf("Hello Gabriel\n");
+
+ int i = 700;
+ printf("i = %i\n", i);
return 0;
-}
\ No newline at end of file
+}
그리고 색상을 보여주는 스크린 샷. 빨간색으로 강조 표시된 섹션은 삭제할 수있는 빈 공백 (이 경우에는 공백)을 보여줍니다.
이제 여기에 git diffn
. 모든 줄 번호를 완벽하게 보여줍니다!
-
왼쪽과 오른쪽 모두에 표시가 표시되어 :
더 잘 볼 수 있습니다. 화면 왼쪽.+
의 맨 왼쪽과 오른쪽 모두에 기호 가 표시됩니다 :
.,
.출력 git diffn
:
$ git diffn
diff --git a/hello_world.c b/hello_world.c
index e01704a..e971b73 100644
--- a/hello_world.c
+++ b/hello_world.c
@@ -1,8 +1,12 @@
+ 1:+// Basic hello world example
+ 2:+
1, 3: #include <stdio.h>
2, 4:
- 3 :-int main()
+ 5:+int main(int argc, char *argv[])
4, 6: {
- 5 :- printf("Hello World\n");
- 6 :-
+ 7:+ printf("Hello Gabriel\n");
+ 8:+
+ 9:+ int i = 700;
+ 10:+ printf("i = %i\n", i);
7, 11: return 0;
- 8 :-}
\ No newline at end of file
+ 12:+}
그리고 색상을 보여주는 스크린 샷. 콜론은 왼쪽과 오른쪽의 주변 텍스트와 일치하도록 색상이 지정되거나 스타일이 지정되지 않습니다. 이것은 왼쪽에 추가 된 줄 번호와 오른쪽에 원래 출력 사이에 시각적 구분 기호 역할을하는 의도적 이며 설계된 동작 git diff
입니다.
상단git-diffn.sh
부터 :
기술:
git-diffn.sh
git diff
라인 'n'umbers도 표시 하는 드롭 인 교체 ! 그것을 사용하여 정확히 처럼 git diff
당신이 당신의 변경의 의미가 아니라 도움에 관해서는이 아름다운 줄 번호를 볼 수 있습니다 제외.
가볍고 가벼운 awk 언어 기반 래퍼 git diff
이기 때문에 허용하는 모든 옵션과 매개 변수를 git diff
허용합니다. 예 :
git diffn HEAD~
git diffn HEAD~3..HEAD~2
git diff
사용자 정의 색상을 사용하는 경우에도 모든 색상 설정에서 작동 합니다.
사용자 정의 diff 색상을 설정하는 방법과 사용자 정의 색상 출력의 스크린 샷을 보려면 여기 내 대답을 참조하십시오. git diffn
: 어떻게 당신이 사랑하는 헤더의 자식은 diff의 색상을 사용자 정의 할을?
다음은 git config
위의 답변에서 사용자 정의를 설정 하는 몇 가지 샘플 명령입니다.git diff
색상 및 속성 (텍스트 서식) .
git config --global color.diff.meta "blue"
git config --global color.diff.old "black red strike"
git config --global color.diff.new "black green italic"
git config --global color.diff.context "yellow bold"
에서 git diffn
컬러 출력은 기본적으로 켜져 있습니다. 당신은 출력 색상을 사용하지 않으려면, 당신은 사용해야 --no-color
하거나 --color=never
. 자세한 내용은를 참조 man git diff
하십시오. 예 :
git diffn --color=never HEAD~
git diffn --no-color HEAD~3..HEAD~2
gawk
. 그렇다면 이것을 시도 하십시오 : brew install gawk
.옵션 1 (내 권장 사항) : 전체 저장소를 다운로드 한 다음 프로그램에 대한 심볼릭 링크를 생성하여 git pull
원할 때마다 저장소에서 a 를 수행하여 쉽게 업데이트를받을 수 있도록합니다 .
첫째, cd
이것을 설치하고 싶은 곳에. 그런 다음 다음을 실행하십시오.
git clone https://github.com/ElectricRCAircraftGuy/eRCaGuy_dotfiles.git
cd eRCaGuy_dotfiles/useful_scripts
mkdir -p ~/bin
ln -si "${PWD}/git-diffn.sh" ~/bin/git-diffn
끝난! 이제 아래의 마지막 단계를 수행하십시오!
옵션 2 (1 개 파일 만 원하는 경우) : 한 파일 만 다운로드합니다.
mkdir -p ~/bin
cd ~/bin
wget https://raw.githubusercontent.com/ElectricRCAircraftGuy/eRCaGuy_dotfiles/master/useful_scripts/git-diffn.sh
chmod +x git-diffn.sh
mv git-diffn.sh git-diffn
끝난! 이제 아래의 마지막 단계를 수행하십시오!
마지막 단계:
이제 터미널을 닫았다가 다시 열거 나 . ~/.bashrc
완료됩니다!
git diffn
이제 git diff
! 의 정확한 드롭 인 대체물로 작동합니다 .
당신은 시도 할 수 있습니다
git blame
파일에. 파일의 각 줄에 대한 커미터, 커밋 ID 및 줄 번호를 보여줍니다.
git blame
어떤 식으로도 질문에 대답하지 않습니다. 나는 꽤 여기 upvotes에 당황하고있어
git diff --unified=0 | grep -Po '^\+\+\+ ./\K.*|^@@ -[0-9]+(,[0-9]+)? \+\K[0-9]+(,[0-9]+)?(?= @@)'