Git Log 美化與過濾技巧:讓版本歷史清晰可見
在 Linux 開發環境中,git log 無疑是最常用的指令之一。然而,預設的輸出格式往往冗長且難以快速掌握專案的關鍵變更。對於日常需要追蹤程式碼演進、尋找特定 Bug 來源或進行 Code Review 的開發者而言,掌握 git log 的高階用法與美化技巧,能大幅提升工作效率。本文将深入解析如何利用格式化輸出、過濾條件以及圖形化呈現,讓你的 Git 日誌變得既美觀又實用。
客製化輸出格式
預設的 git log 會顯示 Commit Hash、作者、日期以及訊息,但資訊排列緊湊,閱讀時容易眼花。使用 --pretty 或簡寫 -p 選項,我們可以自定義輸出欄位。最實用的技巧是結合 --oneline 與自定義格式,將關鍵資訊濃縮在一行內。
例如,若你只關心「誰、在什麼時間、做了什麼修改」,可以使用以下指令:
git log --oneline --pretty=format:"%h - %an, %ar : %s"
這裡的格式字串解釋如下:
%h:短版 Commit Hash%an:作者名稱 (Author Name)%ar:相對時間 (Relative Date,例如 2 days ago)%s:提交訊息 (Subject)
執行後,輸出結果將類似如下:
a1b2c3d - john, 2 days ago : Fix login bug
e5f6g7h - jane, 1 week ago : Add user profile feature
i8j9k0l - john, 2 weeks ago : Initial commit
這種格式不僅簡潔,還方便使用 grep 進行後續過濾。
圖形化歷史與分支追蹤
當專案分支眾多時,理解分支的合併與分叉情況至關重要。--graph 選項能將提交歷史以 ASCII 圖形的方式呈現,直觀地展示分支的流動。通常建議搭配 --all 查看所有分支,並使用 --decorate 顯示分支標籤。
git log --all --graph --oneline --decorate
輸出範例:
* 3f4e5d6 (HEAD -> main, origin/main) Merge branch 'feature-x'
|\
| * 7a8b9c0 (feature-x) Update config file
* | 1d2e3f4 Add new API endpoint
|/
* 5g6h7i8 Initial setup
從圖形中可以清楚看到 feature-x 分支如何與 main 合併,這對於理解複雜的 Git 歷史結構極有幫助。
精準過濾提交記錄
除了美化,過濾條件是 git log 的核心威力所在。開發者常需要找出特定時間範圍、特定檔案或特定作者的變更。
1. 依時間過濾
使用 --since 和 --until 可以限定時間範圍。例如,查看最近一週內的提交:
git log --since="1 week ago" --oneline
2. 依檔案過濾
若想追蹤某個特定檔案的歷史,可以使用 -- 分隔提交條件與檔案路徑:
git log --oneline -- src/utils/helper.py
3. 依關鍵字過濾
使用 --grep 搜尋提交訊息中包含特定單字的記錄:
git log --oneline --grep="fix" --grep="bug" --all-match
註:--all-match 表示訊息需同時包含 "fix" 與 "bug";若省略此選項,則只要包含任一即可。
常見問題與解決
Q1: 為什麼 git log --oneline 輸出的 Hash 太長?
預設 --oneline 會顯示完整的 40 位元組 Hash,這在長列表中非常佔空間。請務必搭配 --abbrev-commit 或簡寫 --no-abbrev 的相反用法,實際上 --oneline 預設就是短 Hash。若仍覺得不夠短,可手動指定 --pretty=format:"%h ...",%h 預設會自動縮短至足夠區分的長度(通常為 7-8 位元)。
Q2: 如何查看某個提交與前一個提交的具體差異?
git log 本身只顯示摘要。若需查看具體程式碼差異,應使用 git show 搭配 Commit Hash,或在 git log 中使用 -p 選項。但 -p 會使輸出變得極為冗長。建議做法是:先透過美化後的 git log 找到目標 Hash,再執行:
git show <commit_hash> --stat
--stat 選項會顯示檔案變更統計(新增/刪除行數),比完整 diff 更適合快速檢視影響範圍。
小結
掌握 git log 的美化與過濾技巧,能讓版本控制不再是黑盒子。透過自定義格式、圖形化歷史以及精準的過濾條件,開發者能更快速地定位問題、理解專案演進。建議在 .gitconfig 中設定別名(alias),例如將上述複雜指令設為 git llog,即可在日常工作中一鍵呼叫,享受高效開發的樂趣。