줄 번호가있는 Git diff (줄 번호가있는 Git 로그)


93

내가 할 때 git diff 또는 a를git log -p 출력과 인라인 된 소스 파일의 줄 번호를 어떻게 얻습니까?

나는 그것을 찾아 man git-diff | grep "line numbers"보려고 노력했고 인터넷 검색을 시도했지만 빨리 아무것도 얻지 못했습니다.

답변:


92

사람이 읽을 수있는 줄 번호를 얻을 수 없습니다. 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 행도 포함합니다.

Unified-diff 형식은 실제로 사람이 사용할 수 없습니다.

아시다시피, 통합 차이 형식은 줄 번호를 쉽게 알아낼 수 없습니다 (최소한 기계가 아닌 경우). 정말로 읽을 수있는 줄 번호를 원한다면, 그것들을 표시 할 diffing 도구를 사용해야합니다.

추가 자료


4
다음은 수정 된 파일에서 줄 번호 만 추출하는 grep입니다 (예 : 체크 스타일 보고서를 필터링하는 데 사용)git diff --unified=0 | grep -Po '^\+\+\+ ./\K.*|^@@ -[0-9]+(,[0-9]+)? \+\K[0-9]+(,[0-9]+)?(?= @@)'
Jakub Bochenski

1
@JakubBochenski의 의견은 내 문제를 아주 멋지게 해결했습니다.
0xbe5077 생성

사용자가 지정하는 경우에만 정말 유용 --unified=0하거나 -U0하지만,.
caw

줄 번호를 표시하고 다음의 모든 사용 및 옵션과 완벽하게 호환 git diffn되는 드롭 인 교체 (래퍼)를 방금 완료했습니다 . stackoverflow.com/questions/24455377/…git diffgit diff
Gabriel Staples

22

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):표시 될 때 코드가 아래쪽 줄의 코드와 적절한 정렬 및 들여 쓰기를 유지하도록하려면 위쪽 줄에 추가 공백을 추가해야합니다. 아마도 이것은 인쇄로 쉽게 할 수 있습니까?
Gabriel Staples

... 내 말은 printf.
Gabriel Staples


신경 쓰지 마; 알았어! 방금 끝냈어 git diffn. 여기를 참조하십시오 : stackoverflow.com/a/61997003/4561887 . 귀하의 답변에 대해 @PFudd에게 감사드립니다. 나는 그것을 공부하고 배우는 데 사용했고, 처음부터 시작하여 git diffn. 일단 당신의 코드를 읽을 수 있도록 포맷을 했고 (@EdMorton에게 감사합니다), 저에게 도움이되는 몇 가지 훌륭한 것들을 배울 수있었습니다.
Gabriel Staples

6

이 문제를 해결하려는 스크립트가 있습니다. 분노로 테스트하지는 않았지만 괜찮아 보입니다. 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 

4

git difftool줄 번호를 표시하는 외부 편집기로 diff를 수행하는 데 사용할 수 있습니다 . vim / vimdiff로 수행하는 방법은 다음과 같습니다.

  1. vimdiff를 git의 difftool로 설정하십시오.

    git config --global diff.tool vimdiff
    
  2. ~/.vimrcvimdiff를 사용할 때 자동으로 줄 번호를 표시하도록 구성 합니다.

    if &diff
        set number
    endif
    
  3. 줄 번호와 함께 vimdiff를 사용하는 git difftool을 실행합니다.

    git difftool
    

git difftool 만 수행함으로써 tkdiff 도구가 열렸으며 자체적으로 줄 번호 기능이 있습니다. 감사합니다 wisbucky
Richardd

3

빠른 방법은 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를


3

나는 내 difftool git difftoolmeld 와 함께 사용 하는 것을 좋아합니다 . 보다보기 쉽고 git diff, 나란히있는 GUI 비교가 좋으며, 각면에 줄 번호가 표시됩니다.

설정:

  1. Windows 또는 Linux 용 difftool로 meld를 설정하는 방법에 대한 지침

샘플 스크린 샷 :

여기에 이미지 설명 입력

2020 년 5 월 24 일 업데이트 :

난 그냥 쓴 git diffn드롭 인 교체로 지난 몇 일 동안 git diff명령 줄에서. 한번 시도해보세요. 여기 내 다른 대답을 참조하십시오 .


3

2020 년 5 월 24 일부로 이제 git diffn이러한 목적 으로 타사 도구 (전체 공개 : 내가 작성)를 사용할 수 있습니다. 패턴 / 액션 기반 프로그래밍 언어로 git diff작성된 경량 래퍼 awk입니다. 다음은 실행의 샘플 출력입니다 git diffn.

