gitの2つのコミット間で変更された行数を計算するにはどうすればよいですか?


748

gitの2つのコミット間で変更された行数を計算する簡単な方法はありますか?

私はを実行しgit diffて行を数えることができることを知っていますが、これは退屈なようです。また、行数に自分のコミットのみを含めて、これを行う方法を知りたいです。


3
あなたはBitBucketを見ます。
Alex78191

回答:


1114

--statオプションがgit diff必要です。または、スクリプトでこれを解析する場合は、--numstatオプションを使用します。

git diff --stat <commit-ish> <commit-ish>

--statマージ後に見慣れた人間が読める形式の出力を生成します。--numstatスクリプトが簡単に解釈できる素敵なテーブルレイアウトを生成します。

あなたが同時に複数のコミットでこれを行うことを望んでいたことをどういうわけか私は逃しました-それはのための仕事ですgit log。Ron DeVeraはこれについて触れていますが、実際には彼が述べている以上のことができます。git log要求された情報を出力するために内部でdiff機構を呼び出すので、だけでなく、diff statオプションのどれでも指定できます--shortstat。おそらく使用したいものは次のとおりです。

git log --author="Your name" --stat <commit1>..<commit2>

--numstatまたはまたは--shortstatを使用することもできます。git log他のさまざまな方法でコミットを選択することもできます。ドキュメントをご覧ください--since(コミット範囲を指定するのではなく、先週からコミットを選択するだけ)や--no-merges(マージコミットは実際には変更をもたらさない)のようなもの、およびきれいな出力オプション(--pretty=oneline, short, medium, full...)に興味があるかもしれません。

以下は、gitログからコミットごとの変更ではなく、変更全体を取得するための1行です(必要に応じてコミット選択オプションを変更します-これは、commit1からcommit2へのコミットです)。

git log --numstat --pretty="%H" --author="Your Name" commit1..commit2 | awk 'NF==3 {plus+=$1; minus+=$2} END {printf("+%d, -%d\n", plus, minus)}'

(git logにコミットに関する識別情報を印刷させる必要があります。私は任意にハッシュを選択し、awkを使用して、stat情報を持つフィールドである3つのフィールドを持つ行のみを抽出しました)


2
これは、「変更された行」に関する元の質問には答えません。1行の変更は、挿入された行と削除された行の両方として計算されます。変更された行の数を計算するには、ここで説明する以上の作業が必要です。
Ville Laitila 2012年

12
@VilleLaitila:これは不合理な労力をかけずに得ることができる限り近く、OPや他の15人にとっては十分なものでした。(変更された線が追加された線と削除された線になるタイミングをどのように定義しますか?-線と+線の間の距離を編集して、線の長さの一部として?)変更が2倍になることは誰もが知っています。それを変化の量の有用な測定基準と呼んで、私たちの生活を続けることができます。
Cascabel

188
git diff --shortstat <commit1> <commit2>私が欲しかったものでした。
Kim

9
参考のために、の日付形式--sinceとは--until:のようなものであるyesterday1 month 2 weeks 3 days 1 hour 1 second agoまたは1979-02-26 18:30:00
juanmirocks

4
@Brysonはい、それがその行が言う理由です<commit-ish>- リテラルコミット、ブランチ、タグ、および一般的なrefを含む、コミットを表すすべてのもので動作します。stackoverflow.com/questions/23303549/…
Cascabel

193

怠惰な場合は、を使用しますgit log --stat


14
私はこれが便利だと思って-10、以前の10回のコミットを示すためにを追加しました。
Choylton B. Higginbottom

2
コミット履歴の表示が終了したら、入力Qしてターミナルに戻ります。
Stevoisiak

180
git diff --shortstat

変更および追加された行数のみが表示されます。これは、ステージングされていない変更でのみ機能します。ブランチと比較するには:

git diff --shortstat some-branch

3
涼しい!ただし、これは
ステージングされ

3
を使用して変更をステージングした場合はgit add、必ず実行してくださいgit diff --shortstat --cached
TomNash '31

2463ファイルが変更され、39745挿入(+)、21383削除(-)先月実際に5k〜10k削除しました。それは私が物事を移動することから離れてやってきたほとんどすべてです。何かが間違っている。削除されたファイルなどは含まれていませんか?
jgmjgm

46
git diff --stat commit1 commit2

編集:コミットも指定する必要があります(パラメーターなしで、作業ディレクトリをインデックスと比較します)。例えば

git diff --stat HEAD^ HEAD

の親をHEADと比較しHEADます。


