# Commit Push

> 協助產生符合專案規範的提交訊息，並推送到遠端儲存庫。

- Skill: `mileschou/commit-push` (Agent Skill)
- Install (CLI): `npx skillmds@latest add mileschou/commit-push`
- Raw SKILL.md: https://api.skillmd.com/api/skills/mileschou/commit-push/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: MilesChou (https://skillmd.com/u/mileschou)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/mileschou/commit-push

---


協助產生符合專案規範的提交訊息，並推送到遠端儲存庫。

## 工作目錄資訊

將所有檔案重新設定成追蹤清單：

```
!`git add -N .`
```

檔案變更與暫存狀態的清單：

```
!`git status --short`
```

檔案變更的詳細內容：

```
!`git diff`
```

最近五筆提交訊息：

```
!`git log --oneline -5`
```

分支資訊：

- **遠端主要分支**： !`git symbolic-ref refs/remotes/origin/HEAD`
- **當前分支**： !`git branch --show-current`

所有分支清單：

```
# 本地分支
!`git branch`

# 遠端分支
!`git branch -r`
```

## 流程

### 步驟 1：分析工作目錄資訊

分析「工作目錄資訊」中收集到的變更狀態，使用一次 AskUserQuestion 工具同時確認：
1. 要提交的檔案範圍（是否符合提交原子性）
2. 目標推送分支

#### 1-1. 檔案變更狀態

分析工作目錄的變更，判斷是否符合提交原子性：

**符合原子性**：所有變更都屬於同一個邏輯修改
- 不使用 AskUserQuestion 詢問檔案範圍
- 只詢問目標推送分支
- 直接提交所有變更

**違反原子性**：包含多個不相關的修改
- 依 Conventional Commits 類型分類檔案：
    - `feat:` 新功能
    - `fix:` 修復問題
    - `docs:` 文件更新
    - `style:` 程式碼格式調整
    - `refactor:` 重構
    - `test:` 測試
    - `chore:` 建置或輔助工具

- 輸出分類後的預計 commit message 和前三個重要檔案：
  ```
  1. feat: [commit message]
     - [檔案路徑]
     - [檔案路徑]
     - [檔案路徑]
  2. docs: [commit message]
     - [檔案路徑]
  ```

- 在 AskUserQuestion 中提供複選選項，讓使用者選擇要提交哪些分類

#### 1-2. 分支狀態

在 AskUserQuestion 中提供分支選項：
- **當前分支** - 在目前的分支上提交並推送
- **其他可能的分支** - 根據修改內容推測相關的分支名稱

若使用者手動輸入的分支名稱不存在，則建立新分支。

**注意：除非必要，否則不要提供「切換到新的分支」的選項**

#### 1-3. AskUserQuestion 範例

同時詢問檔案範圍和目標分支，例如：

**問題 1**：要提交哪些變更？
- 選項：`[feat: 新增登入功能]` / `[docs: 更新 README]`

**問題 2**：要推送到哪個分支？
- 選項：`[當前分支: main]` / `[branch1]` / `[branch2]`

**IMPORTANT**：在使用 AskUserQuestion 工具時，若使用者沒有回答或回答空白選項，則必須重新確認

### 步驟 2：產生提交訊息

根據記憶中的提交訊息格式偏好產生提交訊息，若無特別指示則使用 **Conventional Commits** 規範：

#### 基本格式

```
<type>(<scope>): <subject>

<body>
```

- `type`: 提交類型（feat, fix, docs, style, refactor, test, chore）
- `scope`: 影響範圍（選填）
- `subject`: 簡短描述（50 字以內）
- `body`: 詳細說明（選填，使用 bullet points）

範例

```
feat(auth): 新增登入驗證功能

- 實作 email 驗證邏輯
- 加入驗證碼過期檢查
- 更新相關單元測試
```

### 步驟 3：執行提交與推送

#### 3-1. 加入檔案

先重置暫存區：

```bash
git reset .
```

然後根據步驟 1 使用者選擇的檔案範圍，使用 `git add` 加入檔案。

#### 3-2. 提交

使用步驟 2 產生的提交訊息執行 commit：

```bash
git commit -m <提交訊息>
```

#### 3-3. 推送

推送到使用者選擇的分支：

```bash
git push -u origin <分支名稱>
```

## 注意事項

### 提交原則
- 每個提交應保持原子性，只包含相關的變更
- 提交訊息應清楚描述變更內容和原因

### 錯誤處理
- 執行指令偶爾會出現 `.git/index.lock` 鎖定的錯誤，當指令提示詞正常啟動後，可以忽略這個錯誤
- 遇到其他任何錯誤時立即停止，回報錯誤訊息給使用者

