GitHub工作流

一句話定義

把每個改動隔離在 feature branch、透過 PRreview 進主分支、用 squash-merge 維持主分支歷史簡潔的標準 Git 協作流程;個人專案 / 開源專案 / 公司專案皆通用,是 add commit push 一把梭直推主分支的反模式。

核心要點

元命題

主分支屬於專案 / feature branch 屬於個人」——即使同一人持有兩者,這兩個分支扮演不同角色。流程的整個設計都圍繞這個角色分離。

Remote / Local Git / Disk 三層心智模型

教學版本把本地拆兩層,這樣三個事實能各自定位(2026-05-01-十分鐘GitHub工作流 教程版):

角色你看到什麼
RemoteGitHub 上的共享倉庫別人也看得到的 branch、PR、issue
Local Git本地 .git/ 目錄告訴 Git 的所有資訊——commit 歷史、本地 branch
Disk工作目錄的檔案編輯器打開時看到的原文件實際樣貌

三層分離才能解釋這些日常困惑:

  • 「我改了檔案但 Git 不知道」 → 改動只在 Disk,沒進 Local Git
  • 「我 commit 了但 GitHub 沒變」 → 改動只在 Local Git,沒 push 到 Remote
  • git checkout main 後我的修改不見了」 → checkout 把 Local Git 的 branch 同步給 Disk,你的 myfeature 改動還在 Local Git 裡

正規版本還有 staging area(暫存區)作為 Local Git 與 Disk 之間的緩衝層,是 git add 的目的地;教程刻意省略以降低新手認知負擔。

七步 Happy Path

從 clone 到 PR 的完整正向流程:

#命令作用同步狀態
1git clone <url>Remote → Local Git → Disk三層一致
2git checkout -b myfeature從當前 branch 複製出新 feature branchLocal Git 多一個 branch
3編輯檔案 → git diff強烈建議下一步前先 diffDisk 改動,Local Git 未知
4git add <files>改動進暫存區(告訴 Git「這些我想 commit」)Local Git 半知道
5git commit真正寫進 Local GitLocal Git 多一個 commit
6git push origin myfeatureLocal Git → RemoteGitHub 多一個 branch
7在 GitHub 介面建 [[Pull-RequestPR]]請求把 myfeature 改動 pull 進 main

同步 main 更新(Rebase 流)

當你還在 feature branch 開發時,main 又有新 commit 進來,要把新 main 整合到你的 feature branch:

  1. git checkout main — 切回 main,Disk 變回 main 的狀態
  2. git pull origin main — 把遠端 main 同步到本地 main + Disk
  3. git checkout myfeature — 切回你的 feature branch
  4. git rebase main — 把你的 commit 先扔旁邊 → 套上最新 main → 再把你的 commit 接回去
  5. git push origin myfeature -f — rebase 改寫了歷史,必須 -f(force)才能推回

遇到 rebase conflict:手動選擇要哪一段代碼,解完 → git addgit rebase --continue

Rebase 而非 Merge 的好處

操作feature branch 看起來像main 歷史
Rebase main在最新的 main 上做的」(線性)乾淨、像一個人寫的
Merge main保留分叉,多一個 merge commit多分叉、雜訊較高

rebase 後 commit hash 會改變,這是必須 push -f 的原因(強推遠端覆蓋本地改寫過的歷史);故 rebase 適合自己的 feature branch(沒人依賴你的 hash)/ 不適合公開的長壽 branch(會打亂他人本地)

Pull Request 與 Squash-Merge

PR = 「請項目主人把我這個分支的改變給 pull 到專案裡去」——詳見 Pull-Request

合併 PR 時 GitHub 提供三種策略,預設選擇是 Squash and Merge

策略feature branch 多個 commit 進 main 後變成何時用
Squash and Merge一個 clean commit預設——main 每個 commit 都正常工作
Create a Merge Commit全部保留 + 一個 merge commit想保留 feature 開發過程歷史
Rebase and Merge全部保留為線性追加開發過程已是乾淨的 commit-by-commit 故事

