a git diffまたはa を実行するときgit log -p、出力にインライン化されたソースファイルの行番号を取得するにはどうすればよいですか?
調べてman git-diff | grep "line numbers"グーグルで試しましたが、すぐに何も見つかりませんでした。
回答:
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=0またはを指定した場合にのみ非常に役立ち-U0ます。
git diffn、ドロップインの交換(ラッパー)git diffのショーは、数字を並べると、すべての使用法とオプションとの完全な互換性持っているgit diff:stackoverflow.com/questions/24455377/...を
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に感謝します)、それから私に役立ついくつかの素晴らしいことを学ぶことができました。
これを修正しようとするスクリプトは次のとおりです-怒りでテストされていませんが、問題ないようです。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
~/.vimrcvimdiffを使用するときに行番号を自動的に表示するように構成します。
if &diff
set number
endif
git difftoolを実行します。vimdiffと行番号が使用されます。
git difftool
簡単な方法はを使用すること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を参照してください
私が使用したいgit difftoolとメルド私difftoolとして。を見るよりも簡単git diffです。GUIを並べて比較すると、各行に行番号が表示されます。
git diffnここ数日git diff、コマンドラインでの代替品となるように書いています。試してみます。私の他の答えをここで見てください。
2020年5月24日の時点でgit diffn、この目的でサードパーティツール(完全な開示:私が作成)を使用できるようになりました。これgit diffは、awkパターン/アクションベースのプログラミング言語で書かれた、の軽量ラッパーです。以下は、runningの出力例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比較のための最初の出力は次のとおりです。
$ 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 diff行 'n'番号も表示されます!変更を理解するのに役立つこれらの美しい行番号も表示されることを除いて、とまったく同じようgit diffに使用します。
これはawk言語ベースの軽量ラッパーなgit diffので、受け入れるすべてのオプションとパラメーターをgit diff受け入れます。例:
git diffn HEAD~
git diffn HEAD~3..HEAD~2
git diffカスタムカラーを使用している場合でも、任意のカラー設定で機能します
どのように設定したカスタム差分色にするためにここに私の答えを参照してください、などからカスタムカラー出力のスクリーンショットを見てgit diffn:あなたはどのようにgitの差分で差分ヘッダの色をカスタマイズできますか?
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いつでもリポジトリから更新を簡単に受信できるようにします。
まず、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ます。
あなたが試すことができます
git blame
ファイルに。ファイルの各行のコミッター、コミットID、行番号が表示されます。
git blame決して質問に答えることはありません。私はここの賛成投票にかなり困惑しています
git diff --unified=0 | grep -Po '^\+\+\+ ./\K.*|^@@ -[0-9]+(,[0-9]+)? \+\K[0-9]+(,[0-9]+)?(?= @@)'