Files
gh-mileschou-claude-marketp…/skills/resolving-conflict/SKILL.md
2025-11-30 08:40:29 +08:00

230 lines
5.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
name: Resolving-Conflict
description: 協助解決 Git Rebase 或 Merge 過程中的衝突,提供系統化的衝突解決流程。
---
# 解決 Git 衝突
協助使用者系統化地解決 Git Rebase 或 Merge 過程中的衝突。
## 核心功能
- 偵測當前的衝突狀態rebase 或 merge
- 列出所有衝突的檔案
- 逐個檢視並解決衝突
- 完成 rebase 或 merge 流程
## 執行步驟
### 1. 偵測衝突狀態
檢查當前是否處於衝突狀態:
```bash
git status
```
確認是 rebase 還是 merge 衝突:
- Rebase: 會顯示 `rebase in progress`
- Merge: 會顯示 `You have unmerged paths`
### 2. 列出衝突檔案
使用以下指令列出所有衝突的檔案:
```bash
git diff --name-only --diff-filter=U
```
或從 git status 中擷取:
```bash
git status --short | grep "^UU\|^AA\|^DD\|^AU\|^UA\|^UD\|^DU"
```
### 3. 解決衝突
對於每個衝突的檔案:
1. **讀取檔案內容**
- 使用 Read tool 檢視衝突標記
- 識別衝突區塊(`<<<<<<<`, `=======`, `>>>>>>>`
2. **展示衝突資訊**
- **IMPORTANT**: 在詢問使用者前,必須先清楚展示衝突的詳細內容
- 明確標示雙方的修改內容
- 說明衝突發生的位置和原因
- 範例格式:
```
檔案src/example.ts
衝突位置:第 10 行
衝突內容比對:
<<<<<<< HEAD (當前分支)
const value = "version A"
=======
const value = "version B"
>>>>>>> 合併進來的分支
```
3. **使用 AskUserQuestion 提供解決選項**
- 列出所有可能的解決方案
- 對於簡單衝突,提供:
- 保留當前分支版本ours
- 採用合併進來的版本theirs
- 對於需要手動整合的情況,明確列出所有組合:
- 方案 A + 方案 B
- 方案 B + 方案 A
- 其他自訂組合
- 讓使用者基於完整資訊做出選擇
4. **執行解決**
- 使用 Edit tool 根據使用者選擇移除衝突標記
- 保留或整合正確的程式碼
5. **標記為已解決**
```bash
git add <檔案路徑>
```
### 4. 完成流程
所有衝突解決後:
**Rebase:**
```bash
git rebase --continue
```
如果遇到「You must edit all merge conflicts」錯誤可能是索引狀態不一致使用以下方式重置
```bash
git reset && git add <已解決的檔案> && git rebase --continue
```
**Merge:**
```bash
git commit
```
如果需要放棄:
- Rebase: `git rebase --abort`
- Merge: `git merge --abort`
## 使用場景
### 適用情境
- 執行 `git rebase` 時遇到衝突
- 執行 `git merge` 時遇到衝突
- 需要系統化地處理多個衝突檔案
- 不確定如何正確解決衝突
### 處理策略
**簡單衝突:**
- 完全採用一方的修改ours 或 theirs
- 直接使用對應策略:
```bash
git checkout --ours <檔案> # 保留當前分支的版本
git checkout --theirs <檔案> # 採用合併進來的版本
```
**複雜衝突:**
- 需要手動合併雙方的修改
- 仔細檢視衝突區塊的上下文
- 整合兩邊的邏輯變更
## 工作流程範例
```
[執行 rebase 時遇到衝突]
User: 我在 rebase 時遇到衝突了,幫我解決。
Agent: 偵測到 rebase 衝突,有 2 個檔案需要解決:
1. src/auth/login.ts
2. README.md
開始解決第一個衝突...
檔案src/auth/login.ts
衝突位置:第 15 行
衝突內容比對:
<<<<<<< HEAD (當前分支)
if (user.verified) {
return authenticateUser(user)
}
=======
if (user.isVerified && user.active) {
return authenticate(user)
}
>>>>>>> feature/new-auth
Agent: [使用 AskUserQuestion]
要如何解決這個衝突?
選項:
1. 保留當前版本user.verified
2. 採用新版本user.isVerified && user.active
3. 整合:保留 isVerified 和 active 檢查,使用 authenticateUser
4. 其他自訂方案
User: [選擇選項 3]
Agent: 已解決 login.ts 並標記為已解決。
繼續處理 README.md...
[展示衝突並詢問]
User: [選擇保留雙方的文件更新]
Agent: 所有衝突已解決,執行 git rebase --continue
Rebase 成功完成!
User: [確認結果並繼續開發]
```
## 注意事項
### 安全檢查
- **資訊透明化**:在詢問使用者前,務必先展示完整的衝突內容和上下文
- **明確選項**:提供所有可能的解決方案,包括手動整合的不同組合方式
- 解決衝突前先確認了解雙方的修改意圖
- 不確定時使用 AskUserQuestion 詢問使用者應該保留哪個版本
- 解決後建議執行測試確保功能正常
### 常見錯誤
**避免:**
- 未展示衝突詳細內容就直接詢問使用者如何解決
- 手動整合選項不夠明確(例如只提供「整合雙方」而不列出具體組合方式)
- 直接刪除所有衝突標記而不檢視內容
- 未理解程式碼脈絡就決定保留哪個版本
- 解決衝突後未執行測試
**推薦:**
- 先展示完整的衝突資訊,再使用 AskUserQuestion 提供明確選項
- 列出所有可能的解決方案,包括不同的整合順序
- 仔細閱讀衝突區塊的上下文
- 理解兩個版本的差異原因
- 可能的話整合雙方的優點
- 解決後執行相關測試
### 特殊情況
**二進位檔案衝突:**
```bash
# 只能選擇其中一個版本
git checkout --ours <二進位檔案>
# 或
git checkout --theirs <二進位檔案>
```
**檔案刪除衝突:**
- 一方修改,一方刪除
- 需要判斷是否應該保留或刪除該檔案
## 整合其他工具
解決衝突後建議:
- 使用 `reviewers:requesting-code-review` 檢視解決方案
- 執行專案的測試套件