核心心法:「主線留空,客製分流」。達到完全不發 PR 回原專案(A專案),但源源不絕接收 A 專案養分的完美工作流。
🛠️ 核心架構:雙遠端 (Dual Remotes)
除了自己的專案庫(origin)之外,把原作者的專案加進來當作上游(upstream)。
1. 初始環境建立
在 GitHub 網頁上 Fork 之後,Clone 到本地,並補上 upstream 連線:
git clone https://github.com/我的帳號/B專案.git
cd B專案
# 加入 A 專案當作上游
git remote add upstream https://github.com/原作者帳號/A專案.git
📈 分支管理與防錯策略
網頁上的 Sync fork 只要遇到 main 分支有 local change 必死(卡衝突)。因此必須建立防呆機制:
main分支:保持絕對純潔,不寫任何 code,只用來跟 A 專案同步。my-custom分支:所有客製化修改、local commits 都待在這裡。
網頁防呆設定(GitHub 必調)
去 B 專案的 Settings -> Branches -> Branch protection rules 對 main 設定:
- 勾選 Restrict updates:防止自己手殘直接 push 程式碼到雲端的
main。 - 勾選 Allow fork syncing:特例放行,允許 GitHub 網頁的 Sync fork 按鈕把 A 專案的更新拉進來。
🔄 日常同步黃金工作流
當 A 專案(upstream)進版,要把新功能揉進客製化程式碼時的操作順序:
-
網頁點擊 Sync fork: 雲端一鍵同步. 去 GitHub 網頁上點選 Sync fork -> Update branch。因為自己的
main是乾淨的,這步 100% 成功。 -
把雲端更新拉回電腦: 讓本地 main 變最新. 回到終端機,切換到主分支並 pull:
git checkout main
git pull origin main
- 合併更新到客製化分支: 在本地用 Vim 處理可能發生的衝突.
切換到工作分支,把最新的
main合併進來:
git checkout my-custom
git merge main
💡 🧠 萬一不小心在 main 下了 Commit 怎麼辦?
只要還沒 push,在本地端隨時可以用這三行無痛轉移,瞬間恢復 main 的純潔:
# 1. 把剛剛寫的 commit 複製到新分支
git checkout -b my-new-feature
# 2. 切回 main
git checkout main
# 3. 強制讓 main 倒退回沒污染前的狀態
git reset --hard origin/main
⚠️ 備忘
不要為了省事把 GitHub 網頁的預設分支(Default branch)改成 my-custom,否則會破壞網頁「一鍵 Sync fork」的功能。如果嫌本地切換麻煩,只修改本地端的預設追蹤即可:
git branch --set-upstream-to=origin/my-custom my-custom
留言