1
実際に使用する必要はありませんdiff-index- diffフロントエンドはすべてを処理できます。のケースはdiff-indexでカバーされている--cached/--stagedと思います。(そしてdiff-index、OPが尋ねたように、2つの任意のコミットを比較するために使用する方法はありません。)
Cascabel

これの出力は私には何もありません。
Mike

@マイク:カラットは残しましたか?最近のコミットはマージコミットでしたか?gitがdiffがないと言った場合、それはdiffがないためです。
Cascabel

6
またはコミットされていない場合git diff --stat HEAD
wieczorek1990

1
また、あなたが使用することにより、単に親よりもさらにバックを比較することができますHEAD~n場合は、nあなたが戻って行きたいどこまであります。git diff --stat HEAD~5 HEADHEADに関連する最後の5つのコミットの統計を組み合わせて表示します。
Nathan Beck

18

abcd123(最初のコミット)とwxyz789(最後のコミット)の間のすべてのコミットを比較したいとします。

git log wxyz789^..abcd123 --oneline --shortstat --author="Mike Surname"

これにより、次のような簡潔な出力が得られます。

abcd123 Made things better
 3 files changed, 14 insertions(+), 159 deletions(-)
wxyz789 Made things more betterer
 26 files changed, 53 insertions(+), 58 deletions(-)

これの出力は私には何もありません(私はコミットを行って確認しました-git logで使用し、他の引数なしで--authorが正しいことを確認しています)。
Mike

これも私に起こりました。2つのコミットの順序が間違っていたため、入れ替えて修正しました。
bob esponja 2013年

1
コミットの順序を更新し、2つのSHAの意味を明確にしました。それを捕まえてくれてありがとう:)
Ron DeVera '05

3
--shortstatフラグは、それがで動作する、素晴らしいですgit diffけれども(ありませんgit log)。
lucke84

それらをどのように要約しますか?
xpto 2017年

13

指定した期間内にすべての変更ログを取得する別の方法

git log --author="Tri Nguyen" --oneline --shortstat --before="2017-03-20" --after="2017-03-10"

出力:

2637cc736 Revert changed code
 1 file changed, 5 insertions(+), 5 deletions(-)
ba8d29402 Fix review
 2 files changed, 4 insertions(+), 11 deletions(-)

出力内容が長い場合、ファイルにエクスポートして読みやすくすることができます

git log --author="Tri Nguyen" --oneline --shortstat --before="2017-03-20" --after="2017-03-10" > /mnt/MyChangeLog.txt

2

上記の答えはすべて正しいですが、最後の多くのコミットの数が必要な場合は、以下の答えが便利です

1つ未満は、最後の5つのコミットのカウントを取得することです

git diff $(git log -5 --pretty=format:"%h" | tail -1) --shortstat

最後の10コミットのカウントを取得する

git diff $(git log -10 --pretty=format:"%h" | tail -1) --shortstat

汎用-必要な最後の多くのコミットの数でNを変更します

git diff $(git log -N --pretty=format:"%h" | tail -1) --shortstat

開始以降のすべてのコミットの数を取得する

git diff $(git log --pretty=format:"%h" | tail -1) --shortstat


これにより、「「テール」は、内部または外部のコマンド、操作可能なプログラム、またはバッチファイルとして認識されません。」
Charles


1

私はこの問題を自分で解決したので、思いついたことを共有します。これが最終結果です:

> git summary --since=yesterday
total: 114 file changes, 13800 insertions(+) 638 deletions(-)

基になるコマンドは次のようになります。

git log --numstat --format="" "$@" | awk '{files += 1}{ins += $1}{del += $2} END{print "total: "files" files, "ins" insertions(+) "del" deletions(-)"}'

または$@などの引数を渡すには、logコマンドのに注意してください。--author="Brian"--since=yesterday

awkをエスケープしてgitエイリアスに入れるのは面倒だったので、代わりにそれを自分のパス(~/bin/git-stat-sum)の実行可能スクリプトに入れてから、my のエイリアスのスクリプトを使用しました.gitconfig

[alias]
    summary = !git-stat-sum \"$@\"

そして、それは本当にうまくいきます。最後に注意すべきことfile changesは、変更された一意のファイルの数ではなく、ファイルへの変更の数です。それは私が探していたものですが、それはあなたが期待するものではないかもしれません。

ここに別の例があります

git summary --author=brian
git summary master..dev
# combine them as you like
git summary --author=brian master..dev
git summary --all

実際には、任意のgit logコマンドをで置き換えることができるはずgit summaryです。

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