給 Vibe Coder 的學習資源

Git & Github
新手入門指南

從基本概念開始,一步步掌握版本控制與雲端協作

Part 1

Git 入門

從建立 Repo 到合併分支,學會存檔、嘗試、安心倒帶

01

Git 的基本概念

用 Claude Code 做 Vibe Coding 時,你一定遇過這種情況:好不容易把功能調到滿意了,結果下一輪對話就不小心改壞了什麼,卻怎麼也回不到剛才正常的狀態。

這時候你可能會想,如果有一個「時光機」,能讓我隨時回到任何一個正常運作的版本就好了。這個時光機,就是 Git

對 Vibe Coder 來說,學 Git 最大的好處是:你可以放心地讓 Claude Code 去嘗試各種改動,因為你知道任何時候都能「倒帶」回安全的版本。下面先認識四個最核心的名詞,後面所有章節都會回來用到它們。

Repository:你的專案資料夾

Repository(簡稱 Repo)就是被 Git 管理的專案資料夾。當你在一個資料夾裡執行 git init,這個資料夾就變成了一個 Repo,從這一刻起,Git 就會開始追蹤裡面所有檔案的變動。

生活比喻
可以把 Repo 想成 Google 文件,每次改動都會留下版本紀錄,未來可以隨時翻到「上禮拜五的版本」或「昨天加完那段話的版本」。Repo 就是把你整個專案資料夾都加上這層版本紀錄能力。
對 Claude Code 說

「幫我在這個專案資料夾建立 Git」
→ Claude Code 會執行 git init,把資料夾變成 Repo

Commit:儲存當下的進度點

Commit 是 Git 裡最核心的動作,就是把目前的改動儲存成一個紀錄點。每次 commit,Git 都會把專案當下的狀態記下來,附上你寫的說明訊息和時間戳記,未來隨時可以回到這個紀錄點,從這裡重新再往下做。

生活比喻
Commit 就像遊戲裡的手動存檔。你不會每走一步就存,但會在打完 Boss、拿到重要道具時存一下。專案也一樣,每完成一個功能、修好一個 Bug,就值得存一個進度點。
對 Claude Code 說

「這個功能做好了,幫我儲存進度」
→ Claude Code 會把改動加進暫存區(git add,像把要存的東西先放進購物車),再建立一個 commit 完成存檔

有了 commit 之後,搭配下面這幾句對話就能輕鬆檢查改動、查看歷史、還原狀態:

確認改了什麼

「幫我看一下從上次存檔之後,我改了哪些東西」

回顧過去進度

「列出最近幾次的存檔紀錄,我想看看這幾天做了什麼」

還原特定檔案

「我剛才改壞了首頁的樣式,幫我把首頁的樣式檔案還原到上一次存檔的版本」

把整個專案倒回去

「我好像把整個專案搞亂了,幫我還原到今天早上的狀態」

Branch:開一條平行的開發路線

Branch(分支)讓你從主線上分岔出一條路徑,可以在上面做實驗或開發新功能,而不影響主線的穩定版本。等嘗試完成沒問題後,再合併回主線。

生活比喻
分支就像在文件上按「建立副本」,副本上怎麼改都不會動到原始版本。改得滿意就把副本內容合併回去;不滿意直接刪掉副本,原始版本還是完好如初。

分支的細節(什麼時候開、怎麼命名、怎麼合併)會留到 Section 03、04 展開。

本地 vs 遠端

Git 的操作都是在你自己的電腦上進行的,這就是「本地端」(Local)。GitHub 這類平台則是「遠端」(Remote),讓你可以把專案備份到雲端、跟別人協作,或者純粹當作異地備份。

一個人的 Vibe Coding 專案
對單人專案來說,遠端最大的價值就是備份。即使你還沒把專案推到 GitHub,本地的 Git 就能幫你做好版本控制。GitHub 的部分留到 Part 2 再展開。

02

寫好 Commit 訊息,讓每次存檔都有意義

知道 Commit 是什麼之後,接下來聊一個很容易被忽略,但其實很重要的事:commit 訊息要怎麼寫。

生活比喻
Commit 訊息就像 Google Calendar 上的事件名稱。你不會把事件寫成「開會」,而會寫成「跟客戶討論 Logo 定稿」。好的 commit 訊息也是一樣,未來回頭看時,光看訊息就能知道當時是為了什麼原因做了什麼改動。

