web-dev-qa-db-ja.com

行番号付きのGit diff(行番号付きのGitログ)

git diffまたはgit log -p、ソースファイルの行番号を出力とインラインで取得するにはどうすればよいですか?

調べてみたman git-diff | grep "line numbers"と私はグーグルで試しましたが、すぐに何も得られませんでした。

82
Drew LeSueur

git diffでは人間が読める行番号を取得できません

現在、git diffの横に行番号を垂直に表示するオプションはありません。

統一差分形式

その情報は、差分の変更ごとに(c)hunkヘッダーで利用できますが、それは nified-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形式は、実際には人間が使用するためのものではありません

おそらくおわかりのように、unified-diff形式では(少なくともマシンではない場合)行番号を簡単に把握できません。読み込める行番号が本当に必要な場合は、それらを表示する差分ツールを使用する必要があります。

追加の読書

78
user456814

Andy Talkowskiのコードを拡張した、さらに2つのソリューションがあります。

プレーンテキスト:

  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):で始まる行を変更します。番号は、それぞれのファイルの行番号です。

18
PFudd

これを修正しようとするスクリプトがあります-怒りでテストされていませんが、大丈夫のようです。 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 
5
Andy Talkowski

あなたが試すことができます

git blame

ファイルに。ファイルの各行のコミッター、コミットID、行番号が表示されます。

3
Juan

簡単な方法は、git diff -U0を使用することです。これにより、コンテキストの行が0に設定され、@@値が実際に変更された行と一致するようになります。デフォルトでは、@@の値には3行の前後のコンテキストが含まれますが、これは人間には不便です。

例:

git diff # default
@@ -10,8 +10,8 @@

行10はbeforeコンテキストの最初の行を参照するため、これは変更された行の行番号を計算するのが困難です。最初に変更された行の実際の行番号は10 + 3 = 13です。変更された行の数を計算するには、前後のコンテキストも減算する必要があります:8-3-3 = 2。

git diff -U0
@@ -13,2 +13,2 @@

ご覧のとおり、context = 0に設定すると、@@値が人間にとって読みやすくなります。変更された行は13行目から始まり、2行変更されていることがわかります。

これは、各ブロックの行番号のみを表示するため、完全ではありません。すべての行の行番号を表示する場合は、外部エディターにdifftoolを使用します。 https://stackoverflow.com/a/50049752 を参照してください

1
wisbucky

Difftoolとしてgit difftoolmeldとともに使用するのが好きです。 git diffよりも見やすく、GUIを横に並べて見やすく、行番号を表示します。

1
Gabriel Staples

git difftoolを使用して、行番号を表示する外部エディターでdiffを実行できます。 vim/vimdiffでこれを行う方法は次のとおりです。

  1. Vimdiffをgitのdifftoolとして設定します。

    git config --global diff.tool vimdiff
    
  2. Vimdiffを使用するときに自動的に行番号を表示するように~/.vimrcを構成します。

    if &diff
        set number
    endif
    
  3. 行番号でvimdiffを使用するgit difftoolを実行します。

    git difftool
    
1
wisbucky

いつでも猫を使用できます。欠点は、色が失われることです。

例:

git diff yourfile.cpp | cat -n 
0
george