【GitHub Flow 教學】#04 合併與部署:從 PR 到上線

測驗:GitHub Flow – 合併與部署

共 5 題,點選答案後會立即顯示結果

1. 在 GitHub 上合併 PR 之前,需要確認哪些條件都通過?

  • A. 只需要 CI 測試通過即可
  • B. 只需要有人審核批准即可
  • C. 只需要沒有合併衝突即可
  • D. CI 通過、審核批准、無衝突,三者都要滿足

2. 「Squash and merge」合併策略的特點是什麼?

  • A. 保留所有 commit 歷史,產生一個合併點
  • B. 把 feature 分支的所有 commit 壓成一個
  • C. 把 commit 複製一份接在 main 後面,形成直線
  • D. 自動刪除所有 commit 歷史

3. 合併 PR 後,為什麼建議刪除 feature 分支?

  • A. 因為刪除分支可以加快程式執行速度
  • B. 因為分支刪除後才能部署上線
  • C. 因為工作已完成,避免分支越積越多,且 main 已有這些程式碼
  • D. 因為 GitHub 強制要求刪除分支

4. 在 CI/CD 流程中,CI(持續整合)的主要功能是什麼?

  • A. 自動部署程式碼到伺服器
  • B. 每次推程式碼時自動跑測試
  • C. 自動合併所有 PR
  • D. 自動建立新分支

5. 當遇到合併衝突時,以下哪個描述是正確的?

<<<<<<< feature-branch return "Hello, World!" ======= return "Hi, World!" >>>>>>> main
  • A. <<<<<<<>>>>>>> 之間的內容會自動被刪除
  • B. ======= 上方是 main 的版本
  • C. 衝突標記會由 GitHub 自動解決
  • D. 需要手動決定保留哪個版本,並刪除衝突標記

一句話說明

把審核通過的程式碼合併到 main 分支,然後部署上線。

這篇教你看懂什麼

讀完這篇,你能看懂:

  • 合併前要檢查什麼
  • Merge、Squash、Rebase 三種合併按鈕的差別
  • 合併後為什麼要刪除分支
  • GitHub Flow 怎麼跟自動部署配合

合併前的檢查清單

在 GitHub 上看到 PR 頁面,合併前確認這些:

+------------------------+
|  Pull Request #42      |
+------------------------+
| Status Checks          |
| [x] CI passed          |  <-- 自動測試要過
| [x] Review approved    |  <-- 要有人批准
| [x] No conflicts       |  <-- 不能有衝突
+------------------------+
| [Merge pull request]   |  <-- 全部綠勾才能點
+------------------------+
Code language: PHP (php)

翻譯

  • CI passed:自動化測試跑過了,程式碼沒有明顯 bug
  • Review approved:至少一個人看過並批准
  • No conflicts:你的修改跟 main 分支沒有衝突

三種合併策略

點「Merge pull request」旁邊的箭頭,會看到三個選項:

選項 1:Create a merge commit(預設)

main:    A---B-----------M
              \         /
feature:       C---D---E

翻譯:保留所有 commit 歷史,產生一個合併點 M。

適合場景

  • 大部分情況都用這個
  • 想保留完整開發過程

選項 2:Squash and merge

main:    A---B---S

feature:       C---D---E  (這些會被壓成一個 S)
Code language: HTTP (http)

翻譯:把 feature 分支的所有 commit 壓成一個。

適合場景

  • commit 太多太雜亂
  • 只想保留「做了什麼」,不需要「怎麼做的」

選項 3:Rebase and merge

main:    A---B---C'---D'---E'

feature:       C---D---E  (複製一份接到 B 後面)
Code language: HTTP (http)

翻譯:把 feature 的 commit 複製一份,接在 main 後面,變成直線。

適合場景

  • 想要乾淨的直線歷史
  • 需要進階 Git 知識

常見選擇指南

情況 建議選擇 原因
不知道選什麼 Merge commit 最安全,保留全部歷史
修改很小(1-3 commits) Squash 合成一個更清楚
commit 很亂有很多「fix typo」 Squash 清理掉雜亂歷史
想要直線歷史 Rebase 但要確定沒人在用這分支

實際操作:合併 PR

步驟 1:確認檢查都通過

看到這個畫面才能合併:

All checks have passed
2 successful checks

Review required
Changes approved
1 approving review

This branch has no conflicts with the base branch
Code language: JavaScript (javascript)

步驟 2:選擇合併方式

點綠色按鈕旁邊的下拉箭頭,選擇策略(通常用預設就好)。

步驟 3:點「Merge pull request」

