行番号付きのGit差分(行番号付きのGitログ)


92

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

調べてman git-diff | grep "line numbers"グーグルで試しましたが、すぐに何も見つかりませんでした。

回答:


90

あなたは人間が読める行番号を得ることができません git diff

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

統一差分フォーマット

その情報は、diffの各変更の(c)hunkヘッダーで利用できますが、それは、unified-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形式では、(少なくともマシンでない場合は)行番号を簡単に把握できません。読みやすい行番号が本当に必要な場合は、それらを表示する比較ツールを使用する必要があります。

追加の読書


3
これは、変更されたファイルの行番号のみを抽出するgrepです。たとえば、チェックスタイルレポートのフィルターに使用されますgit diff --unified=0 | grep -Po '^\+\+\+ ./\K.*|^@@ -[0-9]+(,[0-9]+)? \+\K[0-9]+(,[0-9]+)?(?= @@)'
Jakub Bochenski

1
@JakubBochenskiのコメントは私の問題をかなりうまく解決しました。
0xbe5077ed

これは、--unified=0またはを指定した場合にのみ非常に役立ち-U0ます。
CAW

私はちょうど終了しgit diffn、ドロップインの交換(ラッパー)git diffのショーは、数字を並べると、すべての使用法とオプションとの完全な互換性持っているgit diffstackoverflow.com/questions/24455377/...を
ガブリエルステープルズ

22

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):。番号は、それぞれのファイルの行番号です。


コードの配置(インデント)が壊れていることに気づきましたが、ネイティブgit diffは配置を注意深く維持しています。このコードは現在私の頭上にあるので、あなたはそれを修正してもいいですか?つまり、ある行+240:+が次の行(241,257):にある場合は、上の行にいくつかの余分なスペースを追加して、そのコードが下の行のコードとの適切な配置とインデントを維持するようにする必要があります。多分これは印刷で簡単にできるでしょうか?
ガブリエルステープルズ

...という意味printfです。
ガブリエルステープルズ


気にしないで; わかった!終わりましたgit diffn。こちらをご覧ください:stackoverflow.com/a/61997003/4561887。あなたの答えをありがとう@PFudd。私はそれを学び、それを使って学び、それからゼロから始めて書いたgit diffnあなたのコードを読むことができるようにフォーマットされたら(@EdMortonに感謝します)、それから私に役立ついくつかの素晴らしいことを学ぶことができました。
ガブリエルステープルズ

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. git difftoolを実行します。vimdiffと行番号が使用されます。

    git difftool
    

git difftoolを実行するだけで、tkdiffツールが開かれました。これは、行番号機能を備えています。おかげでwisbucky
リチャード

3

簡単な方法はを使用すること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を参照してください


3

私が使用したいgit difftoolメルド私difftoolとして。を見るよりも簡単git diffです。GUIを並べて比較すると、各行に行番号が表示されます。

セットアップ:

  1. Windows またはLinux用のdifftoolとしてmeldを設定する方法の説明

スクリーンショットの例:

ここに画像の説明を入力してください

2020年5月24日の更新:

git diffnここ数日git diff、コマンドラインでの代替品となるように書いています。試してみます。私の他の答えをここで見てください


2

2020年5月24日の時点でgit diffn、この目的でサードパーティツール(完全な開示:私が作成)を使用できるようになりました。これgit diffは、awkパターン/アクションベースのプログラミング言語で書かれた、の軽量ラッパーです。以下は、runningの出力例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比較のための最初の出力は次のとおりです。

$ 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です。

ここに画像の説明を入力してください

2/3:それはなんですか?

からのトップgit-diffn.sh

説明:

git-diffn.sh

  1. ドロップインの代替品で、git diff行 'n'番号も表示されます!変更を理解するのに役立つこれらの美しい行番号も表示されることを除いて、とまったく同じようgit diffに使用します。

  2. これはawk言語ベースの軽量ラッパーなgit diffので、受け入れるすべてのオプションとパラメーターをgit diff受け入れます。例:

  3. git diffn HEAD~

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

  5. git diffカスタムカラーを使用している場合でも、任意のカラー設定で機能します

  6. どのように設定したカスタム差分色にするためにここに私の答えを参照してください、などからカスタムカラー出力のスクリーンショットを見てgit diffnあなたはどのようにgitの差分で差分ヘッダの色をカスタマイズできますか?

  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(未テスト):これは、Git for Windowsに付属のbashターミナル内で機能する可能性がありますが、テストされていません。Git for Windowsをインストールします。付属のbashターミナルを開き、以下の手順に従ってください。Git for Windowsでこれをテストするテスターが必要です。https://github.com/git-for-windows/git/issues/2635を参照して、ここで回答してください
  2. Mac(未テスト):ターミナルを使用して、以下の手順に従います。をインストールする必要がある場合がありgawkます。もしそうなら、してみてくださいこれをbrew install gawk
  3. Linux(Ubuntu 18.04でテストされ、完全に動作します):以下の端末の指示に従ってください。

オプション1(私の推奨):リポジトリ全体をダウンロードし、プログラムへのシンボリックリンクを作成して、git pullいつでもリポジトリから更新を簡単に受信できるようにします。

まず、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つのファイルだけが必要な場合): 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
これの問題は、元のポスターが求めていた差分を表示しないことです。git blame行番号とともにファイルの現在の状態を表示します。

5
私はgit非難について知っていましたが、グーグルの誰かが持っていないかもしれません。それは誰かを助けるかもしれません。回答ありがとうございます。
Drew LeSueur 2014年

git blame決して質問に答えることはありません。私はここの賛成投票にかなり困惑しています
Michael Mrozek

質問に関係のない回答でstackoverflowをスパムしないでください。
アーメド

0

まず、git diffツール、たとえばMeldを設定します

git config --global diff.tool meld

次に、いくつかのファイルでdifftoolをヤンクします。

git difftool -y config.rb

差分ツールの設定で行番号を設定することを忘れないでください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.