여기에 이미지 설명 입력

다음은 데모입니다.

1/3 : 데모 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. 모든 줄 번호를 완벽하게 보여줍니다!

  • 삭제 된 줄의 줄 번호 는 왼쪽에 있으며 -왼쪽과 오른쪽 모두에 표시가 표시되어 :더 잘 볼 수 있습니다. 화면 왼쪽.
  • 추가 된 줄의 줄 번호 는 오른쪽으로 멀어지며 .NET Framework +의 맨 왼쪽과 오른쪽 모두에 기호 가 표시됩니다 :.
  • 컨텍스트에 대해 표시된 변경되지 않은 행의 행 번호 는 왼쪽 (이전 파일)과 오른쪽 (새 파일) 모두에 대해 ,.

출력 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입니다.

여기에 이미지 설명 입력

2/3 : 뭔데?

상단git-diffn.sh 부터 :

기술:

git-diffn.sh

  1. git diff라인 'n'umbers도 표시 하는 드롭 인 교체 ! 그것을 사용하여 정확히 처럼 git diff당신이 당신의 변경의 의미가 아니라 도움에 관해서는이 아름다운 줄 번호를 볼 수 있습니다 제외.

  2. 가볍고 가벼운 awk 언어 기반 래퍼 git diff이기 때문에 허용하는 모든 옵션과 매개 변수를 git diff허용합니다. 예 :

  3. git diffn HEAD~

  4. git diffn HEAD~3..HEAD~2

  5. git diff사용자 정의 색상을 사용하는 경우에도 모든 색상 설정에서 작동 합니다.

  6. 사용자 정의 diff 색상을 설정하는 방법과 사용자 정의 색상 출력의 스크린 샷을 보려면 여기 내 대답을 참조하십시오. git diffn : 어떻게 당신이 사랑하는 헤더의 자식은 diff의 색상을 사용자 정의 할을?

  7. 다음은 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"
    
  8. 에서 git diffn컬러 출력은 기본적으로 켜져 있습니다. 당신은 출력 색상을 사용하지 않으려면, 당신은 사용해야 --no-color하거나 --color=never. 자세한 내용은를 참조 man git diff하십시오. 예 :

     git diffn --color=never HEAD~
     git diffn --no-color HEAD~3..HEAD~2
    

3/3 : 설치

  1. Windows (테스트되지 않음) : Windows 용 Git 과 함께 제공되는 bash 터미널 내에서 작동 할 수 있지만 테스트되지는 않았습니다. Windows 용 Git을 설치합니다. 함께 제공되는 bash 터미널을 열고 아래 지침을 따르십시오. Windows 용 Git에서이를 테스트 할 테스터가 필요합니다. https://github.com/git-for-windows/git/issues/2635를 확인하고 답변하십시오 .
  2. Mac (미확인) : 터미널을 사용하고 아래 지침을 따르십시오. 을 (를) 설치해야 할 수 있습니다 gawk. 그렇다면 이것을 시도 하십시오 : brew install gawk.
  3. Linux (Ubuntu 18.04에서 테스트되었으며 완벽하게 작동 함) : 아래 터미널 지침을 따르십시오.

옵션 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! 의 정확한 드롭 인 대체물로 작동합니다 .


1

당신은 시도 할 수 있습니다

git blame

파일에. 파일의 각 줄에 대한 커미터, 커밋 ID 및 줄 번호를 보여줍니다.


4
이것의 문제 는 원본 포스터가 요청한 diff가 표시되지 않는다는 것입니다. git blame줄 번호와 함께 파일의 현재 상태를 보여줍니다.

5
나는 자식 비난에 대해 알고 있었지만 인터넷 검색을하는 누군가가 없을 수도 있습니다. 누군가를 도울 수 있습니다. 대답 해줘서 고마워.
Drew LeSueur 2014-06-30

git blame어떤 식으로도 질문에 대답하지 않습니다. 나는 꽤 여기 upvotes에 당황하고있어
마이클 Mrozek을

질문과 관련이없는 답변으로 stackoverflow를 스팸하지 마십시오.
Ahmed

0

먼저 Meld와 같은 git diff 도구를 구성하십시오.

git config --global diff.tool meld

그런 다음 일부 파일에서 difftool을 잡아 당깁니다.

git difftool -y config.rb

diff 도구의 기본 설정에서 줄 번호를 설정하는 것을 기억하십시오.

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