git log - 查看 Commit 歷史

git log 讓你查看 repository 的 commit 歷史紀錄。

基本用法

git log

輸出範例:

commit a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6q7r8s9t0
Author: Mike Lee <mike@example.com>
Date:   Mon Jan 8 10:00:00 2025 +0800

    feat: add user authentication

commit b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6q7r8s9t0u1
Author: Mike Lee <mike@example.com>
Date:   Sun Jan 7 15:30:00 2025 +0800

    fix: resolve login bug

q 離開。

常用選項

單行顯示

git log --oneline

輸出:

a1b2c3d feat: add user authentication
b2c3d4e fix: resolve login bug
c3d4e5f docs: update README

顯示分支圖

git log --graph

搭配 --oneline 更清楚:

git log --oneline --graph

輸出:

*   a1b2c3d Merge branch 'feature'
|\
| * b2c3d4e Add new feature
| * c3d4e5f Start feature development
|/
* d4e5f6g Previous commit

顯示所有分支

git log --all

結合其他選項:

git log --oneline --graph --all

限制顯示數量

# 只顯示最近 5 筆
git log -5

# 或
git log -n 5

顯示變更的檔案

# 顯示修改的檔案名稱
git log --name-only

# 顯示修改的檔案和狀態
git log --name-status

# 顯示統計資訊
git log --stat

--stat 輸出範例:

commit a1b2c3d
Author: Mike Lee <mike@example.com>
Date:   Mon Jan 8 10:00:00 2025 +0800

    feat: add login form

 src/components/LoginForm.js | 45 ++++++++++++++++++++++++++++
 src/styles/login.css        | 20 +++++++++++++
 2 files changed, 65 insertions(+)

顯示每次 Commit 的差異

git log -p

這會顯示每個 commit 的詳細 diff。

搜尋與篩選

依作者篩選

git log --author="Mike"

依訊息搜尋

git log --grep="login"

搜尋 commit message 包含 "login" 的紀錄。

依日期篩選

# 某日期之後
git log --after="2025-01-01"
git log --since="2025-01-01"

# 某日期之前
git log --before="2025-01-31"
git log --until="2025-01-31"

# 日期區間
git log --after="2025-01-01" --before="2025-01-31"

# 相對日期
git log --since="2 weeks ago"
git log --since="yesterday"

依檔案篩選

# 查看特定檔案的歷史
git log index.html

# 查看特定目錄的歷史
git log src/

# 只看該檔案的修改(更精確)
git log --follow index.html

--follow 會追蹤檔案重新命名的歷史。

搜尋程式碼變更

# 搜尋新增或刪除特定字串的 commit
git log -S "function login"

# 搜尋符合正規表達式的變更
git log -G "login.*password"

自訂輸出格式

預設格式

git log --pretty=full
git log --pretty=fuller
git log --pretty=short

自訂格式

git log --pretty=format:"%h - %an, %ar : %s"

輸出:

a1b2c3d - Mike Lee, 2 hours ago : feat: add login
b2c3d4e - Mike Lee, 5 hours ago : fix: resolve bug

常用的格式佔位符:

佔位符說明
%H完整 commit hash
%h簡短 commit hash
%an作者名稱
%ae作者 email
%ar作者日期(相對)
%ad作者日期
%cnCommitter 名稱
%sCommit 訊息
%bCommit 訊息內文

常用組合

漂亮的 log 顯示

git log --oneline --graph --all --decorate

可以設成別名:

git config --global alias.lg "log --oneline --graph --all --decorate"

# 之後只要打
git lg

查看特定範圍

# 從某個 commit 到最新
git log a1b2c3d..HEAD

# 兩個分支之間的差異
git log main..feature

# 查看 feature 有但 main 沒有的 commit
git log main..feature

查看合併的 commit

# 只顯示合併 commit
git log --merges

# 不顯示合併 commit
git log --no-merges

其他查看歷史的指令

git show

查看特定 commit 的詳細資訊:

git show a1b2c3d

git shortlog

統計每個人的 commit 數量:

git shortlog

# 依數量排序
git shortlog -sn

輸出:

    25  Mike Lee
    18  Jane Doe
     7  Bob Smith

git reflog

查看 HEAD 的移動歷史(包含 reset、checkout 等操作):

git reflog

reflog 在你不小心 reset 或刪除分支時,可以幫你找回遺失的 commit。

實用範例

查看最近一週的工作

git log --oneline --since="1 week ago" --author="Mike"

查看某個檔案何時被刪除

git log --all --full-history -- path/to/deleted/file.txt

查看某行程式碼的歷史

git log -L 10,20:index.js

查看 index.js 第 10-20 行的修改歷史。