# 使用 ChatGPT 審查 Git 分支所有 Commits > Using ChatGPT to Review All Commits in a Git Branch. > 從產出 patch 檔到整理 changelog,一次搞懂完整審查流程 本篇操作筆記紀錄如何搭配 Git 指令與 ChatGPT,有系統地檢視某個分支上所有 commit 的內容,適用於程式碼審查、自我檢查或多人協作開發的場景。 --- ## 使用情境 當你有一個 Git 分支包含多個 commit,希望對這些改動內容進行逐一檢視、分類與整理時,透過 `git format-patch` 指令產出差異檔,再搭配 ChatGPT,即可進行清楚的 commit 級別 review。 --- ## 🛠️ 使用指令:產出 patch.diff ```bash git format-patch origin/main..your_branch_name --stdout > patch.diff ``` ### 指令說明: | 區段 | 說明 | |------|------| | `git format-patch` | 產出 commit 差異的工具,可依順序輸出 | | `origin/main..your_branch_name` | 指定起始與目標範圍,可以是分支名稱(如 `origin/main..feature/foo`)或 commit hash(例如 `abc123..def456`,不含頭,含尾) | | `--stdout` | 將輸出內容直接顯示在終端機(標準輸出),便於搭配轉向操作 `>` 儲存為檔案 | | `> patch.diff` | 將輸出內容寫入檔案(這裡為 `patch.diff`) | > 小提示:使用 hash 可以精確指定要 review 的 commit 範圍,適合長期分支或多重合併歷史。 --- ## Prompt 使用技巧與 ChatGPT 功能應用 搭配 ChatGPT 使用時,可依以下建議互動,以獲得更有效的審查流程。 ### 🔹 初始 Prompt 範例 ```text 請幫我 review patch.diff, 你可以先列出所有 commit 訊息與可能的改動方向, 然後依照順序逐一 review 每筆 commit 的內容與變更細節, 請等我說「請繼續」後才進行下一筆。 ``` ### 🔹 提問提示建議 - **逐筆節奏控制**:明確請求「每次只 review 一筆」,避免資訊過載。 - **整體分類分析**:可要求先依照 commit message 分組(如新增功能 / 修正 bug / 重構 / i18n 等)。 - **針對性詢問**:例如: - 哪些 commit 需要補單元測試? - 哪些驗證條件可能導致前端 UI 問題? - 哪些 commit 應補上翻譯或 i18n ID? - **要求總結與 changelog 撰寫**:在 review 完畢後,請 ChatGPT 幫忙整理一份可用於 PR 或 Release Note 的變更說明。 ### 🔹 高效、完整、失誤率小的 Prompt 範例 這個 prompt 是針對完整且長篇 patch(多個 commit)最佳化的寫法,讓 ChatGPT 能: - 先列出所有 commit 概況與預期內容 - 按照 commit 順序逐一 review - 每次只處理一筆 commit(可降低理解錯誤) - 你控制 review 節奏(用「請繼續」啟動下一筆) ```text 我將提供一份由 `git format-patch` 產生的 patch 檔(多個 commit),請你幫我完整 review。 請依照以下步驟執行: 1. 先列出每個 commit 的訊息與預期改動,例如功能新增、bug 修正、重構調整等,預覽整體方向。等待指示再前往下一步驟。 2. 接著準備開始逐一 review commit,內容包含 • 程式碼差異(diff) • 邏輯正確性 • 命名合理性(變數 / 方法 / 型別等) • 翻譯是否符合語境 • 驗證規則(格式檢查、限制、錯誤處理) • 潛在問題與優化建議 3. 每次只 review 一筆,請等我回覆「請繼續」後,再進行下一筆 commit。 4. 最後請協助整理一份 changelog。 ``` --- ## ChatGPT 可以幫你完成的事: | 類型 | 說明 | |------|------| | 🔍 Commit 整理 | 列出所有 commit message、作者、順序與改動目標檔案 | | 🔎 程式碼審查 | 協助檢查語法錯誤、命名不一致、邏輯不清等問題 | | 🌐 i18n 檢查 | 確認 `source` 與 `target` 是否一致、是否缺漏 ID、是否誤用特殊符號 | | 🧪 測試補強建議 | 建議應加入哪些測試情境,並可協助撰寫單元測試範本 | | 🧾 changelog 撰寫 | 幫你產出清楚、正式格式的變更記錄說明 | | 📁 重構建議 | 指出哪些重複邏輯可抽出共用函式,哪些 validator 可模組化 | --- ## ✅ 實作流程建議 1. 使用 `git format-patch` 將 branch 與目標 base(例如 `main` 或 `develop`)間的差異存為 `patch.diff`。 2. **建議使用複製貼上的方式**,將 `patch.diff` 的內容貼入 ChatGPT,或使用「檔案上傳」功能(若使用 ChatGPT Pro 可拖曳上傳)。這樣可確保內容最直接地進入模型判讀。 3. 若貼上後 ChatGPT 顯示「內容過長」或發出截斷警告,請考慮使用 [patch 檔最佳化](#%F0%9F%93%A6-Patch-%E6%AA%94%E6%9C%80%E4%BD%B3%E5%8C%96%EF%BC%9A%E9%81%BF%E5%85%8D%E9%81%8E%E5%A4%A7%E5%85%A7%E5%AE%B9%E5%BD%B1%E9%9F%BF-ChatGPT-%E5%88%A4%E8%AE%80) 方法,刪除不必要的 diff,例如 `yarn.lock` 或其他產生檔。 4. 輸入初始 prompt,請 ChatGPT 先列出 commit 概況。 5. 逐筆請求 review,並適時插入自訂提問。 6. 完成所有 commit 審查後,請 ChatGPT 輸出一份整理過的 changelog 或 PR 說明。 --- ## Patch 檔最佳化:避免過大內容影響 ChatGPT 判讀 在使用 `git format-patch` 時,若 diff 檔內容太長(如含有 `yarn.lock` 等自動產生的檔案),容易造成 ChatGPT 輸入過多、超過 token 限制,導致無法正確讀取或回應中斷。 > 在 prompt 清楚的前提下,出現亂回答、幻聽、整理失敗等問題,有很大概率是內容太長了 ### ✅ 建議做法: - **排除不必要的檔案**(如 `yarn.lock` 等自動產生的檔案等) - 可使用 **正則表示式 (regex)**,手動刪除 diff 中這些區段 #### Regex 範例 刪除 yarn.lock 的 diff ```regex diff\s--git(?:.*?)yarn\.lock(?:.|\n)*?(?=diff\s--|--\s*\n\d) ``` 或超過指定行數的檔案,如路徑帶有 `message` 且超過 50 行的更動 ```regex diff\s--git(?:.*?)message(?:.*?\n){50,}?(?=diff\s--|--\s*\n\d) ``` 可搭配文字編輯器(如 VS Code)啟用「正則搜尋」功能來使用。 --- ## 限制產出範圍(可選) 若你只想產出部分 commit 或特定條件的差異內容,可使用下列進階參數: ### 限制前 n 筆 commit: ```bash git format-patch -n 5 origin/main..your_branch --stdout > patch.diff ``` ### 指定時間區間: ```bash git format-patch --since="2024-04-01" --until="2024-04-10" origin/main..your_branch --stdout > patch.diff ``` ### 指定作者: ```bash git format-patch --author="yourname" origin/main..your_branch --stdout > patch.diff ``` --- ## 參考資料 - [`git format-patch` 官方文件](https://git-scm.com/docs/git-format-patch) - [Conventional Commits 格式](https://www.conventionalcommits.org/en/v1.0.0/) - [Keep a Changelog 格式](https://keepachangelog.com/zh-TW/1.0.0/)
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up