マスター Git ログ:コミットの表示とフィルターに関する包括的なガイド
git log コマンドは、Git リポジトリ内のコミットのレコードを表示します。デフォルトでは、git log コマンドはコミット ハッシュ、コミット メッセージ、およびその他のコミット メタデータを表示します。さまざまなオプションを使用して git ログの出力をフィルタリングできます。
バージョン管理システムには、コードベースが時間の経過とともにどのように進化するかを記録するという 1 つの中心的な目的があります。これにより、プロジェクトがどのように進行したかを確認できます。プロジェクトに誰が貢献したかを調べ、コードにいつどのような変更が加えられたかを特定できます。
しかし、Git リポジトリが作成した履歴は実際にどのように表示するのでしょうか?ここで git log コマンドが役に立ちます。
このチュートリアルでは、例を示しながら、git log コマンドの基本と、それを使用して Git リポジトリを検査する方法について説明します。
git log コマンド
git log コマンドは、リポジトリに対して行われたすべてのコミットのリストを表示します。各 Git コミットのハッシュ、各コミットに関連付けられたメッセージ、その他のメタデータを確認できます。このコマンドは、リポジトリの履歴を表示するのに役立ちます。
git status コマンドは現在の作業ディレクトリに焦点を当てていますが、git log を使用するとリポジトリの履歴を確認できます。
git log コマンドの例
git log コマンドがどのように機能するかを示す例を見てみましょう。私たちは「demo-repository」と呼ばれるリポジトリに取り組んでいます。ここで、リポジトリにプッシュしたすべてのコミットのリストを確認したいと思います。これを行うには、次のコマンドを使用できます。
git log コマンドは、リポジトリ内で行われたすべてのコミットのリストを返します。このコマンドによって返される単一のコミットの例を次に示します。
commit 43433c674e3d6c86a889fad222dae179785893cf (HEAD -> master, origin/master, origin/HEAD) Author: James Gallagher <37276661+jamesgallagher432@users.noreply.github.com> Date: Tue Apr 7 13:09:58 2020 +0100 Update index.html
この出力について段階的に説明していきます。 git log コマンドによって返される各エントリには次の内容が含まれます。
- コミットの Secure Hash Algorithm (SHA) ハッシュ。リポジトリ内の各コミットを一意に識別するために使用されます。上の例では、これは「43433c674e3d6c86a889fad222dae179785893cf」でした。
- コミットの作成者。上の例では、これはジェームズ ギャラガーでした。作成者のメールアドレスも指定されます。
- コミットがプッシュされた日付。上の例では、これは 4 月 7 日火曜日でした。
- コミットに関連付けられたメッセージ。上記で返されたコミット メッセージは「Update 」でした。
このすべてのデータは、リポジトリ内のコミットに関する有用な情報を提供します。
git log の出力のフィルタリング
デフォルトでは、git log は、この構造を使用してリポジトリに対して行われたすべてのコミットのリストを返します。ご想像のとおり、読み取るコミットが多数ある場合、git ログ ステートメントを読み取るのはすぐに困難になります。
git log には、ログをフィルタリングするために使用できるいくつかのフラグが付属しています。これらは次のとおりです:
最新のものでフィルタリング
特定の数のコミットを返したい場合は、-n フラグを使用して実行できます。このフラグの動作例を次に示します。
このコマンドは、リポジトリに対して行われた最近の 3 つのコミットのリストを返します。
作成者またはコミッターでフィルタリング
変更を作成またはコミットした人によって、git log によって返されたコミットをフィルターすることもできます。 「John Smith」によってプッシュされたコミットのリストを確認したいとします。これを行うには、次のコマンドを使用します。
git log --author="John Smith" git log --committer="John smith"
作成者フラグは、John Smith によって変更が行われたコミットに結果を制限します。コミッター フラグは、結果をその個人によって実際にコミットされたコミットに制限します。
ほとんどの場合、作成者とコミッターは同一人物であることがわかります。大規模なプロジェクトでは、コミットの作成者が必ずしもそれをリポジトリにプッシュする人であるとは限りません。これが、これら 2 つのフラグが存在する理由です。
日付でフィルタリング
さらに、git log の結果を日付でフィルターすることもできます。これを行うには、-before フラグと-after フラグを使用できます。これらのフラグはどちらも幅広い日付形式を受け入れますが、最も一般的に使用される 2 つは相対参照と完全な日付です。
2019 年 3 月 2 日以降のコミットのリストを取得するとします。次のコマンドを使用してこれを行うことができます:
git log --after="2019-3-2"
コミットをフィルターする日付を指定しました。同様に、昨日より前のコミットのリストを取得したい場合は、次のコマンドを使用して取得できます。
git log --before="yesterday"
相対値 (「昨日」) を指定しました。
ここで、2019 年 3 月 2 日以降、2019 年 3 月 19 日より前に公開されたコミットのリストを取得するとします。次のコマンドを使用してこれを行うことができます:
git log --after="2019-3-2" --before="2019-3-19"
ファイルでフィルタリング
git log コマンドを使用しているとき、特定のファイルに影響を与えたコミットのリストのみを確認したい場合があります。そのためには、変更を確認したいファイルを指定できます。
コード内の「main.py」ファイルに加えられた変更を確認したいとします。次のコマンドを使用してこれを行うことができます:
— ステートメントは、指定した引数がブランチの名前ではなくファイル パスであることを git log コマンドに指示します。
このコマンドでは、git log コマンドの応答をフィルターするために使用するファイルを 1 つだけ指定しました。ただし、必要に応じて、複数のファイルを指定できます。
コンテンツでフィルタリング
特定のコード行を削除または追加したコミットを検索することもできます。

