GitHub Fork 完整指南

GitHub Fork 是開源協作的核心機制,讓你可以安全地貢獻程式碼到任何專案。


目錄


什麼是 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: 修復 bug
  • docs: 文件修改
  • 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

🔗相關文章