用 Conventional Commits 格式來書寫

Conventional Commits 是一種被廣泛採用的 commit 訊息格式,做法是在訊息前面加上一個「類型」標籤,讓每筆紀錄的意圖一目了然:

# 格式
類型: 簡短描述這次改了什麼

# 實際範例
feat: 新增深色模式切換按鈕
fix: 修復手機版選單無法關閉的問題
style: 調整首頁標題的字體大小和間距
docs: 更新 README 的安裝說明
refactor: 簡化導覽列的程式碼結構

feat 是新功能、fix 是修 Bug、style 是樣式調整、docs 是文件更新、refactor 是重構程式碼。光看前綴就能快速掃過歷史紀錄,知道每次改動的性質。

對 Claude Code 說

「幫我用 Conventional Commits 格式儲存」
→ Claude Code 會自動分析改動內容,產出合適的訊息,你再檢查一下訊息有沒有表達正確的意思就好

把偏好寫進 CLAUDE.md

不過,每次都要口頭提醒 Claude Code 用什麼格式,感覺不是很聰明。我們可以把這種每次都要重複講的偏好設定,寫進 CLAUDE.md 裡。

CLAUDE.md 是放在專案根目錄的設定檔,Claude Code 每次啟動時都會自動讀取。可以把它想成是給 Claude Code 的「工作說明書」,commit 訊息要用什麼格式、協作方式等,都可以寫在裡面當作 Claude Code 的指引。

# CLAUDE.md 範例

## Git 規範
- commit 訊息請使用 Conventional Commits 格式
- commit 訊息用英文撰寫
- 分支命名使用 前綴/描述 格式(如 feature/xxx, fix/xxx)

## 開發偏好
- 使用繁體中文跟我溝通
- 改動前先跟我確認方向
設定好之後,未來只要說「幫我儲存」,Claude Code 就會自動用 Conventional Commits 格式來寫 commit 訊息,不需要每次再重新覆述一次。

03

透過 Branch 放心做嘗試,不用擔心影響主線

當你的專案已經有一個穩定運作的版本,這時候想加新功能,你會怎麼做呢?

直接在原本的程式碼上改,當然可以。但如果改到一半發現方向不對,或者改壞了其他功能,要回頭就會比較麻煩。分支(Branch)就是為了解決這個問題而存在的。

因此在 Git 預設的主分支(main)上,我們應該永遠保持可以正常運作的版本,新功能的開發或嘗試都在分支上進行。這樣一來,就能放心地在分支上大膽嘗試各種想法,不用擔心會影響到 main 上已經穩定的成果。

對 Claude Code 說

「我想試試看把整個配色換掉,但不確定效果好不好,幫我開一個新的分支來嘗試」

一個功能的完整生命週期

功能分支的生命週期:從 main 分出去 → 開發 → 合併回來。

main 建立分支 合併回 main ✓ feature/dark-mode commit 繼續開發 功能完成 main 建立分支 feature/dark-mode commit 繼續開發 功能完成 合併回 main ✓
整個過程中,main 分支完全不受影響 只有確認功能沒問題之後,才會合併回去

搭配 Claude Code,整個流程只需要幾句對話就能完成:

  1. 💬 幫我從 main 建立一個新分支,我要做暗色模式
  2. 你開始開發,做了一些改動
  3. 💬 幫我儲存目前的進度
  4. 反覆步驟 2-3,直到功能完成
  5. 💬 我覺得暗色模式做好了,幫我合併回 main
  6. 💬 合併完成後,幫我刪掉這個分支

判斷何時該開分支

一個簡單的判斷方式是,如果這次的改動可能會影響到目前正常運作的功能,就值得開一條分支。像是調整一下按鈕顏色、改個文案,這種小改動直接在 main 上做就好;但如果要加一整個新功能、重新設計介面的樣式,那就值得另開分支來做。

分支的命名方式

最好的分支命名方式,就是能讓人一眼就知道「這條分支在做什麼」。常見的命名慣例是用 前綴/描述 的格式:

前綴 用途 範例
feature/ 新增一個功能 feature/dark-mode
fix/ 修復某個問題 fix/login-button-crash
hotfix/ 緊急修復(線上出事了!) hotfix/payment-error
design/ 設計相關的調整 design/new-landing-page
refactor/ 重構(功能不變,但結構更好) refactor/simplify-nav
experiment/ 試驗性的想法 experiment/ai-chatbot
✓ 好的命名
feature/user-profile-page fix/image-not-loading design/homepage-redesign

