# Git Commit Message 規範
為了維持專案歷史紀錄的可讀性與追蹤效率,本團隊採用以下 Commit 規範。撰寫訊息時應兼具「做了什麼(What)」以及「為什麼做(Why)」,讓日後進行維護人員更快進入狀況。
## 1. 訊息格式
```text
<動作 action>: <標題 title>
<敘述 description> (選填)
fixed <issue 編號> (若為修復 Issue 則必填)
```
## 2. 動作類型 (Action)
請根據 Commit 的性質選擇正確的動作標籤:
| 動作 (Action) | 說明 |
| --- | --- |
| **feat** | 新增或修改功能(對使用者/外部行為有新增或變更) |
| **fix** | 修補 Bug(修正錯誤行為、例外、邏輯缺陷) |
| **docs** | 僅文件更動(README / 註解 / 文件,不改程式行為) |
| **style** | 只改格式(lint/排版/縮排/換行),不得改邏輯 |
| **refactor** | 重構(不改外部行為,但改善結構/抽象/可維護性) |
| **perf** | 效能改善(降低耗時/記憶體/查詢次數等) |
| **test** | 新增或修改測試(單元/整合/e2e) |
| **chore** | 工具/依賴/CI/建置腳本調整(不影響產品功能) |
| **revert** | 撤銷/回退先前的 Commit |
## 3. 欄位定義

### 標題 (Title) (Header)
* **必填**(建議不要超過 50 個字元)
* 結尾不加句號。
* 精簡描述本次更動的核心內容。
### 敘述 (Description) (Body)
* **選填**,當標題無法完全說明改動細節時使用,對本次 Commit 的詳細描述,可以分成多行。
* 應包含:
* 為什麼要進行此項更動?
* 解決了什麼問題?
* 調整了哪些主要項目?
* 建議每一行不要超過 72 個字元。
### 腳部 (Footer)
* **非必填(有修復 issue 時必填)**,但若該 Commit 是為了修復特定的 Issue 或任務,則必須附上。
* 格式:`fixed <issue 編號>`
* 例如:如果是修復bugtrace測試人員提出的問題任務,修復完成的Commit需要再下面附上該問題單的編號,(例如:`fixed 0000006`)。

## 4. 範例參考
### feat (新功能)
```text
feat: 新增使用者大頭貼上傳功能
原因:使用者希望在個人頁展示頭像以提升辨識度
調整:
- 新增 /api/users/avatar 上傳端點
- 上傳後將檔案存至 S3,回傳可公開存取的 URL
- 前端新增預覽與上傳進度顯示
```
### fix (修補 Bug)
情境:離開提醒邏輯
```text
fix: 修正表單頁離開時誤觸未保存提醒
問題:
- 新增頁面未輸入內容直接離開仍跳提醒
- 從編輯頁返回列表後,離開列表也會誤跳提醒
原因:初始化時誤將表單標記為 dirty,且返回列表時未解除 unload 監聽
調整:
- dirty 狀態改為「使用者實際輸入」才設為 true
- 於路由切換/元件銷毀時確實移除 unload 事件監聽
fixed 1335
```
情境:信件圖片權限
```text
fix: 修正意見反應信件無法顯示附件圖片
原因:附件路由要求登入驗證,導致 email client 無法存取圖片
調整:意見反應上傳的檔案改為公開讀取(仍保留上傳限制與檔案類型檢查)
fixed 1229
```
### chore (建構程序與輔助工具)
```text
chore: 升級 phpunit 至 0.17
原因:0.16 無法支援 Request GET 帶參數的測試情境
調整:更新相依版本並修正 CI 中的測試指令參數
```
(調整測試結構 + 修 issue)
```text
chore: 調整測試目錄結構並統一後台登入測試基底
調整:
- 新增 tests/unit 與 tests/integration 目錄以區分測試層級
- 新增 AdminTestCase 作為共用登入流程與初始化
fixed 709
```
### style (格式調整)
情境:統一換行符號
```text
style: 統一換行符號為 LF
調整:將專案檔案換行由 CRLF 統一為 LF,避免跨平台 diff 噪音
```
### docs (文件更新範例)
```text
docs: 更新部署手冊,補充 Docker 環境參數說明
新增:
- .env 必填/選填參數表
- 本機與 CI 的範例設定
```
### refactor (重構,不改外部行為)
```text
refactor: 抽離 API 呼叫共用處理至 utils
原因:多個模組重複處理 token、錯誤轉換與 retry,導致維護成本高
調整:
- 將 request 包裝、錯誤 mapping、重試策略集中到 utils
- 保持原 API 介面與回傳格式不變(無功能行為變更)
```
---
## 5. 撰寫原則 (Best Practices)
1. **獨立提交**:不應一次 Commit 所有異動,應根據意義獨立提交。
2. **清楚明瞭**:讓未參與該段程式開發的人也能透過訊息快速理解改動目的。
3. **不要當成 FTP**:Git 是歷史查閱工具,請不要只寫「update」、「save」等無意義訊息。
參考資料:Git Commit Message 這樣寫會更好,替專案引入規範與範例 [https://ithelp.ithome.com.tw/articles/10228738]