回答:
の--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つのフィールドを持つ行のみを抽出しました)
git diff --shortstat <commit1> <commit2>
私が欲しかったものでした。
--since
とは--until
:のようなものであるyesterday
、1 month 2 weeks 3 days 1 hour 1 second ago
または1979-02-26 18:30:00
<commit-ish>
- リテラルコミット、ブランチ、タグ、および一般的なrefを含む、コミットを表すすべてのもので動作します。stackoverflow.com/questions/23303549/…
怠惰な場合は、を使用しますgit log --stat
。
-10
、以前の10回のコミットを示すためにを追加しました。
Q
してターミナルに戻ります。
git diff --shortstat
変更および追加された行数のみが表示されます。これは、ステージングされていない変更でのみ機能します。ブランチと比較するには:
git diff --shortstat some-branch
git add
、必ず実行してくださいgit diff --shortstat --cached
git diff --stat commit1 commit2
編集:コミットも指定する必要があります(パラメーターなしで、作業ディレクトリをインデックスと比較します)。例えば
git diff --stat HEAD^ HEAD
の親をHEAD
と比較しHEAD
ます。
diff-index
- diff
フロントエンドはすべてを処理できます。のケースはdiff-index
でカバーされている--cached/--staged
と思います。(そしてdiff-index
、OPが尋ねたように、2つの任意のコミットを比較するために使用する方法はありません。)
git diff --stat HEAD
HEAD~n
場合は、n
あなたが戻って行きたいどこまであります。git diff --stat HEAD~5 HEAD
HEADに関連する最後の5つのコミットの統計を組み合わせて表示します。
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(-)
--shortstat
フラグは、それがで動作する、素晴らしいですgit diff
けれども(ありませんgit log
)。
指定した期間内にすべての変更ログを取得する別の方法
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
上記の答えはすべて正しいですが、最後の多くのコミットの数が必要な場合は、以下の答えが便利です
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
私はこの問題を自分で解決したので、思いついたことを共有します。これが最終結果です:
> 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
です。