行番号と変更されたファイル名のみを「git diff」にすることはできますか?


276

この質問には「行番号」が必要です。出力の行番号を気にしない場合は、この質問と回答を参照してください


基本的に、変更されたコンテンツを表示したくありません。ファイル名と行番号だけを表示します。


コードがなくても行番号は本当に便利ですか?または、行数を変更しますか?
Andrew Marshall

特にそうではありませんが、コードを変更した場所をブックマークしておく必要があります。
wei

1
これの1つの使用法は、情報をコードカバレッジレポートと組み合わせて、コミットの新しいコードまたは変更されたコードがテストでカバーされているかどうかを評価することです
AntonyG

@AntonyGまったく同じことを行うユーティリティ(カバレッジと変更された行)を構築しようとしたときにこの質問を見つけました。レポートを作成できましたか?もしそうなら、あなたはそれをどこかに公開しましたか?
Andrew Newdigate 2016

@AndrewNewdigateそれはクールなツールでしょうが、私はそれを構築したことはありません。この質問に出くわしたとき、他の種類のコードカバレッジ結果処理を行っていましたが、私の提案を実装するために必要な時間を正当化できませんでした
AntonyG

回答:


70

注:変更されたファイルの名前(変更された行の行番号なし)探しているだけの場合は、簡単にこのリンクをクリックして、別の回答を表示できます


これには組み込みのオプションはありません(そして、それほど便利だとは思いません)が、「外部diff」スクリプトの助けを借りて、gitでこれを行うこと可能です。

これはかなりひどいものです。希望する方法で出力を修正するのはあなた次第です。

#! /bin/sh
#
# run this with:
#    GIT_EXTERNAL_DIFF=<name of script> git diff ...
#
case $# in
1) "unmerged file $@, can't show you line numbers"; exit 1;;
7) ;;
*) echo "I don't know what to do, help!"; exit 1;;
esac

path=$1
old_file=$2
old_hex=$3
old_mode=$4
new_file=$5
new_hex=$6
new_mode=$7

printf '%s: ' $path
diff $old_file $new_file | grep -v '^[<>-]'

"external diff"の詳細についてはGIT_EXTERNAL_DIFFgitマニュアルページの説明を参照してください(700行目付近、末尾にかなり近い)。


1
ありがとう。このための組み込みオプションがないことが確認された後、私は実際に同様のスクリプトを作成しました:)
wei

パイピング| grep -o '^[0-9]*'は、右側を気にしないと仮定して、数値のみを提供します。
GKFX 2016

1
@DylanYoungはい; 示されたファイルを制限するために、追加--diff-filter=...どこ...の部分はあなたが見たい変化の一種である:M、修正のためのA追加のために、Dあたりの削除、および他の人のためgit diffのドキュメント。
torek

@Sventies:私が私の回答の冒頭で述べたように、それはOPが要求したものではありません。彼はファイルの名前だけを望んでいません。彼は名前に行番号を付けたいと思っています
トレック

十分に公正な@torek :)
Sventies

833

とても簡単:

git diff --name-only

出て行って比較してください!


88
これは、このページを表示したときにほとんどの人が探している答えである可能性があります(それは私のためでした)。ただし、特に行番号について言及している元の質問には答えません。
PieterMüller、

12
これは問題の半分しか解決しないため、受け入れられた答えではありません。変更された(各ファイルの)行を出力する必要があります。
adamwong246 2014年

それでおしまい!まさにこのスイッチを探していました!
アダムArold

「git status」を使用しないのはなぜですか?また、追跡されていないファイルも通知します。
Naveen Paul

1
@JimmyPaulは、すでにコミットしている場合があるためです。たとえば、マスターと現在の高度なブランチの間で変更されたファイルをリストする必要がありますgit diff --name-only master..HEAD
ットメイ'12年

68

変更された行数などの行番号、または変更を含む実際の行番号?変更された行数が必要な場合は、を使用しますgit diff --stat。これにより、次のような表示が得られます。

[me@somehost:~/newsite:master]> git diff --stat
 whatever/views/gallery.py |    8 ++++++++
 1 files changed, 8 insertions(+), 0 deletions(-)

変更自体の行番号を取得するオプションはありません。


1
実際の行番号を考えていました。ありがとう。
wei

どういうわけか、彼はこのためのGUIツールを望んでいます。
ThiefMaster 2012年

30

git diff master --compact-summary

出力は次のとおりです。

 src/app/components/common/sidebar/toolbar/toolbar.component.html   |  2 +-
 src/app/components/common/sidebar/toolbar/toolbar.component.scss   |  2 --