用英文小寫、連字號分隔、簡潔且具描述性

✗ 不好的命名
New_Branch test123 brian的修改

避免中文、空格、大寫混用、沒有意義的名字

對 Claude Code 說

「我想加一個深色模式,幫我開一條新的分支來做」
→ Claude Code 會建立 feature/dark-mode 並切換過去

做到一半想切換分支?用 Stash 先暫存

有時候你正在分支上做深色模式,做到一半突然發現首頁有個 Bug 想立刻處理。但深色模式還沒做完,你也不想 commit 一個半成品。這時候就可以用 stash(暫存)。

它會把你目前做到一半的改動先收起來,讓你乾淨地切換到別的分支;等忙完了,再把暫存的東西拿回來繼續做。

你可能會想,直接 commit 一個半成品不行嗎?可以,只是這樣 commit 歷史會多出一堆「做到一半」的紀錄。Stash 就是為了保持 commit 歷史乾淨而存在的。剛開始接觸 Git 時,先養成 commit 的習慣比較重要,整潔度可以之後再要求。
生活比喻
這就好比你正在桌上拼一塊拼圖,拼到一半臨時要把桌面騰出來做別的事。你不想把已經拼好的部分打散,就把整塊拼圖連同底下的墊板小心搬到旁邊;等桌子能再用,再把它搬回來,從原處繼續拼。Stash 就好比那塊墊板,讓我們能保留目前進度來先處理其它事務。
對 Claude Code 說

「先幫我將目前的進度暫存起來,我要切換到另一個分支」

回來之後

「幫我切回剛才的分支,把暫存的東西拿回來」


04

合併分支來整合開發成果

當你在分支上完成了一個功能、確認沒問題之後,就可以把它合併(Merge)回 main 分支。常見的合併方式有兩種:

Merge:保留完整歷程

這是最直覺的合併方式。就像兩條路在交叉口匯合,Git 會保留完整的分支痕跡,讓你清楚看到這些改動是從哪個分支來的。

大部分情況下用 Merge 就夠了。它的好處是歷史紀錄完整,未來回頭看時,能清楚知道每個功能是怎麼分開開發、又在什麼時候合併的。

Squash and Merge:壓成一筆乾淨的紀錄

如果你在開發過程中留下了很多瑣碎的小 commit,像是修了一個 typo、調整一下間距等,用 Squash and Merge 可以把這些全部壓縮成一個 commit 再合併。

如此最終在 main 上,只會看到一筆乾淨的紀錄,例如「feat: 新增深色模式」,而不是十幾筆零碎的小改動。

對 Claude Code 說

「我想把 feature/dark-mode 合併回 main,但我在開發過程中有很多小 commit,幫我壓成一個」
→ Claude Code 就會用 squash merge 來處理

不確定該用哪種?直接問 Claude Code:「幫我分析一下,這個分支用哪種方式合併比較適合?」它會根據你的 commit 數量和內容給建議,你再根據說明來選擇就好。

當合併時遇到衝突

合併的時候,有時可能會遇到一個狀況:你在 main 規劃好導覽列的樣式後,但後來在其他分支也動到導覽列的設計。此時若要將分支合併回 main,Git 就會發現同一個地方有兩個不同的版本,它不確定你要用哪一個,這就是 合併衝突(Conflict)

生活比喻
想像你跟同事各自拿了同一份簡報去改。你把第三頁的標題改成「公司展望」,同事改成「未來計畫」。當你們要合併時,Git 會問:「第三頁的標題要用哪個?」這就是衝突。Git 不會自作主張幫你選,它會把兩個版本都列出來讓你決定。

衝突不是壞事,這是 Git 幫你把關的一環。

對 Claude Code 說

「幫我把 feature/dark-mode 合併回 main」
→ 如果合併過程中遇到衝突,Claude Code 會主動列出衝突的檔案和位置,解釋兩邊各改了什麼,然後問你想保留哪個版本

不需要擔心怕有衝突而不敢開分支。有 Claude Code 幫忙,解決衝突的過程比你想像的簡單很多。

隨手清理分支,讓專案保持整潔

值得注意的是,分支在合併後並不會自動消失。雖然 Git 會標示哪些分支已經合併,但隨著功能越做越多,分支清單還是會越來越長、看起來越來越雜。

