iT邦幫忙

2025 iThome 鐵人賽

DAY 9
0
自我挑戰組

30天 Git 版本控制實戰筆記系列 第 15

Day 15:Git 歷史查詢與分析 - 成為 Git 偵探

  • 分享至 

  • xImage
  •  

今日目標
• 學會查詢 Git 歷史記錄
• 掌握各種 log 查詢技巧
• 學習追蹤程式碼變更
• 找出 bug 的來源和責任歸屬
為什麼需要查詢歷史?
職場真實情況:
主管:「這個 bug 是誰寫的?什麼時候加入的?」
同事:「這個功能是誰負責的?」
客戶:「上週的版本還正常,現在怎麼壞了?」

如果不會查 Git 歷史 → 😰 不知道...
會查 Git 歷史 → 😎 馬上找到!
查詢歷史的用途:
• 🔍 找出 bug 來源:知道誰在何時引入問題
• 📊 分析程式碼變更:追蹤功能的演進
• 👥 了解開發歷程:誰做了什麼修改
• 🔄 版本回溯:找到特定版本的程式碼
• 📈 團隊績效分析:統計提交數量和貢獻度


操作步驟
步驟1:基本歷史查詢
查看提交記錄:

基本 log 查詢

git log

簡潔一行顯示

git log --oneline

顯示最近 5 個提交

git log --oneline -5

顯示最近 10 個提交

git log --oneline -10
範例輸出:
a1b2c3d (HEAD -> main) feat: 新增使用者儀表板
e4f5g6h fix: 修復登入驗證問題
i7j8k9l docs: 更新 README 說明
m1n2o3p style: 改善首頁樣式
q4r5s6t feat: 新增團隊介紹頁面
步驟2:圖形化顯示分支歷史
顯示分支結構:

圖形化顯示

git log --oneline --graph

顯示所有分支

git log --oneline --graph --all

更詳細的圖形顯示

git log --graph --all --decorate --oneline
範例輸出:

  • a1b2c3d (HEAD -> main) feat: 新增使用者儀表板
  • e4f5g6h Merge branch 'feature/homepage'
    |\
    | * i7j8k9l feat: 完成首頁設計
    | * m1n2o3p style: 首頁樣式調整
    |/
  • q4r5s6t fix: 修復導航問題
  • t6u7v8w feat: 新增團隊介紹頁面
    步驟3:查看詳細的提交資訊
    顯示完整提交內容:

查看特定提交的詳細資訊

git show a1b2c3d

只顯示提交訊息和檔案變更

git show --stat a1b2c3d

只顯示提交訊息,不顯示 diff

git show --no-patch a1b2c3d
步驟4:按條件搜尋提交
按作者搜尋:

查看特定作者的提交

git log --author="你的名字"

查看多個作者

git log --author="Alice|Bob"

查看自己的提交

git log --author="$(git config user.name)"
按日期搜尋:

查看今天的提交

git log --since="today"

查看最近 7 天的提交

git log --since="1 week ago"

查看特定日期之後的提交

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

查看特定日期範圍

git log --since="2024-01-01" --until="2024-01-31"
按提交訊息搜尋:

搜尋包含特定關鍵字的提交

git log --grep="login"

搜尋包含 "fix" 的提交

git log --grep="fix"

搜尋包含 "feat" 的提交

git log --grep="feat"

不區分大小寫搜尋

git log --grep="LOGIN" -i
步驟5:查看檔案變更歷史
查看特定檔案的歷史:

查看某個檔案的所有提交

git log -- index.html

簡潔顯示

git log --oneline -- index.html

顯示檔案的變更內容

git log -p -- index.html

查看誰修改了這個檔案

git log --follow -- index.html
查看檔案的每一行是誰寫的:

顯示每一行的作者和提交

git blame index.html

只顯示特定行數範圍

git blame -L 10,20 index.html

顯示更多資訊

git blame -l index.html
步驟6:比較不同版本
比較兩個提交:

比較兩個 commit 的差異

git diff a1b2c3d e4f5g6h

只顯示檔案名稱

git diff --name-only a1b2c3d e4f5g6h

顯示統計資訊

git diff --stat a1b2c3d e4f5g6h
比較分支:

比較兩個分支

git diff main feature/homepage

比較當前分支和 main

git diff main

比較暫存區和最後一次提交

git diff --staged
步驟7:搜尋程式碼內容
在提交歷史中搜尋程式碼:

搜尋新增或刪除特定程式碼的提交

git log -S "function login"

搜尋正規表達式

git log -G "login.*function"

顯示變更內容

git log -S "function login" -p
在目前程式碼中搜尋:

搜尋所有檔案中的關鍵字

git grep "login"

顯示行號

git grep -n "login"

只顯示檔案名稱

git grep -l "login"

不區分大小寫

git grep -i "LOGIN"


