A.4 GitHub 協作:Pull Request、Code Review、Issue#
從本地端到雲端:GitHub 是什麼#
Git 是版本控制系統,而 GitHub 是建立在 Git 之上的雲端協作平台。它提供了遠端版本倉的託管服務,更重要的是,它圍繞著 Git 建立了一整套團隊協作的工作流程。GitHub 上的專案稱為 repository(版倉),任何人都可以建立自己的版倉來存放程式碼。
要開始使用 GitHub,你需要:
- 在 github.com 註冊帳號
- 在本機設定 Git 使用者資訊(只需設定一次):
git config --global user.name "你的名字"
git config --global user.email "你的電子郵件"
連結本地版倉與遠端版倉#
假設你在 GitHub 上建立了一個空版倉 my-project,可以將它與本地的 Git 版倉連結:
# 方法一:先建立版倉再連結
git remote add origin https://github.com/你的帳號/my-project.git
# 方法二:從 GitHub 複製(clone)版倉
git clone https://github.com/你的帳號/my-project.git
origin 是遠端版倉的預設名稱。你可以用 git remote -v 確認連結:
git remote -v
推送與拉取:push、pull、fetch#
將本地的提交推送到 GitHub:
git push origin main
從 GitHub 拉取最新的變更到本地:
git pull origin main
git pull 其實等同於 git fetch(只下載變更)加上 git merge(合併到本地分支)。如果你想要先看看遠端有哪些變更再決定是否合併,可以分兩步執行:
git fetch origin
git log origin/main --oneline # 先檢視遠端的變更
git merge origin/main # 確認後再合併
分叉與 Pull Request 的工作流程#
在 GitHub 的協作中,你不直接將變更推送到別人的版倉,而是透過 Fork(分叉) 和 Pull Request(拉取請求) 的機制。完整流程如下:
- Fork:在 GitHub 上點擊版倉頁面的「Fork」按鈕,將別人的版倉複製一份到你的帳號下。
- Clone:將你 Fork 後的版倉 clone 到本地端。
- 建立分支:在本地建立功能分支。
- 開發並提交:在功能分支上工作,完成後推送。
- 建立 Pull Request:在 GitHub 上將你的功能分支提交合併請求到原始版倉。
- Code Review:團隊成員審查你的程式碼。
- 合併:審查通過後,維護者將你的變更合併到主線。
操作範例:
# Fork 版倉後,clone 到本地
git clone https://github.com/你的帳號/original-project.git
cd original-project
# 建立功能分支
git checkout -b feature/add-login
# 開發並提交
echo "login functionality" > login.py
git add .
git commit -m "新增登入功能"
# 推送到你 Fork 的遠端版倉
git push origin feature/add-login
然後到 GitHub 上的版倉頁面,你會看到一個「Compare & pull request」的提示,點擊後填寫標題和說明,提交 Pull Request。
Code Review 的意義#
Code Review(程式碼審查) 是 Pull Request 流程中最關鍵的環節。它不只是找 Bug,更是一個知識分享和品質保證的過程。在 Code Review 中,審查者會關注:
- 正確性:程式碼是否正確實現了預期功能?
- 可讀性:程式碼是否容易理解?命名是否恰當?
- 安全性:是否有資安漏洞(如 SQL injection、硬編碼密碼)?
- 效能:是否有不必要的效能浪費?
- 一致性:是否符合團隊的程式碼風格規範?
在 GitHub 上,審查者可以直接在 Pull Request 的特定行數上留下評論。你可以使用 Suggested Changes 功能直接建議修改,提交者只需點擊「Commit suggestion」就能接受建議。
Code Review 的禮儀#
- 對事不對人:批評程式碼,不要批評人。
- 說明原因:不只指出問題,也要解釋為什麼這是問題。
- 肯定優點:好的程式碼值得讚賞,不要只挑毛病。
- 及時回覆:收到審查意見後儘快回覆,避免阻礙團隊進度。
Issue:專案的任務管理#
GitHub 的 Issue 功能是輕量級的任務追蹤系統。每一個 Issue 是一個討論串,可以用來:
- 報告 Bug
- 提出新功能需求
- 討論技術方案
- 記錄待辦事項
Issue 支援 Label(標籤) 來分類,例如 bug、enhancement、documentation。也可以指派(assign)給特定成員,並設定里程碑(milestone)來追蹤進度。
一個好的 Issue 應該包含:
- 清楚的標題:簡潔描述問題或需求
- 重現步驟(如果是 Bug 報告)
- 預期行為 vs 實際行為
- 環境資訊(作業系統、瀏覽器版本、程式語言版本等)
連結 Issue 與 Pull Request#
在提交訊息或 Pull Request 描述中寫入 Fixes #123,當這個 Pull Request 被合併後,Issue #123 會自動關閉。這能讓你的開發歷史與任務追蹤保持同步。
git commit -m "修正登入表單驗證邏輯,Fixes #42"
一個完整的協作場景#
假設你和兩位同學要合作開發一個課程專案,以下是建議的工作流程:
- 由一位組員建立 GitHub 版倉並設為組織(Organization)或使用 GitHub Classroom。
- 所有組員 Fork 版倉到自己的帳號。
- 每位組員在本地 clone 自己 Fork 後的版倉。
- 從
main建立功能分支,完成後向原始版倉提交 Pull Request。 - 至少一位組員進行 Code Review 後才合併。
- 每天下班前執行
git pull同步最新的變更。
想一想#
- 為什麼 GitHub 不直接讓你推送到別人的版倉,而要透過 Fork + Pull Request 的機制?這樣做有什麼好處?
- 如果你在 Code Review 中發現同事的程式碼有嚴重的安全問題,但對方堅持不改,你該怎麼處理?
- Issue 和 Pull Request 可以互相連結,這對大型專案的維護有什麼幫助?
本章小結#
本章介紹了 GitHub 協作的核心流程:從連結遠端版倉、推送與拉取變更,到 Fork + Pull Request 的工作模式。我們也探討了 Code Review 的意義與實踐方式,以及 Issue 作為任務管理工具的用法。這些協作技能將是你在團隊專案中不可或缺的能力。下一章我們將學習如何用 GitHub Actions 實現自動化的 CI/CD 管線。