因此可以在合併完成後順手刪除用完的分支。刪除分支後並不會遺失任何資料,被刪掉的只是「分支名稱」這個書籤,分支上做過的每一次 commit 都已經寫進 main 的歷史裡,未來想翻回當時的狀態,用 git log 找到那個 commit 隨時都可以回去。

如果評估某個功能近期還要微調,這個分支就可以先保留著。或是合併後先觀察一陣子,確認 main 運作正常再刪除也不遲。

05

用 .gitignore 保護你的 API 金鑰

在 Vibe Coding 的過程中,專案很可能會用到第三方服務的 API 金鑰或密碼,這些機密資訊通常會存在一個叫 .env 的檔案裡。

這個檔案是絕對不能被 Git 記錄到的。一旦 commit 之後推送到 GitHub,你的金鑰就等於公開在網路上了。網路上有很多駭客寫的機器人 24 小時自動掃描 GitHub,只要金鑰一曝光,幾秒鐘內就可能被盜刷或濫用。更麻煩的是,Git 會記住所有事情,就算事後從資料夾裡刪掉那個檔案,歷史紀錄裡還是找得到。

.gitignore 就是用來防止這件事的。它是一份告訴 Git「請忽略這些檔案」的清單,只要把 .env 加進去,Git 就不會追蹤它。

常見該忽略的東西

# 套件資料夾(很大,可以隨時重新安裝)
node_modules/

# 環境變數(裡面有密碼、API 金鑰等機密)
.env

# 系統自動產生的檔案
.DS_Store
Thumbs.db

# 編譯產生的檔案(可以隨時重新產生)
dist/
build/
對 Claude Code 說

「幫我建立一個 .gitignore,確保 .env 不會被追蹤」
→ Claude Code 會根據你的專案類型,自動加入該忽略的系統暫存檔或套件資料夾

確認 .env 是否有被保護

如果不確定 .env 有沒有被保護到,有兩種方式可以確認:

  1. 直接問 Claude Code:「幫我確認一下,.env 有在 .gitignore 裡面嗎?」
  2. 自己打開來看:.gitignore 是放在專案根目錄的純文字檔,可以用任何文字編輯器打開,只要裡面有一行寫著 .env 就安全了。
如果不小心已經把 .env 傳上 GitHub 了
最快也最安全的補救方法不是去改 Git 紀錄,而是立刻去那個第三方服務的後台,把 API 金鑰作廢(Revoke),然後重新申請一把新的,這樣就不用怕原本的金鑰被濫用。

建議的習慣是把「設定 .gitignore」當作每個新專案的起手式:

新專案的第一步

「幫我初始化 Git,建立 .gitignore,然後做第一次存檔」

最後想跟你說的
Git 的設計哲學就是「讓你可以放心地嘗試」,任何改動都能被追蹤、被還原、被分離到不同的分支。搭配 Claude Code、Codex 這類 AI 工具後,你不再需要硬記任何指令,只要用自然語言描述你想做什麼,它們就會幫你轉換成正確的 Git 操作。掌握了如何使用 Git 的概念,等於為你的專案拿到了一把無限次數的「時光鑰匙」,任何時候都能放心嘗試新想法,因為你知道隨時都能回到安全的版本:)
Part 2

GitHub 基礎概念

從本機到雲端,學會備份、分享與協作

01

Git 跟 GitHub 的差別

在 Part 1 裡,我們認識了 Git,那台幫專案做版本控制的「時光機」。透過 commit 跟分支,我們能在 Vibe Coding 的過程中放心嘗試各種想法,就算改壞了也能隨時回到完好的版本。

不過 Git 有個小限制:它的資料只儲存在自己的電腦裡。如果想把專案分享給朋友看看、或是拿別人分享的工具來用,光靠 Git 是還不夠的。這時候,我們就會需要一個「雲端」的橋樑,把 Git 所管理的專案推到網路上。

而這個角色,就是 GitHub

生活比喻
Git 就像你手上的相機,負責拍照和整理相簿。GitHub 就像 Google 相簿,讓你把相片放到雲端,可以跟別人共享,別人也可以從上面下載你的照片。相機(Git)跟雲端相簿(GitHub)雖是兩個獨立的東西,但搭配起來使用會非常方便。