實用查詢技巧
技巧1:找出引入 bug 的提交
使用 git bisect(二分搜尋法):

開始 bisect

git bisect start

標記目前版本是壞的

git bisect bad

標記已知好的版本

git bisect good v1.0.0

Git 會自動切換到中間的版本

測試這個版本...

如果這個版本是好的

git bisect good

如果這個版本是壞的

git bisect bad

重複上述步驟,直到找到問題提交

完成後重置

git bisect reset
技巧2:查看檔案在特定版本的內容

查看某個提交中的檔案內容

git show a1b2c3d:index.html

查看某個 tag 的檔案內容

git show v1.0.0:index.html

將特定版本的檔案儲存到新檔案

git show a1b2c3d:index.html > old_index.html
技巧3:統計提交資訊

統計每個人的提交數量

git shortlog -sn

統計最近一個月的提交

git shortlog -sn --since="1 month ago"

查看貢獻者列表

git shortlog -s

按作者分組顯示提交

git shortlog
技巧4:查看提交之間的關係

查看某個提交是否包含在分支中

git branch --contains a1b2c3d

查看兩個提交的共同祖先

git merge-base main feature/homepage

查看從某個提交開始的所有後續提交

git log a1b2c3d..HEAD


進階查詢組合
組合1:查看最近一週自己的提交
git log --author="$(git config user.name)" --since="1 week ago" --oneline
組合2:查看某個功能的完整開發歷程
git log --grep="登入" --all --oneline --graph
組合3:產生變更日誌

查看兩個版本之間的變更

git log v1.0.0..v1.1.0 --oneline --no-merges

按類型分組

git log v1.0.0..v1.1.0 --oneline --no-merges | grep "feat:"
git log v1.0.0..v1.1.0 --oneline --no-merges | grep "fix:"
組合4:找出最大的檔案修改

查看修改最多次的檔案

git log --pretty=format: --name-only | sort | uniq -c | sort -rg | head -10

查看某個檔案的修改次數

git log --oneline -- index.html | wc -l


實戰案例
案例1:追蹤 Bug 來源
問題:網站突然無法登入

1. 查看最近的登入相關修改

git log --grep="login" --since="1 week ago" --oneline

2. 查看登入檔案的變更歷史

git log -p -- auth/login.js

3. 找出誰修改了登入驗證

git blame auth/login.js

4. 查看可疑提交的詳細內容

git show a1b2c3d
案例2:準備版本發布說明

查看從上個版本到現在的所有變更

git log v1.0.0..HEAD --oneline

分類整理

echo "新功能:"
git log v1.0.0..HEAD --oneline --grep="feat:"

echo "Bug 修復:"
git log v1.0.0..HEAD --oneline --grep="fix:"

echo "文件更新:"
git log v1.0.0..HEAD --oneline --grep="docs:"
案例3:程式碼審查準備

查看某個分支的所有變更

git log main..feature/new-function --oneline

查看具體的程式碼變更

git diff main...feature/new-function

查看影響的檔案

git diff --name-only main...feature/new-function


常用 Git Log 參數總結

格式化輸出

--oneline # 簡潔一行顯示
--graph # 圖形化顯示分支
--all # 顯示所有分支
--decorate # 顯示分支和標籤名稱

數量限制

-n <數字> # 限制顯示數量
-5 # 顯示最近 5 個

日期範圍

--since="日期" # 從某日期開始
--until="日期" # 到某日期結束
--after="日期" # 等同 since
--before="日期" # 等同 until

作者和提交訊息

--author="名字" # 按作者篩選
--grep="關鍵字" # 按提交訊息搜尋

檔案相關

-- <檔案名> # 只顯示該檔案的歷史
-p # 顯示 diff
--stat # 顯示統計資訊
--follow # 追蹤檔案重命名

內容搜尋

-S "字串" # 搜尋程式碼變更
-G "正規表達式" # 正規表達式搜尋


今日重點回顧
• ✅ 掌握基本的 log 查詢指令
• ✅ 學會按條件搜尋提交記錄
• ✅ 能夠追蹤檔案變更歷史
• ✅ 會使用 blame 找出程式碼作者
• ✅ 學習進階查詢技巧組合
核心指令總結
git log --oneline # 簡潔查看歷史
git log --graph --all # 圖形化顯示分支
git log --author="名字" # 按作者查詢
git log --since="日期" # 按日期查詢
git log --grep="關鍵字" # 按訊息搜尋
git log -p -- <檔案> # 查看檔案歷史
git blame <檔案> # 查看每行作者
git show # 查看提交詳情
git diff # 比較版本


上一篇
Day 14:第二週總複習 - 協作流程整合
下一篇
Day 16:Git Hooks 自動化 - 讓 Git 自動幫你做事
系列文
30天 Git 版本控制實戰筆記19
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言