git logは、特定の条件に従ってログを検索し、修正コードの行数を統計します。


前言
年齢の増加と知識の蓄積に伴って、最近ではよく朗らかな感じがします。あるいはすでに存在しているものに対して、突然新しい認識ができました。たとえば統計という言葉は早くから接触しました。これはどういう意味かは考えられませんでした。つまり、似たような解釈です。意図的にこの言葉の意味を勉強していませんでしたが、毎日の生活の中で、知らず知らずのうちに要約してまとめました。
統計したいならデータソースが必要です。git logコマンドはちょうどこのデータソースを提供できます。git log自体はログを表示するコマンドです。ログに記録されているのはコードバンクの変化を記述する「史書」のようなデータです。歴史を説明するには大量のデータサポートが必要です。修正コードラインを統計したいです。私たちは歴史記録から計算する部分を見つければいいです。
gitロゴ
統計する前に、データを整理しなければなりません。ごちゃごちゃしたデータは統計できないわけではありません。ただ計算するのがもっと面倒なので、統計をとる前に、まずデータを規範化しなければなりません。git logオープンソースライブラリを例にとって、redis分岐に切り替えて、6.0に記録を提出して、データソースとして位置づけて、7bf665f125a4771db095c83a7ad6ed46692cd314の一般的な問い合わせ方法を勉強します。実は、異なる条件で照会することは整理、分類データの処理です。git logの使用法は様々です。私たちは主に二つの種類に関心を持っています。それぞれ条件選別と表示形式です。
条件フィルタgit log条件スクリーニングのオプションは非常に多く、条件スクリーニングを使用するオプションは、表示される提出記録の範囲に影響を及ぼし、表示したい提出記録を検索する。
最近のロゴを調べます。git logパラメータを使用して、最近の提出履歴を調べられます。

$ git log -3
commit 7bf665f125a4771db095c83a7ad6ed46692cd314 (HEAD -> 6.0, tag: 6.0.6, origin/6.0)
Author: Oran Agra <[email protected]>
Date: Sun Jul 19 14:00:20 2020 +0300

 Redis 6.0.6.

commit a5696bdf4f2687ab45f633ccb7cdc4ee9c2f957d
Author: Oran Agra <[email protected]>
Date: Sun Jul 19 15:33:21 2020 +0300

 Run daily CI on PRs to release a branch

commit e15528bf1da1f1232fd08801ad382c915be94662
Author: Itamar Haber <[email protected]>
Date: Thu Jul 16 21:31:36 2020 +0300

 Adds SHA256SUM to redis-stable tarball upload

 (cherry picked from commit 5df0a64d30e7815c0a4a75a80f165fdee0bd1db6)
クエリー指定の作成者の提出-numberパラメータを使用して、指定された著者の提出記録を照会することができる。

Albert@DESKTOP-6746UC3 MINGW64 /d/data/maingit/redis (6.0)
$ git log -2 --author='Oran Agra'
commit 7bf665f125a4771db095c83a7ad6ed46692cd314 (HEAD -> 6.0, tag: 6.0.6, origin/6.0)
Author: Oran Agra <[email protected]>
Date: Sun Jul 19 14:00:20 2020 +0300

 Redis 6.0.6.

commit a5696bdf4f2687ab45f633ccb7cdc4ee9c2f957d
Author: Oran Agra <[email protected]>
Date: Sun Jul 19 15:33:21 2020 +0300

 Run daily CI on PRs to release a branch
指定された時間帯のログを検索します。
このオプションパラメータは、--author--since--until--before--afterなど、意味から分かりやすく、どのように使用するかが分かります。
クエリー202-01-01から2020-04-01までの提出履歴

$ git log -2 --after=2020-01-01 --before=2020-04-01
commit 957e917a84ac9979f18145a4d0b53386f5ce4fd9 (tag: 6.0-rc3)
Author: antirez <[email protected]>
Date: Tue Mar 31 17:56:04 2020 +0200

 Redis 6.0-RC3.

commit ef1b1f01a84e969ea368e7fdbaf0d10615743269
Author: antirez <[email protected]>
Date: Tue Mar 31 17:41:23 2020 +0200

 cast raxSize() to avoid warning with format spec.
ちょうど原作者の提出を捕まえました。
1年前の提出記録を調べる。