GitHub 不只是 Git 的雲端版本,它同時也是全世界最大的開源社群。對 Vibe Coder 來說,GitHub 既能讓自己的專案有雲端備份、跨裝置同步、跟人協作,也是一座可以盡情挖掘的寶藏,許多實用的工具與 Skill 都能在這裡找到。

簡單記法
Git = 你電腦上的版本控制工具
GitHub = 把 Git 專案放到雲端的平台(也是全世界最大的開源社群)

02

認識 GitHub 上的專案資料夾

在 GitHub 上,每一個專案都會放在一個叫做 Repository(簡稱 Repo)的地方。你可以把它想成一個雲端的專案資料夾,裡面除了裝著專案的所有檔案,還記錄著這份專案從第一個 commit 到現在的完整版本歷史。

換句話說,它跟你電腦上那個被 Git 管理的資料夾是「對應的」,只是一個在本地、一個在雲端。

以 Anthropic 的 skills repo 為例,一個 Repo 頁面上常見的元素有這幾個:

Anthropic skills repo 在 GitHub 上的頁面截圖
Anthropic 的 skills repo 頁面

檔案列表(中間主區):GitHub 會把專案裡所有的檔案與資料夾直接呈現在網頁上,不用下載也能線上瀏覽。

README.md(檔案列表下方):專案的說明書,告訴造訪者這個專案是什麼、怎麼用。

Star(右上角):類似於社群上的「按讚」,數字越高通常代表越多人覺得它值得參考。

Issues(上方 tab):回報 Bug 或提出建議的地方,有點像專案專屬的討論區。

Pull requests(上方 tab):其他人想把改動合併進來的請求,也就是後面會聊到的 PR。

理解了 Repo 是什麼後,接下來我們就能進一步去認識電腦上的 Git,要怎麼跟 GitHub 上的 Repo 互通有無。


03

本地與雲端之間的同步方式

當專案同時存在於本地與雲端時,它們之間就需要一套溝通方式,讓兩邊隨時保持同步。GitHub 上最常用到的三個動作,就是 Push、Pull、Clone

你的電腦 (本地 Git repo) 你的專案檔案 Git 版本歷史 GitHub (雲端 repo) 雲端的檔案副本 雲端的版本歷史 push pull clone
  • push:把本地的改動推到雲端
  • pull:把雲端最新版本拉回本地
  • clone:第一次將整個專案複製下來
你的電腦
本地 Git repo
你的專案檔案 Git 版本歷史
push
pull
clone
GitHub
雲端 repo
雲端的檔案副本 雲端的版本歷史
  • push:把改動推到雲端
  • pull:把雲端最新版本拉下來
  • clone:第一次下載整個專案

Push:把本地的改動推上雲端

當我們在電腦上完成修改、並用 commit 存好進度後,這些變更都還只儲存在電腦裡。如果想讓 GitHub 也有這份檔案,就需要透過 push(推送),把專案從本地「推」上雲端的 Repo。

對 Vibe Coder 來說,Push 最大的好處有兩個:一是買個保險做雲端備份,不用怕電腦出狀況讓心血泡湯;二是方便分享,不管是要給朋友看,還是開源讓大家下載,都可以透過 push 來讓大家瀏覽專案成果。

第一次推送

「這是我在 GitHub 上建立的 Repo 網址 [貼上網址],請幫我把目前的本地專案推上去」

後續更新

「幫我把目前的進度推到 GitHub 上」

Pull:把雲端的最新狀態拉回本地

反過來說,如果你換了一台裝置想繼續開發、或在 GitHub 上編輯了某個檔案,那此時電腦上的版本就不是最新的了。這時候就需要 pull,把 GitHub 上最新的改動「拉」回本地,讓兩邊重新對齊。

像是平常在桌機上開發、週末想換筆電繼續做一點,只要先在筆電上 pull 一下,就能接著桌機的進度往下做。

對 Claude Code 說

「拉一下 GitHub 上最新的版本」
→ Claude Code 會把雲端最新的 commit 抓下來合併到本地,讓本地專案也同步到最新狀態

Clone:把雲端的專案抓下來

前面兩個動作是針對「自己手上的專案」做同步,而 clone 則是用在當你在 GitHub 上看到一個想用或想參考的專案時。它會把這個專案裡的所有檔案,連同完整的版本歷史一起複製過來。

複製完之後,電腦上就會有一份能直接用 Git 管理的本地專案副本,可以開啟、編輯,也可以接著往下開發與調整。

