Git コミット履歴の表示

Git のコミット履歴を確認すると、コードの変更状況や開発の進捗を把握できます。

Git には、コミット履歴を確認するためのさまざまなコマンドとオプションが用意されています。単純なログから詳細な差分比較まで対応できます。

Git のコミット履歴では、一般的に次の2つのコマンドがよく使われます:

  • git log- 過去のコミット履歴を確認する。
  • git blame <file>- 指定したファイルの変更履歴を一覧形式で確認する。

git log

Git でいくつかの更新をコミットした後、またはプロジェクトをクローンした後、コミット履歴を振り返りたい場合は、次を使用できます。git logコマンドで確認します。

git logこのコマンドは、Git リポジトリ内のコミット履歴を表示するために使用します。

git log最新のコミットから最古のコミットまでのすべてのコミット情報が表示されます。コミットのハッシュ値、作成者、コミット日付、コミットメッセージなどが含まれます。

git logコマンドの基本構文は次のとおりです:

git log [选项] [分支名/提交哈希]

よく使われるオプションは次のとおりです:

  • -p:コミットのパッチ(具体的な変更内容)を表示します。
  • --oneline:コミット情報を簡潔な1行形式で表示します。
  • --graph:ブランチとマージ履歴をグラフィカルに表示します。
  • --decorate:ブランチやタグが指すコミットを表示します。
  • --author=<作者>:特定の作成者のコミットのみを表示します。
  • --since=<时间>:指定した時刻より後のコミットのみを表示します。
  • --until=<时间>:指定した時刻より前のコミットのみを表示します。
  • --grep=<模式>:指定したパターンを含むコミットメッセージのみを表示します。
  • --no-merges:マージコミットを表示しません。
  • --stat:変更されたファイルと行数を含む簡潔な統計情報を表示します。
  • --abbrev-commit:短いコミットハッシュ値を使用します。
  • --pretty=<格式>:カスタマイズしたコミット情報の表示形式を使用します。

前の章での操作に対して、次のコマンドを使用します。git logコマンドで履歴コミットを一覧表示すると、次のようになります:

$ git log
commit d5e9fc2c811e0ca2b2d28506ef7dc14171a207d9 (HEAD -> master)
Merge: c68142b 7774248
Author: サンプル <[email protected]>
Date:   Fri May 3 15:55:58 2019 +0800

    Merge branch 'change_site'

commit c68142b562c260c3071754623b08e2657b4c6d5b
Author: サンプル <[email protected]>
Date:   Fri May 3 15:52:12 2019 +0800

    修改代码

commit 777424832e714cf65d3be79b50a4717aea51ab69 (change_site)
Author: サンプル <[email protected]>
Date:   Fri May 3 15:49:26 2019 +0800

    changed the サンプル.php

commit c1501a244676ff55e7cccac1ecac0e18cbf6cb00
Author: サンプル <[email protected]>
Date:   Fri May 3 15:35:32 2019 +0800

--oneline オプションを使用すると、履歴を簡潔なバージョンで表示できます。

$ git log --oneline
$ git log --oneline
d5e9fc2 (HEAD -> master) Merge branch 'change_site'
c68142b 修改代码
7774248 (change_site) changed the サンプル.php
c1501a2 removed test.txt、add サンプル.php
3e92c19 add test.txt
3b58100 第一次版本提交

これにより、このプロジェクトの開発履歴がわかります。

--graph オプションを使用して、履歴の中でいつブランチやマージが発生したかを確認することもできます。以下は同じコマンドで、トポロジーグラフオプションを有効にしたものです:

*   d5e9fc2 (HEAD -> master) Merge branch 'change_site'
|\  
| * 7774248 (change_site) changed the サンプル.php
* | c68142b 修改代码
|/  
* c1501a2 removed test.txt、add サンプル.php
* 3e92c19 add test.txt
* 3b58100 第一次版本提交

これで、いつ作業が分岐し、いつ統合されたかをより明確に確認できます。

また、次のパラメータを使用して--reverseすべてのログを逆順に表示できます。

$ git log --reverse --oneline
3b58100 第一次版本提交
3e92c19 add test.txt
c1501a2 removed test.txt、add サンプル.php
7774248 (change_site) changed the サンプル.php
c68142b 修改代码
d5e9fc2 (HEAD -> master) Merge branch 'change_site'

指定したユーザーのコミットログだけを検索したい場合は、git log --author コマンドを使用できます。たとえば、Git ソースコード内で Linus がコミットした部分を探すとします:

$ git log --author=Linus --oneline -5
81b50f3 Move 'builtin-*' into a 'builtin/' subdirectory
3bb7256 make "index-pack" a built-in
377d027 make "git pack-redundant" a built-in
b532581 make "git unpack-file" a built-in
112dd51 make "mktag" a built-in

日付を指定する場合は、--since や --before などのオプションを使用できます。また、--until や --after を使用することもできます。

たとえば、Git プロジェクトで3週間前から4月18日以降までのすべてのコミットを確認したい場合は、次のコマンドを実行します(マージコミットを非表示にするために --no-merges オプションも使用しています):

$ git log --oneline --before={3.weeks.ago} --after={2010-04-18} --no-merges
5469e2d Git 1.7.1-rc2
d43427d Documentation/remote-helpers: Fix typos and improve language
272a36b Fixup: Second argument may be any arbitrary string
b6c8d2d Documentation/remote-helpers: Add invocation section
5ce4f4e Documentation/urls: Rewrite to accomodate transport::address
00b84e9 Documentation/remote-helpers: Rewrite description
03aa87e Documentation: Describe other situations where -z affects git diff
77bc694 rebase-interactive: silence warning when no commits rewritten
636db2c t3301: add tests to use --format="%N"

よく使うオプション