$ git log -2 --until=1.year.ago
commit 86aade9a024c3582665903d0cc0c5692c6677cfd
Merge: 89ad0ca56 3bfcae247
Author: Salvatore Sanfilippo <[email protected]>
Date: Thu Sep 5 13:30:26 2019 +0200

 Merge pull request #6364 from oranagra/fix_module_aux_when

 Fix to module aux data rdb format for backwards compatibility with old check-rdb

commit 3bfcae247a1c51788940bd4d2f32751ead451e42
Author: Oran Agra <[email protected]>
Date: Thu Sep 5 14:11:37 2019 +0300

 Fix to module aux data rdb format for backwards compatibility with old check-rdb

 When implementing the code that saves and loads these aux fields we used rdb
 format that was added for that in redis 5.0, but then we added the 'when' field
 which meant that the old redis-check-rdb won't be able to skip these.
 this fix adds an opcode as if that 'when' is part of the module data.
クエリーには、指定された記述内容の提出履歴が含まれています。
ここで--grepパラメータを使用して、指定された内容を含む提出記録をフィルタリングすることができます。ここでは、comit記述において、条件に合致する提出をフィルタリングすることを意味します。

$ git log -2 --grep='client'
commit 0f75036c07db48dfcf605e090216a4447edc38fc
Author: Wen Hui <[email protected]>
Date: Wed Jul 15 05:38:47 2020 -0400

 correct error msg for num connections reaching maxclients in cluster mode (#7444)


 (cherry picked from commit d85af4d6f5fbe9cb9787b81583627cd74b47f838)

commit f89f50dbd06247677b8cb3927cbb88c1b5384061
Author: Oran Agra <[email protected]>
Date: Tue Jul 14 20:21:59 2020 +0300

 diskless master disconnect replicas when rdb child failed (#7518)

 in case the rdb child failed, crashed or terminated unexpectedly redis
 would have marked the replica clients with repl_put_online_on_ack and
 then kill them only after a minute when no ack was received.

 it would not stream anything to these connections, so the only effect of
 this bug is a delay of 1 minute in the replicas attempt to re-connect.

 (cherry picked from commit a176cb56a3c0235adddde33fcbaee2369a5af73e)
指定されたブランチの送信履歴を検索します。git logを使用してデフォルトで検索したのは、現在のブランチの提出記録であり、他のブランチの記録を照会したいなら、直接にコマンドの後にブランチ名をつければいい。

$ git log -2 arm
commit 7329cc39818a05c168e7d1e791afb03c089f1933 (origin/arm, arm)
Author: Salvatore Sanfilippo <[email protected]>
Date: Sun Feb 19 15:07:08 2017 +0000

 ARM: Avoid fast path for BITOP.

 GCC will produce certain unaligned multi load-store instructions
 that will be trapped by the Linux kernel since ARM v6 cannot
 handle them with unaligned addresses. Better to use the slower
 but safer implementation instead of generating the exception which
 should be anyway very slow.

commit 4e9cf4cc7ed4b732fc4bb592f19ceb41d132954e
Author: Salvatore Sanfilippo <[email protected]>
Date: Sun Feb 19 15:02:37 2017 +0000

 ARM: Use libc malloc by default.

 I'm not sure how much test Jemalloc gets on ARM, moreover
 compiling Redis with Jemalloc support in not very powerful
 devices, like most ARMs people will build Redis on, is extremely
 slow. It is possible to enable Jemalloc build anyway if needed
 by using "make MALLOC=jemalloc".
実は、gitシステムでは、分岐名、comit、ラベルなどはほぼ同じ意味を持っていますので、多くの場面で交換を拡張できます。例えば、armの後に分岐名を加えると、指定された分岐の提出記録が調べられます。comitを加えると、このcomitの前の提出記録が調べられます。ラベルを付けると、このラベルを調べる前の提出記録、たとえば私達はcomitを追加してみます。

$ git log -2 7329cc39818a05c168e7d1e791afb03c089f1933
commit 7329cc39818a05c168e7d1e791afb03c089f1933 (origin/arm, arm)
Author: Salvatore Sanfilippo <[email protected]>
Date: Sun Feb 19 15:07:08 2017 +0000

 ARM: Avoid fast path for BITOP.

 GCC will produce certain unaligned multi load-store instructions
 that will be trapped by the Linux kernel since ARM v6 cannot
 handle them with unaligned addresses. Better to use the slower
 but safer implementation instead of generating the exception which
 should be anyway very slow.

commit 4e9cf4cc7ed4b732fc4bb592f19ceb41d132954e
Author: Salvatore Sanfilippo <[email protected]>
Date: Sun Feb 19 15:02:37 2017 +0000

 ARM: Use libc malloc by default.

 I'm not sure how much test Jemalloc gets on ARM, moreover
 compiling Redis with Jemalloc support in not very powerful
 devices, like most ARMs people will build Redis on, is extremely
 slow. It is possible to enable Jemalloc build anyway if needed
 by using "make MALLOC=jemalloc".
comit idは以前のarm分岐の最新記録であるため、このコマンドはgit logに相当する。
クエリ指定commt間の提出履歴
二つのcommtの前の提出記録を調べたいなら、二つのcommt idを命令の後に順次置いてgit log -2 armで接続すればいいです。フォーマットは..です。このように調べられた提出記録リストにはcomit 1が含まれていません。実は、commt 1の後にどのような修正提出が行われていますか?

$ git log e15528bf1da1f1232fd08801ad382c915be94662..7bf665f125a4771db095c83a7ad6ed46692cd314
commit 7bf665f125a4771db095c83a7ad6ed46692cd314 (HEAD -> 6.0, tag: 6.0.6, origin/6.0)
Author: Oran Agra <[email protected]>
Date: Sun Jul 19 14:00:20 2020 +0300

 Redis 6.0.6.

commit a5696bdf4f2687ab45f633ccb7cdc4ee9c2f957d
Author: Oran Agra <[email protected]>
Date: Sun Jul 19 15:33:21 2020 +0300

 Run daily CI on PRs to release a branch
この特性は、Mergeの分岐前にどのような記録が行われているかを調べることができるアプリケーションがあります。一般的な使い方としては、例えばgit log commit1..commit2はfeatureの分岐を列挙してdev分岐に統合する場合、どのような提出記録がありますか?

$ git log 6.0..unstable
commit 324e22accf457edc996971bc97f5474349cd7c4c (unstable)
Author: antirez <[email protected]>
Date: Fri Dec 20 12:29:02 2019 +0100

 Fix ip and missing mode in RM_GetClusterNodeInfo().
指定ファイルの提出履歴の照会
クエリー指定ファイルの提出記録は、一般的にgit log feature..devコマンドの後に直接ファイル名について行けば良いが、分岐名との相違を避けるために、通常はファイル名の前にgit logを付けて区別する。--は、混淆を防止するために使用され、--の前に置くのは分岐名であり、後に置くのはファイル名である。同じ作用は、--コマンドだけではなく、他のコマンド、例えばgit logにも同じ使用法がある。

$ git log -2 -- redis.conf
commit 7a536c2912be1fd9f62b26b7022a00644c88ef8b
Author: Yossi Gottlieb <[email protected]>
Date: Fri Jul 10 11:33:47 2020 +0300

 TLS: Session caching configuration support. (#7420)

 * TLS: Session caching configuration support.
 * TLS: Remove redundant config initialization.

 (cherry picked from commit 3e6f2b1a45176ac3d81b95cb6025f30d7aaa1393)

commit 8312aa27d47c0befcf69eb74d0a5dc19745ffd32
Author: antirez <[email protected]>
Date: Mon Jun 22 11:21:21 2020 +0200

 Clarify maxclients and cluster in conf. Remove myself too.

 (cherry picked from commit 59fd178014c7cca1b0c668b30ab0d991dd3030f3)
書式を表示git checkoutは、フィルタ提出記録に加えて、表示フォーマットを制御してもよく、通常はパラメータを加えずに、著者、メール、記述情報、日付などの情報を表示します。
通過します

$ git log -1
commit 7bf665f125a4771db095c83a7ad6ed46692cd314 (HEAD -> 6.0, tag: 6.0.6, origin/6.0)
Author: Oran Agra <[email protected]>
Date: Sun Jul 19 14:00:20 2020 +0300

 Redis 6.0.6.
パラメータを追加すると、表示形式を制御したり、変更したりできます。
1行の情報を表示git logはデフォルトでは複数行の情報を表示します。git logを使用して、各送信記録は1行の情報だけを表示します。1画面でより多くの情報を見ることができます。

$ git log -10 --oneline
7bf665f12 (HEAD -> 6.0, tag: 6.0.6, origin/6.0) Redis 6.0.6.
a5696bdf4 Run daily CI on PRs to release a branch
e15528bf1 Adds SHA256SUM to redis-stable tarball upload
e28aa99af Support passing stack allocated module strings to moduleCreateArgvFromUserFormat (#7528)
305143004 Send null for invalidate on flush (#7469)
29b20fd52 Notify systemd on sentinel startup (#7168)
5b3668121 Add registers dump support for Apple silicon (#7453)
0f75036c0 correct error msg for num connections reaching maxclients in cluster mode (#7444)
b1a01fda9 Fix command help for unexpected options (#7476)
83f55f61a Refactor RM_KeyType() by using macro. (#7486)
レコードごとにファイルの変更の具体的な行数と行数を表示します。--onelineパラメータを使用すると、レコードごとに修正されたファイルの具体的な行数と行数統計が表示されます。

$ git log -2 --stat
commit 7bf665f125a4771db095c83a7ad6ed46692cd314 (HEAD -> 6.0, tag: 6.0.6, origin/6.0)
Author: Oran Agra <[email protected]>
Date: Sun Jul 19 14:00:20 2020 +0300

 Redis 6.0.6.

 00-RELEASENOTES | 245 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 src/help.h | 4 +-
 src/version.h | 2 +-
 3 files changed, 248 insertions(+), 3 deletions(-)

commit a5696bdf4f2687ab45f633ccb7cdc4ee9c2f957d
Author: Oran Agra <[email protected]>
Date: Sun Jul 19 15:33:21 2020 +0300

 Run daily CI on PRs to release a branch

 .github/workflows/daily.yml | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)
各サブミットの記録中のファイルの増行数と削除行数を表示します。--statパラメータを使用すると、--numstatパラメータに統合表示された修正された行の数を、行数の増加と削除行数に分割します。

$ git log -2 --numstat
commit 7bf665f125a4771db095c83a7ad6ed46692cd314 (HEAD -> 6.0, tag: 6.0.6, origin/6.0)
Author: Oran Agra <[email protected]>
Date: Sun Jul 19 14:00:20 2020 +0300

 Redis 6.0.6.

245 0 00-RELEASENOTES
2 2 src/help.h
1 1 src/version.h

commit a5696bdf4f2687ab45f633ccb7cdc4ee9c2f957d
Author: Oran Agra <[email protected]>
Date: Sun Jul 19 15:33:21 2020 +0300

 Run daily CI on PRs to release a branch

4 2 .github/workflows/daily.yml
各提出記録の各ファイルに追加された行数と削除された行数を順に並べます。
この目的を達成するには--statパラメータが必要です。このような表示形式は統計的に便利です。

$ git log -2 --pretty=tformat: --numstat
245 0 00-RELEASENOTES
2 2 src/help.h
1 1 src/version.h
4 2 .github/workflows/daily.yml
変更コードの行数を統計します。
前のマットがあれば、統一的に修正したい行数は簡単です。--prety=tformat: --numstatツールと協力すれば統計が完了します。

$ $ git log -2 --pretty=tformat: --numstat | awk '{adds += $1; subs += $2; diffs += $1 - $2} END {printf "added lines: %s removed lines: %s, diff lines: %s
", adds, subs, diffs}' added lines: 252 removed lines: 5, diff lines: 247
二つの分岐の差のコードライン数も統計できます。

$ git log 6.0..unstable --pretty=tformat: --numstat | awk '{adds += $1; subs += $2; diffs += $1 - $2} END {printf "added lines: %s removed lines: %s, diff lines: %s
", adds, subs, diffs}' added lines: 5 removed lines: 2, diff lines: 3
ここに行くと、前の知識は全部使えます。前のフィルタのパラメータが変わって、得られた結果が変わります。必要に応じて異なるパラメータを調整できます。
締め括りをつける
  • awkはコードブックに記録された「史書」であり、過去に作成された修正については過去の記録があるようにすることができます。
  • git logのオプションパラメータは、フィルタパラメータとフォーマットパラメータに分けられ、フィルタパラメータは記録範囲を選択でき、フォーマットパラメータは表示スタイル
  • を制御することができる。
  • 統計は一定の規則に基づいてデータをまとめ、纏める前にデータを整理する必要があり、これによって纏めた仕事がよりスムーズになります。
    ここでgit logsについて、特定の条件に基づいてログを検索し、修正コードの行数を統計する記事を紹介しました。git logsに関する統計をもっと多く修正しました。コードの行数については、以前の記事を検索してください。または、下記の関連記事を引き続きご覧ください。これからもよろしくお願いします。