為何預設 squash:feature branch 上常有「fix typo / 格式調整 / debug 嘗試 / WIP」等雜訊 commit;這些不該污染 main。目標:main 上每個 commit 都是正常工作的——這是 main 可以隨時 deploy / 隨時 checkout 任何點都不壞的根據。

PR 合併後的清理三步

很多人忽略的尾巴:

  1. GitHub 上按「Delete branch」按鈕刪遠端 feature branch
  2. 本地git checkout maingit branch -d myfeature 刪本地 branch
  3. 本地git pull origin main 把剛被 squash 進的 update 同步回本地 main + Disk

完成後 Local Git / Disk / Remote 三者再次完全一致,回到 clone 後的乾淨狀態。

反模式:add commit push 一把梭直推 main

許多新手習慣 git add . && git commit && git push 直接打到 main。教程明確指出:

「在任何一個有一點點成熟度的項目裡,都不可能讓所有的程序員都在那 add commit push 一把梭——這種工作流程會讓你的項目管理崩潰的。」

直推 main 的問題:(a) 一個壞 commit 直接弄壞所有人;(b) 沒有 review 流程;(c) commit 歷史成雜訊;(d) 多人推同一 branch 必然衝突 / 重做。

與其他概念的關係

  • Pull-Request — 是本工作流的核心介面層;不是 Git 原生功能而是 GitHub / GitLab / Bitbucket 等託管平台在 Git 之上加的 review + 合併機制。
  • Code-Review — 是本工作流的品質治理層:feature branch 和 PR 提供場域,reviewer 判斷這個改動是否真的改善 codebase health。
  • Git — 本工作流是 Git 命令的具體編排:clone / checkout -b / diff / add / commit / push / pull / rebase / branch -d 的 happy path 串起來;branch 廉價(O(1) 指標)是這套流程能成立的基礎。
  • GitHub — PR 介面 + Squash and merge / Delete branch 按鈕是這套工作流的 UI 元件;不用 GitHub(GitLab / Bitbucket / Gitea)也有同名 / 同形式的介面。
  • AI輔助開發 — feature branch 隔離 + diff 檢查 + PR review 是 AI agent(如 Claude-Code)大量產出代碼時的安全網與技術債閘門;本工作流是 AI 輔助開發進入成熟團隊的前置紀律。
  • 程式碼風格指南 — PR 是 style guide 的最後一道把關:再短的指南也需要在 PR review 時被人或 hook 確認;squash-merge 的「main 每個 commit 都正常工作」原則直接對位 程式碼風格指南 Golden Rule「每一行程式都看起來像同一個人寫的」——squash 把多人 / 多次嘗試的雜訊收斂成單一作者外觀。

相關來源

  • 2026-05-01-十分鐘GitHub工作流 — vault 中第一份系統處理 GitHub 工作流的來源;以「Remote / Local Git / Disk」三層心智模型 + 七步 happy path + rebase 同步流 + squash-merge + 清理三步介紹完整流程
  • 2026-05-06-Google-Code-Review — 補入 PR review 的品質判準、速度要求與 comment 溝通規則,讓本工作流從操作流程擴展到工程治理

備註

建頁理由:作為 Git / GitHub 在實際協作場景下的標準操作流程,比兩個 entity 更高一層的方法論;獨立成概念而非併入任一 entity。理由:(1) 是跨工具的方法論(GitHub Flow / GitLab Flow / Gitea PR 工作流形式都類似);(2) 是 AI輔助開發 場景的關鍵前置紀律;(3) 累積方向多元(替代工作流 git-flow / trunk-based / monorepo 對位、conventional commits 等規範對位、AI agent 自動 PR 流程的具體用例)。

未來累積方向:(a) 與 git-flow / trunk-based development / monorepo 工作流對位;(b) Conventional Commits / semantic-release 等命名規範累積;(c) Branch protection rules / CODEOWNERS / required reviews 等治理層;(d) Stacked PRs / Graphite / Spr 等進階流程工具;(e) AI agent(Claude-Code / Cursor / Aider)自動發 PR 的具體用例累積;(f) 開源專案如何用此工作流接受外部 PR(CONTRIBUTING.md / Issue Templates / DCO 簽署等)。