表示するコミット数を制限する:

git log -n <number>

例:最新の5件のコミットを表示:

git log -n 5

指定した日付以降のコミットを表示:

git log --since="2024-01-01"

指定した日付より前のコミットを表示:

git log --until="2024-07-01"

特定の作成者のコミットのみを表示:

git log --author="Author Name"

詳細git logコマンドで確認できますhttp://git-scm.com/docs/git-logまたは、次を使用してgit log --helpコマンドでヘルプ情報を確認します。


git blame

git blameこのコマンドは、指定したファイルの各行のコードが、誰によって、いつ追加または変更されたかを1行ごとに表示します。

git blameファイルの各行の変更履歴を追跡できます。作成者、コミットハッシュ、コミット日付、コミットメッセージなどの情報が含まれます。

指定したファイルの変更履歴を確認するには、git blame コマンドを使用します。形式は次のとおりです:

git blame [选项] <文件路径>

よく使われるオプションは次のとおりです:

  • -L <起始行号>,<结束行号>:指定した行番号の範囲内のコード注釈のみを表示します。
  • -C:名前が変更された、またはコピーされたコード行についても、コード行の出所を追跡します。
  • -M:移動されたコード行についても、コード行の出所を追跡します。
  • -C -C 或 -M -M:多くの変更が加えられたコード行について、さらに詳しく出所を追跡します。
  • --show-stats:作成者ごとの行数統計情報を表示します。

ファイルの各行のコード注釈と関連情報を表示:

git blame <文件路径>

指定した行番号の範囲内のコード注釈のみを表示:

git blame -L <起始行号>,<结束行号> <文件路径>

名前が変更された、またはコピーされたコード行の出所を追跡:

git blame -C <文件路径>

移動されたコード行の出所を追跡:

git blame -M <文件路径>

行数統計情報を表示:

git blame --show-stats <文件路径>

git blame コマンドは変更履歴を一覧形式で表示します。次の例のとおりです:

$ git blame README 
^d2097aa (tianqixin 2020-08-25 14:59:25 +0800 1) # サンプル Git 测试
db9315b0 (サンプル    2020-08-25 16:00:23 +0800 2) # サンプル 

詳細については、次を使用してgit blame --help完全なヘルプドキュメントを確認し、その他のオプションや使用方法を学ぶことができます。


復元とロールバック

Git には、以前のバージョンに復元またはロールバックするためのさまざまな方法が用意されています。コマンドによって、適用されるシナリオやニーズが異なります。

以下は、いくつかの一般的な方法です:

  • git checkout:ブランチを切り替えるか、ファイルを指定したコミットに復元します。
  • git reset:現在のブランチを指定したコミットにリセットします(ソフトリセット、ミックスリセット、ハードリセット)。
  • git revert:指定したコミットを取り消すための新しいコミットを作成します。コミット履歴は変更されません。
  • git reflog:操作履歴を確認して、失われたコミットを見つけ出します。

1、git checkout:特定バージョンのファイルをチェックアウト

git checkout コマンドは、ブランチを切り替えたり、作業ディレクトリ内のファイルを指定したコミットに復元したりするために使用します。

作業ディレクトリ内のファイルを特定のコミットに復元する:

git checkout <commit> -- <filename>

例:file.txt を abc123 コミット時のバージョンに復元します:

git checkout abc123 -- file.txt

特定のコミットに切り替える:

git checkout <commit>

例:

git checkout abc123

この方法で特定のコミットに切り替えると、分離ヘッド(detached HEAD)状態になります。

2、git reset:現在のブランチを特定のコミットにリセット

git reset コマンドは、現在のブランチのコミット履歴を変更できます。主な3つのモードがあります:--soft、--mixed、--hard。

--soft:HEAD を指定したコミットにリセットするだけで、ステージングエリアと作業ディレクトリは変更されません。

git reset --soft <commit>

--mixed(デフォルト):HEAD を指定したコミットにリセットし、ステージングエリアをリセットしますが、作業ディレクトリは変更されません。

git reset --mixed <commit>

--hard:HEAD を指定したコミットにリセットし、ステージングエリアと作業ディレクトリの両方をリセットします。

git reset --hard <commit>

例:現在のブランチを abc123 コミットにリセットします:

git reset --hard abc123

3、git revert:特定のコミットを取り消す

git revert コマンドは、指定したコミットを取り消すための新しいコミットを作成します。コミット履歴は変更されないため、すでにリモートリポジトリにプッシュされたコミットに適しています。

git revert <commit>

例:abc123 コミットを取り消します:

git revert abc123

4、git reflog:操作履歴を確認する

git reflog コマンドは、すべての HEAD の移動を記録します。コミットが削除またはリセットされた場合でも、reflog を使用して見つけ出すことができます。

git reflog

reflog を利用すると、以前のコミットハッシュを見つけて、特定の状態に復元できます。例:

git reset --hard HEAD@{3}

例

以下は、これらのコマンドを使用して過去のバージョンを復元する方法を示す総合的な例です:

コミット履歴を確認:

git log --oneline

出力が次のようになったとします:

abc1234 Commit 1
def5678 Commit 2
ghi9012 Commit 3

Commit 2 に切り替える(分離ヘッド状態):

git checkout def5678

Commit 2 にリセットし、変更をステージングエリアに保持する:

git reset --soft def5678

Commit 2 にリセットし、ステージングエリアの変更を取り消す:

git reset --mixed def5678

Commit 2 にリセットし、すべての変更を破棄する:

git reset --hard def5678

Commit 2 を取り消す:

git revert def5678

reflog を確認して、失われたコミットを見つけ出す:

git reflog

以前のコミットハッシュを見つけて復元する:

git reset --hard HEAD@{3}
その他の拡張