Clone 跟「下載」差在哪?
在 GitHub 的 Repo 頁面點開那顆綠色的 Code 按鈕時,除了 Clone 之外,也會看到一個「Download ZIP」的選項,兩者最大的差別就在於:Download ZIP 只會打包當下的檔案內容,是一份脫離 Git 管理的靜態副本,下載下來之後就只是一般資料夾,沒有任何版本紀錄;而 Clone 會把整個版本歷史一起帶下來,讓你能在本地用 Git 隨時查看過往的 commit、切換分支,或回到某個歷史版本繼續往下開發。
對 Claude Code 說

「把這個 GitHub 上的專案 [貼上網址] clone 到我的電腦」

養成本地與雲端同步的節奏

簡單回顧一下這三個操作:

Push:把本地的改動推到雲端(電腦 → GitHub)

Pull:把雲端的最新版本拉回本地(GitHub → 電腦)

Clone:把整個專案完整複製下來,包含所有版本歷史

在這三個動作裡,最值得帶進日常開發的,是 Commit 與 Push 這組雙層備份的操作:每完成一個小修改就先 commit 起來,把進度存在本地;當功能告一段落、或完成大項目的開發時,再 push 到 GitHub 做雲端備份。

於本機開發的過程中

「commit 目前的進度」

功能完成後

「把目前的進度 push 到 GitHub 上」

這樣的安排,能讓我們在保持心流的同時,每一段進度也都有著雙層備份。再也不用擔心電腦突然出狀況,過去幾個小時的努力就跟著消失。

04

用 Fork 在 GitHub 上建立專案副本

到這裡,我們已經知道可以透過 push 與 pull 讓本地跟雲端同步,並用 clone 把公開的專案複製下來。但 GitHub 上還有一個更有趣的操作,那就是 Fork(分叉)

Clone 跟 Fork,差在哪裡呢

兩個動作都是「複製別人的專案」,但複製的「位置」跟「關係」完全不同。舉個情境來說明:你在 GitHub 上看到一個很實用的 Skill,想拿來用用看的時候:

Clone
  • 把這個 Skill 複製到你的電腦
  • 你可以打開、修改、使用,但這份副本只存在於本地
  • 跟原作者的 Repo 沒有任何關係
  • 電腦壞掉,副本就跟著消失
Fork
  • 把這個 Skill 複製到你的 GitHub 帳號
  • 變成一個你完全擁有的雲端 Repo
  • 跟原版會保持「上下游」的連結關係
  • 永遠都在,且能跟原版互通

Fork 與原版之間的「上下游」關係

Fork 的特別之處,在於會跟原版保持「上下游」的連結。你的 fork 是「下游」,原作者的 Repo 是「上游」。

這個連結最大的好處是:你可以在自己的 fork 裡自由調整,而當原版有了新功能或 Bug 修正時,可以選擇把這些更新「同步」回你的 fork,讓你的版本既保留客製化內容,又能跟著原版一起進化。

不過,看到這裡可能會想說:在同步原版的更新時,自己所做的調整會不會被覆蓋掉呢?

大多數情況下,是不會的。當我們把原版的最新版本同步到自己的 fork 時,Git 會自動進行「合併(Merge)」,把原版的新改動跟你自己的修改整合在一起,而不是用原版去覆蓋你的內容。

只有一種情況需要你手動介入:當你跟原作者改到了「同一個檔案的同一段內容」時,那麼 Git 就會跟你說「這裡有衝突,請選擇要保留哪個版本」,這就是在 Part 1 裡談過的衝突(Conflict)

三種情況的應對
  • 你改了 A 檔案、原作者改了 B 檔案 → 完全不衝突,兩邊改動都會自動保留
  • 你跟原作者都改了同一個檔案,但改的是不同段落 → Git 通常也能自動合併
  • 你跟原作者改了同一個檔案的同一段 → Git 會提醒衝突,讓你決定保留哪個版本

Vibe Coder 可以如何用 Fork

對 Vibe Coder 來說,Fork 最常出現在這幾個情境:

客製化別人的 Skill:看到一個很實用的 Skill,但想根據自己的工作習慣調整。這時候 fork 一份回來,就能自由修改成自己的版本,而不會動到原作者的東西。

延伸開源的專案:在 GitHub 上看到一個有趣的小工具或範本,想拿來改成自己的版本時,那麼就可以透過 Fork 來在自己的帳號下持續開發,未來也能跟原版同步更新。

