目錄
什麼是 Fork?
Fork 是 GitHub 的核心功能之一,用於複製整個專案到你自己的帳號下。
基本概念
原專案 (Upstream)
facebook/react
↓ Fork(複製)
你的 Fork (Origin)
你的帳號/react
特點:
- ✅ 完整複製整個專案(包含所有歷史記錄)
- ✅ 在你的帳號下獨立存在
- ✅ 你可以自由修改,不影響原專案
- ✅ 保持與原專案的關聯(可以同步更新)
為什麼要 Fork?
主要使用情境
1. 貢獻開源專案
發現 bug 或想新增功能
↓ Fork 專案
↓ 在自己的版本修改
↓ 建立 Pull Request
↓ 原作者審核並合併
2. 客製化修改
某個工具很好用,但你需要特殊功能
↓ Fork 專案
↓ 加入自己的修改
↓ 使用你的客製化版本
3. 學習研究
想深入學習某個專案的程式碼
↓ Fork 專案
↓ 自由實驗和修改
↓ 不用擔心弄壞原專案
4. 備份專案
擔心原專案被刪除或改變
↓ Fork 保存一份副本
↓ 即使原專案消失,你的 Fork 仍存在
Fork 的完整流程
階段一:Fork 專案
在 GitHub 網頁操作
1. 進入想要 Fork 的專案頁面
例如:https://github.com/facebook/react
2. 點擊右上角的 "Fork" 按鈕
3. 選擇要 Fork 到哪個帳號(如果有多個組織)
4. 等待複製完成(幾秒鐘)
5. 完成!現在你有自己的副本
https://github.com/你的帳號/react
此時的狀態:
原專案:facebook/react ← 完全不受影響
你的 Fork:你的帳號/react ← 新建立的副本
階段二:Clone 到本地
# 1. 複製你的 Fork 的網址
# 在你的 Fork 頁面點擊綠色的 "Code" 按鈕
# 2. Clone 到本地電腦
git clone https://github.com/你的帳號/react.git
# 3. 進入專案目錄
cd react
# 4. 查看 remote(這時只有 origin)
git remote -v
# origin https://github.com/你的帳號/react.git (fetch)
# origin https://github.com/你的帳號/react.git (push)
此時的狀態:
原專案:facebook/react
你的 Fork:你的帳號/react
你的本地:~/react ← 新增
階段三:設定 Upstream(追蹤原專案)
# 新增原專案為 upstream
git remote add upstream https://github.com/facebook/react.git
# 驗證設定
git remote -v
# origin https://github.com/你的帳號/react.git (fetch)
# origin https://github.com/你的帳號/react.git (push)
# upstream https://github.com/facebook/react.git (fetch)
# upstream https://github.com/facebook/react.git (push)
名詞解釋:
- origin:你的 Fork(預設名稱)
- upstream:原專案(慣例名稱)
階段四:修改程式碼
# 1. 建立新分支(最佳實踐)
git checkout -b fix-bug-123
# 2. 修改程式碼
vim src/components/Button.js
# 3. 查看修改
git status
git diff
# 4. 加入暫存區
git add src/components/Button.js
# 5. Commit
git commit -m "修復 Button 元件的點擊事件 bug"
此時的狀態:
原專案:facebook/react ← 完全不知道你在改什麼
你的 Fork:你的帳號/react ← 還沒更新
你的本地:~/react ← 已修改並 commit
階段五:Push 到你的 Fork
# Push 到你的 Fork
git push origin fix-bug-123
⚠️ 重要觀念:這個步驟只影響你的 Fork!
原專案:facebook/react ← 完全不受影響,不會收到任何通知
你的 Fork:你的帳號/react ← ✅ 已更新
你的本地:~/react ← 保持同步
原專案此時:
- ❌ 不知道你做了修改
- ❌ 不會收到通知
- ❌ 程式碼完全沒變化
- ❌ 不會顯示你的 commit
你的 Fork 此時:
- ✅ 有你的修改
- ✅ 有新的 commit
- ✅ 只有你和訪問你 Fork 的人能看到
階段六:建立 Pull Request(PR)
這是唯一讓原專案知道你修改的方式!
在 GitHub 網頁操作
1. 進入你的 Fork 頁面
https://github.com/你的帳號/react
2. 會看到提示:
"fix-bug-123 had recent pushes"
或
"This branch is 1 commit ahead of facebook:main"
3. 點擊 "Compare & pull request" 或 "Contribute" → "Open pull request"
4. 填寫 PR 資訊
- 標題:簡潔描述修改內容
- 描述:詳細說明為什麼要改、改了什麼
- 可以加上截圖或測試結果
5. 點擊 "Create pull request"
✅ 這時原專案維護者會收到通知!
PR 建立後的狀態:
原專案:facebook/react
├─ 收到 Pull Request 通知 📧
├─ 可以看到你的修改
├─ 可以進行程式碼審查
└─ 可以決定是否合併
你的 Fork:你的帳號/react
└─ 顯示 "1 open pull request"
階段七:PR 審查與合併
可能的結果
1. ✅ Merged(已合併)
維護者審查後決定接受
↓
你的修改被合併到原專案
↓
你成功貢獻了開源專案!
↓
你的 GitHub Profile 會顯示貢獻記錄
2. 💬 Changes Requested(要求修改)
維護者要求你修改一些東西
↓
你在本地修改
↓
git commit -m "根據建議修改"
↓
git push origin fix-bug-123
↓
PR 自動更新(不需要建立新的 PR)
3. ❌ Closed(關閉)
可能原因:
- 不符合專案方向
- 已經有人修復相同問題
- 程式碼品質不符合要求
- 缺少測試或文件
同步原專案的更新
為什麼需要同步?
你 Fork 專案後...
↓ 時間經過
原專案有新的 commit
↓
你的 Fork 版本落後
↓
需要同步更新
同步流程
# 1. 確保在 main 分支
git checkout main
# 2. 從 upstream 抓取最新版本
git fetch upstream
# 3. 合併 upstream 的 main 分支
git merge upstream/main
# 4. 推送更新到你的 Fork
git push origin main
使用 Rebase(進階)
# 使用 rebase 保持線性歷史
git pull --rebase upstream main
# 如果有衝突,解決後:
git add .
git rebase --continue
# 推送到你的 Fork(可能需要 force push)
git push origin main --force
更新你的功能分支
# 在你的功能分支上
git checkout fix-bug-123
# 同步 main 分支的更新
git merge main
# 或使用 rebase
git rebase main
# 推送更新
git push origin fix-bug-123
Remote 的概念
Origin vs Upstream
你的本地專案有兩個 remote:
origin (你的 Fork)
├─ 網址:https://github.com/你的帳號/react.git
├─ 用途:你主要推送修改的地方
└─ 權限:你有完整控制權
upstream (原專案)
├─ 網址:https://github.com/facebook/react.git
├─ 用途:同步原專案的更新
└─ 權限:只能讀取(除非你是維護者)
常用 Remote 指令
# 查看所有 remote
git remote -v
# 新增 remote
git remote add upstream https://github.com/原作者/專案.git
# 移除 remote
git remote remove upstream
# 重新命名 remote
git remote rename origin my-fork
# 查看 remote 詳細資訊
git remote show origin
# 修改 remote 網址
git remote set-url origin https://新網址.git
最佳實踐
1. 使用分支開發
# ❌ 不好的做法:直接在 main 分支修改
git checkout main
# 修改程式碼...
git commit -m "修改"
# ✅ 好的做法:建立功能分支
git checkout -b feature/add-dark-mode
# 修改程式碼...
git commit -m "新增深色模式"
為什麼?
- main 分支保持乾淨,方便同步原專案
- 每個功能或 bug 修復都有獨立分支
- 可以同時開發多個功能
- PR 被拒絕時,不影響其他工作
2. 保持 Fork 更新
# 定期同步原專案(建議每週或開始新功能前)
git fetch upstream
git checkout main
git merge upstream/main
git push origin main
3. Commit 訊息規範
# ❌ 不好的 commit 訊息
git commit -m "fix"
git commit -m "update"
git commit -m "修改了一些東西"
# ✅ 好的 commit 訊息
git commit -m "修復 Button 元件在 Safari 中的點擊事件問題"
git commit -m "新增使用者頭像上傳功能"
git commit -m "refactor: 重構認證邏輯以提升可讀性"
常用前綴:
feat:新功能fix:修復 bugdocs:文件修改style:程式碼格式(不影響功能)refactor:重構test:測試相關chore:建置或輔助工具
4. 提交 PR 前的檢查清單
- ✅ 程式碼符合專案的 coding style
- ✅ 已經測試過修改
- ✅ 已加入或更新相關測試
- ✅ 已更新文件(如果需要)
- ✅ Commit 訊息清楚明確
- ✅ 已同步最新的原專案程式碼
- ✅ 沒有不必要的檔案或 debug code
- ✅ PR 描述清楚說明改了什麼和為什麼
5. 不要 Fork 太多專案
Fork 太多的問題:
❌ 你的 repositories 清單很亂
❌ 忘記哪些 Fork 還在使用
❌ 佔用命名空間
建議:
✅ 只 Fork 真正要貢獻或修改的專案
✅ 只想收藏的專案用 Star 就好
✅ 定期清理不用的 Fork
刪除 Fork
何時該刪除?
- ✅ PR 已經被合併,不再需要
- ✅ 決定不繼續修改
- ✅ 只是測試用的 Fork
刪除方式
1. 進入你的 Fork 頁面
2. 點擊 "Settings"
3. 滾動到最底部的 "Danger Zone"
4. 點擊 "Delete this repository"
5. 輸入專案名稱確認
6. 點擊 "I understand the consequences, delete this repository"
⚠️ 注意:刪除後無法復原!
常見問題
Q1: Fork 後原專案更新了怎麼辦?
A: 定期同步更新
git fetch upstream
git checkout main
git merge upstream/main
git push origin main
Q2: 我可以 Fork 私有專案嗎?
A:
- 如果你有權限,可以 Fork 私有專案
- Fork 出來的專案預設也是私有的
- 需要原專案給你存取權限
Q3: Fork 和 Clone 有什麼差別?
| 項目 | Fork | Clone |
|---|---|---|
| 位置 | GitHub 伺服器 | 本地電腦 |
| 操作 | 網頁按鈕 | git 指令 |
| 目的 | 複製專案到你的帳號 | 下載到本地 |
| 關聯 | 保持與原專案的關聯 | 單純複製 |
完整流程:
原專案 → Fork(在 GitHub) → Clone(到本地)
Q4: Push 到 Fork 後可以撤回嗎?
A: 可以,因為是你自己的專案
# 方法 1: 撤銷最後一個 commit(保留修改)
git reset HEAD~1
git push origin branch-name --force
# 方法 2: 完全刪除 commit
git reset --hard HEAD~1
git push origin branch-name --force
# 方法 3: 刪除遠端分支
git push origin --delete branch-name
Q5: 為什麼我的 PR 顯示很多不相關的 commit?
A: 可能原因
1. 你的 main 分支沒有同步原專案
→ 解決:同步後重新建立分支
2. 你從舊的分支建立新分支
→ 解決:從最新的 main 建立分支
3. 你在 main 分支上開發
→ 解決:使用功能分支
正確流程:
# 1. 同步 main
git checkout main
git pull upstream main
# 2. 從最新的 main 建立新分支
git checkout -b new-feature
# 3. 開發和 commit
git add .
git commit -m "新功能"
# 4. Push
git push origin new-feature
Q6: 原專案和我的 Fork 都修改了同一個檔案怎麼辦?
A: 會產生衝突,需要手動解決
# 1. 同步原專案
git fetch upstream
git merge upstream/main
# 2. 會顯示衝突訊息
# CONFLICT (content): Merge conflict in src/file.js
# 3. 打開衝突檔案,會看到:
# <<<<<<< HEAD
# 你的修改
# =======
# 原專案的修改
# >>>>>>> upstream/main
# 4. 手動編輯,保留需要的部分
# 5. 標記衝突已解決
git add src/file.js
# 6. 完成合併
git commit -m "解決與 upstream 的衝突"
# 7. 推送
git push origin main
實用指令速查
基本操作
# Fork(在 GitHub 網頁操作)
# Clone 你的 Fork
git clone https://github.com/你的帳號/專案.git
# 新增 upstream
git remote add upstream https://github.com/原作者/專案.git
# 查看 remote
git remote -v
# 建立新分支
git checkout -b feature-name
# Commit
git add .
git commit -m "描述"
# Push 到你的 Fork
git push origin feature-name
# 同步原專案
git fetch upstream
git merge upstream/main
進階操作
# 同步並使用 rebase
git pull --rebase upstream main
# 修改最後一個 commit
git commit --amend
# 互動式 rebase(整理 commit)
git rebase -i HEAD~3
# 暫存目前修改
git stash
git stash pop
# 查看與 upstream 的差異
git diff upstream/main
# 查看分支圖
git log --graph --oneline --all
總結
Fork 的核心概念
1. Fork = 複製專案到你的帳號
2. 修改 = 在你的 Fork 自由修改
3. Push = 只影響你的 Fork,不影響原專案
4. Pull Request = 唯一讓原專案知道的方式
5. 同步 = 定期更新你的 Fork
記住這個流程
Fork → Clone → 新增 upstream → 建立分支 → 修改 →
Commit → Push → 建立 PR → 等待審查 → 合併或修改
最重要的觀念
你的 Fork 是完全獨立的:
- ✅ 你可以隨意修改
- ✅ 不會影響原專案
- ✅ Push 只推到你的 Fork
- ✅ 只有 Pull Request 才會與原專案互動
建立日期:2025-10-28 最後更新:2025-11-18