+----------------------------------+
| Merge pull request               |
+----------------------------------+
| Add a title (optional)           |
| [Merge pull request #42]         |
|                                  |
| Add a description (optional)     |
| [                              ] |
|                                  |
| [Confirm merge]                  |
+----------------------------------+
Code language: PHP (php)

步驟 4:刪除分支

合併後會出現:

Pull request successfully merged and closed

[Delete branch]  <-- 點這個
Code language: CSS (css)

為什麼要刪除?

  • 這個分支的工作已經完成
  • 避免分支越積越多
  • main 已經有這些程式碼了

GitHub Flow 與 CI/CD

什麼是 CI/CD

CI(持續整合)           CD(持續部署)
    |                        |
    v                        v
[程式碼推送] --> [自動測試] --> [自動部署]

翻譯

  • CI:每次推程式碼,自動跑測試
  • CD:測試通過後,自動部署到伺服器

GitHub Flow + CI/CD 流程

1. 開分支改程式碼
        |
        v
2. 推到 GitHub,開 PR
        |
        v
3. CI 自動跑測試  <-- 自動的
        |
        v
4. 審核通過,合併到 main
        |
        v
5. CD 自動部署上線  <-- 自動的

在 GitHub 上看起來像這樣

Pull Request #42

Checks
+----------------------------------+
| [x] build (3m 42s)               |
| [x] test (5m 18s)                |
| [x] lint (1m 03s)                |
+----------------------------------+

^^ 這些都是 CI 自動跑的
Code language: PHP (php)

合併後:

GitHub Actions

deploy (2m 15s) - completed  <-- CD 自動部署

常見問題:合併衝突

什麼時候會發生

你改 A 檔案的第 10 行,同時別人也改了第 10 行,而且先合併了。

This branch has conflicts that must be resolved

Conflicting files:
- src/app.py

怎麼看懂衝突標記

GitHub 會顯示:

def greeting():
<<<<<<< feature-branch
    return "Hello, World!"
=======
    return "Hi, World!"
>>>>>>> main
Code language: JavaScript (javascript)

翻譯

  • <<<<<<< feature-branch:你的版本開始
  • =======:分隔線
  • >>>>>>> main:main 的版本
  • 你要決定保留哪個(或合併兩個)

解決衝突

  1. 點「Resolve conflicts」
  2. 手動編輯,決定要保留什麼
  3. 刪掉 <<<<<<<=======>>>>>>> 標記
  4. 點「Mark as resolved」
  5. 點「Commit merge」

Vibe Coder 檢查點

合併 PR 時確認:

  • [ ] CI 測試都通過了嗎?(綠勾)
  • [ ] 有人審核並批准了嗎?
  • [ ] 沒有合併衝突嗎?
  • [ ] 合併後刪除分支了嗎?

看到合併衝突時確認:

  • [ ] 知道 <<<<<<<>>>>>>> 之間是什麼嗎?
  • [ ] 決定好要保留哪個版本了嗎?
  • [ ] 刪除衝突標記了嗎?

系列回顧:GitHub Flow 完整流程

1. 從 main 開分支
   git checkout -b feature-xxx
        |
        v
2. 在分支上開發
   git add . && git commit
        |
        v
3. 推送並開 PR
   git push -u origin feature-xxx
        |
        v
4. 程式碼審查
   同事看程式碼、留評論、批准
        |
        v
5. 合併到 main(本篇重點)
   點 Merge pull request
        |
        v
6. 刪除分支
   點 Delete branch
        |
        v
7. 自動部署(如果有設定)

恭喜你學完 GitHub Flow!

這就是業界最常用的協作流程。重點是:

  • main 永遠保持可部署狀態
  • 所有修改都透過 PR 進行
  • 每個 PR 都要經過審核

延伸:知道就好

這些進階功能遇到再查:

  • Protected branches:保護 main 不被直接 push
  • Required reviewers:強制要求特定人審核
  • Status checks:設定必須通過的 CI 檢查
  • Auto-merge:審核通過後自動合併

進階測驗:GitHub Flow – 合併與部署

測驗目標:驗證你是否能在實際情境中應用所學。
共 5 題,包含情境題與錯誤診斷題。

1. 你的 PR 有 20 個 commit,其中很多是「fix typo」、「update」這類小修正。團隊希望 main 的歷史保持乾淨,你應該選擇哪種合併策略? 情境題

  • A. Create a merge commit – 保留完整歷史比較好追蹤
  • B. Squash and merge – 把所有 commit 壓成一個,清理雜亂歷史
  • C. Rebase and merge – 讓歷史變成直線
  • D. 不合併,先手動整理 commit 再開新 PR

2. 同事小美想合併她的 PR,但 GitHub 顯示以下訊息。她應該先做什麼? 錯誤診斷

This branch has conflicts that must be resolved Conflicting files: – src/config.js
  • A. 直接點 Merge pull request,GitHub 會自動解決
  • B. 請同事先審核批准
  • C. 點 Resolve conflicts,手動編輯決定保留哪個版本
  • D. 刪除這個 PR,重新建立一個新的

3. 你的團隊剛導入 CI/CD,PR 頁面顯示以下狀態。這代表什麼意思? 情境題

Checks +———————————-+ | [x] build (3m 42s) | | [x] test (5m 18s) | | [ ] lint (failed) | +———————————-+
  • A. 所有檢查都通過了,可以合併
  • B. 只有 lint 檢查失敗,但不影響功能,可以合併
  • C. 需要等 lint 完成才能看結果
  • D. lint 檢查失敗了,應該先修正程式碼風格問題再合併

4. 小明在解決合併衝突時,看到以下程式碼。他想要同時保留兩個功能,應該怎麼處理? 錯誤診斷

def greeting(name): <<<<<<< feature-branch return f"Hello, {name}! Welcome!" ======= return f"Hi, {name}!" >>>>>>> main
  • A. 保留 <<<<<<<======= 之間的程式碼
  • B. 手動合併兩個版本的功能,並刪除所有衝突標記
  • C. 只保留 =======>>>>>>> 之間的程式碼
  • D. 在 GitHub 上按 Accept both changes 按鈕

5. 團隊想要確保 main 分支永遠保持可部署狀態,以下哪個做法最符合 GitHub Flow 的精神? 情境題

  • A. 讓每個人都能直接 push 到 main,加快開發速度
  • B. 每週五統一合併所有 PR 到 main
  • C. 所有修改都透過 PR 進行,每個 PR 都要經過審核和 CI 測試
  • D. 建立多個長期分支,只在 release 時才合併到 main

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *