在 GitLab 中,Merge Request(合併請求,簡稱 MR) 是協作開發的核心流程,它允許開發者將某個分支的變更請求合併進主要分支(如 main / develop),並經過審查與測試。
✅ 什麼是 Merge Request?
Merge Request(MR)= 你對一個 GitLab 儲存庫提出的「我要合併某個分支變更」的請求。
你可以在 MR 中:
- 查看差異(diff)
- 請其他人 Code Review
- 與 CI/CD 整合,自動測試
- 綁定 Issue、自動關閉任務
📦 完整流程:開發 + 提交 Merge Request
🎯 範例情境:
你要在 GitLab 上新增一個功能,並透過 Merge Request 合併到 main 分支。
✅ 步驟一:從主分支切出新分支
可用 GUI(如 PyCharm)或終端機:
git checkout main # 切回主分支
git pull # 確保是最新的
git checkout -b feature/my-new-feature
✅ 步驟二:開發、提交變更(Commit)
- 編輯檔案
- 提交變更:
git add . git commit -m "新增:XXX 功能"
✅ 步驟三:推送分支到 GitLab
git push origin feature/my-new-feature
📝 第一次推送會建立該分支於 GitLab 上,GitLab 通常會主動提示你建立 Merge Request。
✅ 步驟四:建立 Merge Request(有兩種方式)
🔹 方法一:透過 GitLab 網站建立
- 登入你的 GitLab 專案頁面
- GitLab 通常會出現提示:
A new branch was pushed: feature/my-new-feature → Create Merge Request點下去建立 MR
- 填寫 Merge Request 表單:
- Source branch(來源):
feature/my-new-feature - Target branch(目標):
main或develop - 標題(Title):簡述你做了什麼
- 描述(Description):可附上 Issue、測試方式、影響範圍等
- Reviewer / Assignee:選擇負責 Code Review 的同事
- Source branch(來源):
- 點選 Create Merge Request
🔹 方法二:使用命令列(可選)
若你已安裝 GitLab CLI 工具(如 glab):
glab mr create --source feature/my-new-feature --target main --title "新增 XXX 功能"
✅ 步驟五:等待 Code Review 或測試通過
若你開啟了:
- ✅ 自動化測試(CI/CD Pipeline)
- ✅ 合併條件(如至少一人 Approve)
你可在 MR 頁面查看進度與審查狀況。
✅ 步驟六:合併 Merge Request(Merge)
若你有權限:
- 點擊「Merge」按鈕
- 可選:
Squash commits:合併成一筆 Commit(整潔)Delete source branch:合併後自動刪除分支
🔒 常見 Merge Request 設定(由維護者設置)
| 設定項目 | 說明 |
|---|---|
| Protected Branches | 限制誰可以對 main/develop 合併 |
| Require Approvals | 設定需幾位 Reviewer 通過才可合併 |
| CI/CD Pipelines | 要求測試成功才能合併 |
| Autoclose Issues | 在 MR 描述中寫 Closes #123 自動關閉議題 |
📌 小技巧與習慣建議
| 習慣 | 建議做法 |
|---|---|
| 分支命名 | feature/xxx、bugfix/xxx、hotfix/xxx |
| Commit 訊息風格 | 遵循語義化,例如 feat:、fix:、docs: |
| MR 描述模板 | 可在 GitLab 專案中設定 .gitlab/merge_request_templates/ |
| 與 Issue 關聯 | 在 MR 描述中寫 Closes #issue編號 |
🧪 常見問題與解法
| 問題 | 解法 |
|---|---|
| Merge Request 建立後找不到按鈕合併 | 看是否缺少 Approve / CI 測試未通過 |
| 推送新分支出現錯誤 | 確認是否已綁定遠端、權限是否足夠 |
| 無法推送(非 fast-forward) | 本地分支過時,請 git pull --rebase 後再 push |
| 想要重寫歷史(e.g. squash) | 使用 git rebase -i + force push |