保留學習用的副本:想研究別人的專案是怎麼寫的,Fork 一份在自己帳號下,就能放心地拆解、實驗、嘗試各種改法。

操作上也很簡單,在 GitHub 的 Repo 頁面右上角會有一個「Fork」按鈕,點下去之後,你的帳號底下就會多出一個一模一樣的 Repo,下方會標注「forked from xxx」,告訴我們這是從哪裡分叉出來的。


05

透過 Pull Request 來為 GitHub 做出開源貢獻

介紹完 Fork,GitHub 上還有一個值得認識的功能是 Pull Request(簡稱 PR)。

雖然這名稱看起來有點不直覺又繞口,但概念其實很單純:當我們在 fork 裡做了調整,若有嘗試出更好的方法或修掉某個 Bug,此時就可以透過 PR 請原作者把你所做的優化「拉(pull)」進他的 Repo 裡。

生活比喻
想像一本共同編輯的食譜。你覺得某道菜的做法可以改進,但不能直接去改主廚的版本。你的做法是:先抄一份回家(Fork),在你的版本上改好(修改),然後把你的版本寄給主廚看(Pull Request)。主廚看了覺得不錯,就把你的改法加進正式版本裡(Merge)。

一個 PR 通常會包含幾個關鍵資訊:

標題與說明:改了什麼、為什麼這樣改

改動的內容:GitHub 會把改了哪些檔案、新增或調整了哪些段落都列出來,方便原作者查看

討論區:原作者跟其他人可以在這裡留言、提問或給建議

值得注意的是,PR 通常不是「丟出去就結束」。它更像是一場對話,原作者可能會說「這邊可以再調整一下」,你就回去修改、再更新 PR。直到最後都調整好時,才會正式合併進原版。

當被合併的那一刻,就能成為 Contributor 的一員

當原作者審閱完 PR、覺得改得不錯按下「Merge」之後,你的改動就正式進到了原版的 Repo 裡,同時你的名字也會出現在 Contributors 名單上。

這也正是在逛 GitHub 時,在 Repo 頁面上會看到的 Contributors 名單,這些人正是靠著「主動貢獻」成為其中一員的。其實每個人都能透過 Fork → 修改 → PR 的流程,成為某個專案的 Contributor。

這就是 GitHub 的開源精神
原始碼是公開的,任何人都可以看、可以用、可以改。Fork 加上 Pull Request 的機制,讓「眾人協作」能夠有秩序地進行下去:原作者保有最終決定權(要不要合併你的修改),貢獻者也不需要取得特別的權限才能參與。這也正是 GitHub 之所以能成為全世界最大開源社群的核心原因之一。

看到這裡,你也可以來動手試試喔

我們已經從 commit、branch 認識到 fork、clone、pull request,但如果想讓這些資訊內化成知識,親自動手試試會是最佳學習路徑喔。

像這份指南就放在 GitHub 上,有興趣的話,很歡迎 fork 一份回去,挑你想優化的地方試看看。可能是:

改完之後,你就可以按下 PR 按鈕。等之後合併進來,你的名字就會出現在 GitHub 的 Contributors 名單上,這份指南也會因為你而更完整:)

Repo 在這裡:github.com/brianciou/git-github-guide。進到 repo 後可以先讀 README.md 了解專案全貌;完整的貢獻流程方法有寫在 CONTRIBUTING.md,可以點開閱讀了解;如果想提建議或優化想法,也可以從 Issues 頁面選一個 ISSUE_TEMPLATE 直接開單。

補充:PR 跟 Issue 差在哪?
兩者都是「跟原作者溝通」的管道,但動作層級不同:Issue 是用文字反映想法或問題(「發現一個錯字」、「希望加上 XX 功能」),要不要改、怎麼改是原作者決定的;PR 則是你已經把改動做好,請原作者直接合併進去。

用生活比喻來說,就像在咖啡店裡:Issue 是跟店員建議「希望推出燕麥奶選項」;PR 則是你自己研發出配方,請店家採用的感覺。
哪怕只是修正一個小地方,整個 fork → clone → branch → commit → push → PR 的流程都能透過練習而更加熟悉。之後在 GitHub 上遇到其他感興趣的開源專案時,就能知道如何參與其中,為整個開源社群做出貢獻:)