「キャリア カルマは、私が最も必要としたときに私の人生に入り込み、すぐにブートキャンプに参加するのに役立ちました。卒業から 2 か月後、私は自分の価値観と人生の目標に合致する夢の仕事を見つけました。」
Rockbot のソフトウェア エンジニア、Venus 氏
ブートキャンプにマッチするものを見つけてください
コードに「# Introduction」という用語を追加したすべてのコミットを検索するとします。次のコマンドを使用してこれを行うことができます:
git log -S"# Introduction"
-S フラグは、コミットのリストでどのコミット変更を探したいかを指定するために使用されます。 -S フラグの間にスペースや等号がないことに注意してください。また、探しているコミットの内容を指定するために使用した引用符。
範囲によるフィルター
since および until パラメータを使用して、一定範囲のコミットを git log に渡すことができます。これらのパラメータの構文は次のとおりです。
コミット b72beb5 がプッシュされてからコミット b53b22d がプッシュされるまでに行われたコミットのリストを取得するとします。次のコマンドを使用してこれを行うことができます:
このコマンドは、b72beb5 コミットと b53b22d コミットの間のすべてのコミットのリストを返します。
メッセージでフィルタリング
–grep フラグを使用すると、git log によって返されたコミットを、特定のコミットに関連付けられたコミット メッセージによってフィルタリングできます。
たとえば、名前が「feat:」で始まるすべてのコミットのリストを返したいとします。次のコードを使用してこれを行うことができます。
このコマンドは、メッセージが「feat:」で始まるすべてのコミットのリストを返します。
git ログの出力のフォーマット
最後のセクションでは、git log コマンドからの完全な出力を操作しました。この出力には、コミットの SHA、コミット作成者、コミットがプッシュされた日付、およびコミット メッセージが含まれていました。
これらの情報はすべて便利ですが、コミットに関する特定のデータのみを取得する必要がある場合もよくあります。幸いなことに、 git log コマンドには、コマンドの出力をフォーマットするために使用できるいくつかのフラグが付属しています。
簡単なログを返す
デフォルトでは、git log ステートメントは、リポジトリに対して行われた各コミットの完全なログ エントリを返します。 –oneline フラグを使用すると、コミット ID とそれに関連付けられたコミット メッセージのリストを取得できます。
–oneline フラグの構文は次のとおりです。
先ほどのリポジトリでこのコマンドを実行すると、次のコマンドが返されます。
43433c6 (HEAD -> master, origin/master, origin/HEAD) Update index.html a7d8dc2 docs: Update README.md b53b22d feat: Update website 3b16026 feat: Launch new homepage b72beb5 first commit
コミット ID と、コミットに関連付けられたメッセージの最初の行が表示されます。これは、git log コマンドが返すコミットに関連付けられたすべてのメタデータよりも読みやすいです。
各エントリは 1 行で表示されます。この git log の 1 行テクニックは、あまり多くの情報を表示せずにコミットを表示するので便利です。
出力の装飾
–decorate フラグを使用すると、特定のコミットを指すすべての参照 (つまり、ブランチとタグ) を表示できます。このフラグの構文は次のとおりです。
このコマンドは以下を返します:
43433c6 (HEAD -> master, origin/master, origin/HEAD) Update index.html a7d8dc2 docs: Update README.md b53b22d feat: Update website 3b16026 (tag: v1) feat: Launch new homepage b72beb5 first commit
リストの 4 番目のコミットには、タグの名前が指定されています。これは、–decorate フラグにより、コミット履歴内の各コミットに関連付けられた参照が明らかになるためです。
差分を返す
–stat フラグを使用すると、各コミットでリポジトリに追加またはリポジトリから削除されたコードの行数を表示できます。 git log –stat コマンドの動作例を次に示します。
Author: James Gallagher <james@users.noreply.github.com> Date: Mon Apr 6 09:11:46 2020 +0100 feat: Update website index.html | 1 + index.js | 0 2 files changed, 1 insertion(+)
プラス記号 (+) は挿入を示し、存在する場合はマイナス記号 (-) は削除を示します。このデータにより、リポジトリに加えられた全体的な変更についてさらに詳しく知ることができます。
リポジトリに加えられた正確な変更を確認したい場合は、-p フラグを使用できます。これにより、コミットで行われた変更を示す、より包括的な差分が返されます。
以下は、サンプル リポジトリで実行した場合の git log -p コマンドから返される 1 つのエントリです。
Author: James Gallagher <37276661+jamesgallagher432@users.noreply.github.com> Date: Tue Apr 7 13:09:58 2020 +0100 Update index.html diff --git a/index.html b/index.html index f45673f..2d2701d 100644 --- a/index.html +++ b/index.html @@ -1,2 +1,3 @@ -This is a file. -Changes have been made. +<body> + <p>This is a website.</p> +</body>
この出力には、コミットの説明と、コミットで行われた各変更の詳細な内訳の両方が表示されます。ユーザーがリポジトリ内のファイルにいつコンテンツを追加または削除したかを確認できます。
このデータは便利ですが、表示するコミットが多数ある場合、この出力を読み取るのがすぐに困難になる可能性があります。この記事で説明した他のフラグを 1 つ以上使用することもできます。これにより、このコミットによって返される情報が包括的かつ読みやすくなります。
Git diff の詳細については、git diff コマンド ガイドをご覧ください。
git shortlog コマンド
git shortlog コマンドは、git ログの概要を提供します。 git shortlog コマンドの出力は作成者ごとにグループ化されているため、誰がリポジトリにどのような変更を加えたかを簡単に確認できます。
先ほどのリポジトリで git shortlog コマンドを実行してみましょう。
コマンドは次を返します:
James Gallagher (5): first commit feat: Launch new homepage feat: Update website docs: Update README.md Update index.html
James はこのリポジトリに貢献した唯一の人物で、5 つのコミットを行っています。ただし、他の貢献者がいる場合は、その貢献者がリポジトリにプッシュしたコミットの合計数とともに、ここにリストされます。
結論
git log コマンドを使用すると、いつ、誰によって、リポジトリにどのような変更が加えられたのかが表示されます。 git ログの出力をフィルタリングして、知る必要がある情報のみを表示できます。
git log コマンドには 2 種類のフラグが付属しています。一部のフラグは、ログの出力をフォーマットするのに役立ちます。コマンドによって返されたコミットをフィルタリングするのに役立つその他のフラグ。
このチュートリアルでは、例を参照しながら、git log の使用方法と、コマンドで使用される最も一般的なフラグについて説明しました。 git log コマンドは、Git を使用する場合に重要なツールです。このコマンドを効果的に使用する方法を理解すれば、Git リポジトリの検査の達人になるでしょう!
Git について詳しくは、Git の学習方法ガイドをご覧ください。
-
ツェラーのアルゴリズムを使用して平日を見つける
ツェラーのアルゴリズムは、特定の日付から平日を見つけるために使用されます。ツェラーのアルゴリズムを使用して平日を見つける式は次のとおりです。 式にはいくつかの変数が含まれています。彼らは- d −日付の日。 m:月コードです。 3月から12月までは3から12、1月は13、2月は14です。1月または2月を考慮すると、指定された年は1減少します。 y −年の最後の2桁 c −年の最初の2桁 w −平日。 0の場合は土曜日、6の場合は金曜日を意味します 入力と出力 Input: The day, month and the year: 4, 1, 1997 Output: It w
-
通信ベースのデータ構造
トータルとリーフの対応は、より洗練された対応手法です。これらの手法の両方で、要素の半分は最小PQに配置され、残りの半分は最大PQに配置されます。要素数が奇数の場合、1つの要素がバッファに格納されます。このバッファリングされた要素は、どちらのPQのメンバーでもありません。トータルコレスポンデンス手法では、最小PQの各要素xは、最大PQの個別の要素yとペアになります。 (x、y)は、priority(x)<=priority(y)。のような対応する要素のペアです。 図Eは、11個の要素3、4、5、5、6、6、7、8、9、10、11の合計対応ヒープを示しています。要素10はバッファー内にあります。