跳到主要內容

Git 筆記:Fork 專案如何持續吃上游更新,且保持客製化改動

核心心法:「主線留空,客製分流」。達到完全不發 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 rulesmain 設定:

  1. 勾選 Restrict updates:防止自己手殘直接 push 程式碼到雲端的 main
  2. 勾選 Allow fork syncing:特例放行,允許 GitHub 網頁的 Sync fork 按鈕把 A 專案的更新拉進來。

🔄 日常同步黃金工作流

當 A 專案(upstream)進版,要把新功能揉進客製化程式碼時的操作順序:

  1. 網頁點擊 Sync fork: 雲端一鍵同步. 去 GitHub 網頁上點選 Sync fork -> Update branch。因為自己的 main 是乾淨的,這步 100% 成功。

  2. 把雲端更新拉回電腦: 讓本地 main 變最新. 回到終端機,切換到主分支並 pull:

git checkout main
git pull origin main
  1. 合併更新到客製化分支: 在本地用 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

留言