これはまさにあなたが必要とするものです。コミットを作成するとき、またはリモートから新しいコミットをプルするときと同じフォーマット。

PS:それは誰もがこのように答えなかったことを結んでいます。


1
指定されていません。1年前にリリースされた2.18から動作します。
Seitbekir Seidametov

完璧です。これは私にとってはうまくいき、応答は完璧です。
ビクター

15

1)私のお気に入り:

git diff --name-status

ファイルのステータスを付加します。例:

A   new_file.txt
M   modified_file.txt 
D   deleted_file.txt

2)統計が必要な場合:

git diff --stat

次のようなものが表示されます:

new_file.txt         |  50 +
modified_file.txt    | 100 +-
deleted_file         |  40 -

3)最後に、本当にファイル名だけが必要な場合:

git diff --name-only

単に表示します:

new_file.txt
modified_file.txt
deleted_file

4

現在から指定されたコミットまでに各ファイルで変更されたファイル名と行数/行番号を表示します。

git diff --stat <commit-hash>

2

私はこれが古い質問であることを知っていますが、Windowsでは、ファイルと変更された行番号へのgit出力をフィルタリングします。

(git diff -p --stat) | findstr "@@ --git"

diff --git a/dir1/dir2/file.cpp b/dir1/dir2/file.cpp
@@ -47,6 +47,7 @@ <some function name>
@@ -97,7 +98,7 @@ <another functon name>

ファイルと変更された行をそこから抽出するには、もう少し手間がかかります。

for /f "tokens=3,4* delims=-+ " %f in ('^(git diff -p --stat .^) ^| findstr ^"@@ --git^"') do @echo %f

a/dir1/dir2/file.cpp
47,7
98,7

1

最もクリーンな出力、つまりファイル名/パスのみが付属しています

git diff-tree --no-commit-id --name-only -r

HTH


0

git version 2.17.1内蔵されたフラグが存在しない、この目的を達成するために。

次に、統一されたdiffからファイル名と行番号をフィルタリングするコマンドの例を示します。

git diff --unified=0 | grep -Po '^diff --cc \K.*|^@@@( -[0-9]+,[0-9]+){2} \+\K[0-9]+(?=(,[0-9]+)? @@@)' | paste -s -d':'

たとえば、unified diff:

$ git diff --unified=0
diff --cc foobar
index b436f31,df63c58..0000000
--- a/foobar
+++ b/foobar
@@@ -1,2 -1,2 +1,6 @@@ Line abov
++<<<<<<< HEAD
 +bar
++=======
+ foo
++>>>>>>> Commit message

結果は:

❯ git diff --unified=0 | grep -Po '^diff --cc \K.*|^@@@( -[0-9]+,[0-9]+){2} \+\K[0-9]+(?=(,[0-9]+)? @@@)' | paste -s -d':'
foobar:1

一般的なgrep一致結果でコマンドの出力を一致させるには:

$ git diff --unified=0 | grep -Po '^diff --cc \K.*|^@@@( -[0-9]+,[0-9]+){2} \+\K[0-9]+(?=(,[0-9]+)? )| @@@.*' | sed -e '0~3{s/ @@@[ ]\?//}' | sed '2~3 s/$/\n1/g' | sed "N;N;N;s/\n/:/g"
foobar:1:1:Line abov
  1. grep -Po '^diff --cc \K.*|^@@@( -[0-9]+,[0-9]+){2} \+\K[0-9]+(?=(,[0-9]+)? ):からマッチのファイル名diff --cc <filename>からまたはmatch行番号@@@ <from-file-range> <from-file-range> <to-file-range>やマッチの後にテキストを残り@@@
  2. sed -e '0~3{s/ @@@[ ]\?//}'@@@[ ]\?前にオプションの1行のコンテキストを取得するには、3行ごとに削除します++<<<<<<< HEAD
  3. sed '2~3 s/$/\n1/g'\n1列番号の2行目と3行目の間に3行ごとに追加します。
  4. sed "N;N;N;s/\n/:/g":3行ごとに:

0

grep素朴な解決策として使用します。

$ git diff | grep -A2 -- '---'

出力例:

--- a/fileA.txt
+++ b/fileA.txt
@@ -0,0 +1,132 @@
--
--- a/B/fileC.txt
+++ b/B/fileC.txt
@@ -33663,3 +33663,68800 @@ word_38077.png,Latin
--
--- a/D/fileE.txt
+++ b/D/fileE.txt
@@ -17998,3 +17998,84465 @@ word_23979.png,Latin
--
--- a/F
+++ b/F
@@ -1 +1 @@

多分あなたは色付きの出力を見ることができます。それはあなたが簡単に出力を読むのに役立ちます。

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