-

- 我跟 AI 協作寫程式 3 年多,撞不少牆——包括 GitHub 帳號被永久停權兩次——最後摸出一套穩定的配置:
- GitHub 開 repo 當門面:公開成果放這裡,也是各家雲端 AI coding 服務的接入口。
- 日常工作推自家 Gitea:AI 半夜高頻連推五十次,推的是自己家,沒人管。
- 想行動工作就上 code-on-web:平板、瀏覽器隨處上工,成果照樣歸檔。
- 如果這三句話你每個字都懂,就不用往下讀。
- 如果你跟當你的我(和許多 Vibe coder 一樣)——連 Git 和 GitHub 差在哪都說不清——那就往下看。我沿著自己一路遇到的痛點,每個痛點都剛好有一群人先痛過、並且做出工具,換成我的用法。這套配置你可直接拿去。
-
第一章:「資料夾複製症」,解藥是 Git
-
Pain Point:整個資料夾複製的日子
- 接案做個報名網頁,做出來了,但需求開始改。改了幾輪,桌面出現熟悉的風景:
報名頁-final、報名頁-final2、報名頁-真的final。 - 我學乖了,每次讓 AI 大改前,先把整個資料夾複製一份留底:
報名頁v1、報名頁v2、報名頁v3…… - 三個痛很快浮現:
- 空間:資料夾複製十次,硬碟多十份。
- 失憶:客戶說「按鈕還是改回上次那個藍色」——藍色是 v4 還是 v5?我一個個資料夾打開肉眼找。
- 最痛的:今天網頁壞了,想退回昨天。「昨天」是哪個資料夾?AI 昨天到底改了哪裡? 完全不知道。
- 接案做個報名網頁,做出來了,但需求開始改。改了幾輪,桌面出現熟悉的風景:
-
Story:被斷供的全世界最累主管
- 這個痛,2005 年有個人痛得比我深一萬倍:Linus Torvalds,Linux 之父。
- 他管的 Linux kernel 是幾萬個檔案的怪物專案,全球幾千個開發者,每天幾百個修改湧向他一個人拍板合併——他大概是地球上「整合別人工作」最頻繁的主管,靠土法複製資料夾早就死了。
- 當時他們用一套商業工具 BitKeeper 撐著,免費授權用了三年,某天雙方鬧翻,授權被收回——全球幾千人的開發瞬間斷供。被平台掐脖子的滋味,記住這一幕,後面會重演。
- Linus 停下手上所有事,大約十天,寫出了 Git。規格全按他的工作量開:
- 任何日常操作秒級完成;
- 開分支像呼吸一樣便宜;
- 每人複製回家的是整座檔案館含全部歷史,斷網照做、任一副本可還原一切;
- 歷史防竄改(2003 年真有人往 kernel 塞過兩行後門);
- 以及最重要的——開源(GPL),命脈不再握在任何人手裡。
- 他為幾千人的怪物專案打造的工具,拿來管我和 AI 的報名頁,等於開 F1 賽車去買菜——性能永遠花不完,而且免費。
-
投影片時間:抽屜、記錄表、目錄卡
- Git 在做的事,上世紀早就想通了。20 世紀中期,10 頁簡報可不是一份 PPT,而是 10 張透明膠片,V2 只改第一頁標題字級,沒人重印 10 張——只重做那 1 頁換上,換下的舊頁收進抽屜,在版本變更記錄表填一行:「V2:P1 標題字放大 2 級」。客戶反悔?從抽屜拿回舊頁。
- 對應 Git:每次定版叫 commit,記錄表那行說明叫 commit message,整本記錄表叫 log。
- 那「留底」怎麼不爆硬碟?Git 的收納術分兩步:
- 第一步,任何內容交給 Git,先算一個指紋(hash,這和比特幣用同一類機制,有興趣可自行搜尋)有它可以做到:
- 內容相同,指紋必然相同;
- 差一個字,指紋面目全非。
- 所以同樣的內容永遠只存一份,如果又存入一樣的,倉庫一看「這有了」,直接忽略。
- 第二步,一份「快照」其實只是一張目錄卡:每個檔案一行,寫著它的指紋。換新版=寫一張新卡:改動的行填新指紋,沒改的行照抄舊指紋——沒改的檔案零成本。卡片只增不改,舊卡永遠留著,想偷改歷史一個字,指紋整條對不上,立刻穿幫。
- 第一步,任何內容交給 Git,先算一個指紋(hash,這和比特幣用同一類機制,有興趣可自行搜尋)有它可以做到:
-
如果你是上古工程師用過上一代工具 SVN,它是反的:只存一份原版,每版記「修改指令」,要第 300 版得從原版疊 299 張指令上去——錄影帶只能快轉。Git 是 DVD 選章節:翻開那張卡,直接取貨。這就是 Git 勝出的核心原因。
-
回到我的報名頁:三個痛全消
- 空間:目錄卡收納術,留一百版也沒感覺。
- 失憶:我的 log 長這樣——「加入報名截止倒數」「表單新增手機欄位」「按鈕改回藍色」。客戶三個月後反悔,翻記錄表就知道回哪一版。
- AI 改了哪裡:靠 diff——一個指令把兩版差異一行行攤開,紅色是刪的、綠色是加的。真實場景:我請 AI「把報名按鈕改成綠色」,它回報完成;diff 一看,按鈕確實綠了,但它順手把表單的手機驗證邏輯也「優化」了。沒有 diff,這種好心幫倒忙要等客戶報不了名才爆出來。不必重讀整份檔案,只看它動過的幾行——這就是對 AI 的驗收,agent coding 從碰運氣變成有把握的分水嶺。
- 加碼一招:AI 提議把整頁改深色風格?開一條 branch(分支)——平行的草稿版——讓它去那裡盡情試,試壞整個丟掉,正式版一根汗毛不少;試成再併回來。
-
但新的問題來了……
- 一切都在我這台電腦裡。電腦壞了怎麼辦?出差只帶平板怎麼辦?而且我發現,想用那些雲端 AI coding 服務,人家開口第一句就是:「請提供你的 GitHub repo。」
-
-
第二章:「行動 coding 症」解藥是 GitHub
-
Pain Point:想離開這張書桌
- 備份是基本需求,行動才是真正的渴望——誰不想擺脫被綁在電腦前的日子?
- 更現實的是:雲端 AI coding 服務幾乎全都以 GitHub repo 為起點。 Claude Code on the web 如此,Google 的 Jules 如此,OpenAI 的 Codex 也如此。這一關不是「等有人來看我作品再說」,是想用這些服務就繞不過。
-
Story:寄信協作的歲月
- Git 解決了版本,但 Git 誕生後的頭幾年,「人跟人的協作」還停在石器時代:
- 把修改打包成 patch,用 email 寄給主管;
- 主管在信裡回「這裡不行,改掉」;
- 改完再寄一版;他滿意了才手動併入。
- 這個時代,版本歸工具管,溝通全靠人肉——寄信、回信、催件、對版本,全部線下手工。
- 2008 年 GitHub 看準的就是這塊痛:把「溝通」整個制度化,搬上網頁。 它蓋了一座「市中心公共檔案館」,倉庫 push(推送)上去,異地備份、隨處可取、公開門面一次完成;更重要的是檔案館附設了一整套櫃檯制度。
- 有人問:那不就是 Google Drive?只像一半——GDrive 存檔案的「現在」,GitHub 存檔案的「一生」:每版快照、整本記錄表、所有分支。
- Git 解決了版本,但 Git 誕生後的頭幾年,「人跟人的協作」還停在石器時代:
-
投影片時間:檔案館的櫃檯制度
- 想像有人要改你檔案館裡的簡報,櫃檯流程是這樣的:
- Fork:你檔案館的鑰匙不在他手上(複製了也推不回來),所以他先開一間掛他名字的分館,整份複製過去,分館他說了算。
- PR(Pull Request):他改好後遞一張申請單——「拜託把我做的拉進你的正式版」。主導權在你:是你來拉,不是他硬塞。
- Review:你在申請單上逐行留言——「這段會影響倒數計時,請改」。
- 同單補交:他改好不必重開單,原單多一筆紀錄,你再看一次。
- Merge:審查通過,他做的頁面換進正式版。
- Conflict:兩人改到同一行?機器不裁決,兩版攤開,人拼出定案再併。
- 申請、審查、補交、放行——這套櫃檯制度就是 GitHub 的本體:Git 解決版本的問題,GitHub 解決協作的問題。
- 想像有人要改你檔案館裡的簡報,櫃檯流程是這樣的:
-
回到我的報名頁:桌子搬上雲,隊友用 PR 交作業
- 行動這條路走到極致是 code-on-web:瀏覽器打開就上工,連開發環境都不裝。它的工作環境是一張用完即清的臨時桌——雲端沒有我的硬碟,所以上工先從 repo 調卷宗(clone),收工前必須歸檔(push),忘了歸檔就跟桌子一起被清掉。Repo 是雲端工作的唯一出入口。
- 這些服務還有個共同設計:怕 AI 大改闖禍。 你不在場盯著,AI 動輒改幾十個檔案,萬一改壞了呢?所以平台逼你把一切建立在版本記錄上——每一刀都有記錄、隨時整批退回。抽屜和記錄表在這裡從「好習慣」變成「強制配備」。
- 然後我發現,那套櫃檯制度我天天在用——因為雲端的 AI 隊友交作業的方式就是 PR:它不直接動正式版,開一條分支改,改完遞一張申請單給我。我當主管:review 留言、它同單補交、我 merge。撞到同一行就處理 conflict。
- 順帶的好消息:哪天 repo 紅了、真有陌生人來貢獻,他 fork、發 PR——流程跟審 AI 的一模一樣,你早就會了。
-
但新的問題來了……
- AI 隊友太勤勞了。半夜三點連推五十次,對它是日常——然後某天早上,我的 GitHub 帳號登不進去了。
-
-
第三章:「被 flag 症」解藥是 Gitea
-
Pain Point:帳號被停權的那一天
- Agent coding 的工作型態是高頻、批量、自動化的 commit 和 push。但在 GitHub 的風控眼裡,這長得跟機器人濫用一模一樣。輕則被 flag,重則停權——我被永久停權過兩次,資料拿不出來就算了,還損失了 100 顆星,GitHub 的星不同於 Facebook 的讚,一人只有一次機會,得來不易!
- 停權那一刻才發現:我的東西鎖在別人家。像不像 2005 年 BitKeeper 收回授權那一幕?同一齣戲,換了主角。
-
Story:想要一座完全屬於自己的檔案館
- 這個痛也有人先痛過。GitHub 再好,總有一群人不想把東西放別人家:想要完全私有的開發空間、想推什麼就推什麼、連哪些檔案要遮遮掩掩地排除都懶得設定——但 GitHub 不讓你自己架,另一個選擇 GitLab 又重得像航空母艦。
- 於是社群做出了 Gitea:開源、免費、輕量,租台小主機就架得起來,倉庫、PR、審查一應俱全,介面與 GitHub 大同小異。差別只有一個:鑰匙在你手上。 這是 Linus 那句「命脈不能握在任何人手裡」的平台版。
-
投影片時間:通訊錄裡可以有很多座檔案館
- 收回第一章的伏筆——「每一份副本都是完整的檔案館」。因為這句話,一個專案可以同時往好幾座檔案館推,機制叫 remote:
- 你手上這份工作目錄裡有一本通訊錄,每條是一個名字加一個地址——「舞台 → GitHub 上的某倉庫」「主場 → 我家 Gitea 的某倉庫」。
- Push 和 pull 時,指定要找哪一條。推主場就推主場,推舞台就推舞台,登記幾條都行,隨時增刪。
- 成立的底氣是 Git 的分散式設計:GitHub 上那份不是正本,Gitea 上那份也不是,我電腦裡這份同樣不是——沒有正本,全是平起平坐的完整副本,靠推送和拉取互相同步。
- 所以「GitHub 開 repo、在 Gitea 工作、再推回 GitHub」不是什麼駭客技巧,就是 Git 標準玩法。連 code-on-web 那張從 GitHub 長出來的臨時桌,也能在通訊錄加一條 Gitea 的地址直接推過去。
- 收回第一章的伏筆——「每一份副本都是完整的檔案館」。因為這句話,一個專案可以同時往好幾座檔案館推,機制叫 remote:
-
回到我的報名頁:配置成形
- 現在可以完整看懂開頭那三句話了:
- **GitHub 開 repo 當門面和雲端服務入口;
- 日常高頻工作全推自家 Gitea;
- 定期把成果批次推回 GitHub。**
- AI 半夜連推五十次?推自家 Gitea,沒人管。GitHub 只收到低頻、整批的正式成果,風控看我歲月靜好。一句話:練功房自己蓋,舞台借別人的。
- 現在可以完整看懂開頭那三句話了:
-
但新的問題來了……
- 搬家那天我又撞了一面牆:歷年的 PPT 檔案,推不上 Gitea,伺服器直接拒收。這面牆牽出另一個大主題——文字檔與 binary 的體質差異、以及為什麼你該少用 Word 和 PPT 當工作格式。下一篇再說。
-
-
終章:一串鍊子
- 回頭看,這是一串環環相扣的鍊子——每個工具都是別人為自己的痛做的,剛好治了我的痛:
-
他們的痛 他們做了 治好我的 被斷供、專案大到土法必死 Git 資料夾複製症 溝通靠寄信、協作全人肉 GitHub 行動 coding 症 想要完全自有、私有的開發空間 Gitea Agent 高頻被 flag 症 - 貫穿全程的主線,從 2005 年的 Linus 到被停權兩次的我,只有一條:你的工作成果,鑰匙要在自己手上。 Git 的分散式設計,就是把這句話寫進了工具的骨子裡。
-
附:比喻對照表
-
簡報世界 英文術語 縮寫 中文 整個簡報專案(含抽屜和記錄表) Repository Repo 倉庫 定版一次+記錄表填一行 Commit + commit message — 提交+提交說明 整本版本變更記錄表 Log — 歷史紀錄 攤開兩版差異,紅刪綠增 Difference Diff 差異比對 由內容算出的指紋(比特幣同類機制) Hash — 雜湊(指紋) 那張只增不改的目錄卡 Snapshot — 快照 整份複製帶回家 Clone — 複製倉庫 在自己桌上開的草稿版 Branch — 分支 在檔案館開一間掛自己名字的分館 Fork — 複刻(分館) 「拜託把我做的拉進正式版」的申請單 Pull Request PR 拉取請求 主管在單上逐行留言 Code Review CR 程式碼審查 換頁進正式版 Merge — 合併 兩人改同一行、機器不裁決 Conflict — 衝突 公布最新正式版 Push — 推送 去拿最新版回家同步 Pull / Fetch — 拉取/抓取 工作目錄裡的檔案館通訊錄 Remote — 遠端 市中心的公共檔案館 GitHub GH (公有代管平台) 自己家裡蓋的檔案館 Gitea / GitLab — (自架代管平台) 共享辦公室的臨時桌 code-on-web — 雲端開發環境
-
