給非技術人員的 Github 教學,Vibe Coding 必學的基礎技能
給非技術人員的 Github 教學,Vibe Coding 必學的基礎技能
Gary Chen 以記帳軟體開發為案例,用最白話的方式為非技術背景的 Vibe Coder 講解 Git 與 GitHub 的核心概念。從 GitHub 作為「程式碼專用 Google Drive」的定位出發,逐步拆解 Git 的版本管理機制:commit(存檔)、push(上傳雲端)、clone/pull(協作同步)、branch(分支隔離風險)、worktree(平行開發多工)、PR 與 merge(合併審核流程),以及 conflict 衝突處理和 restore/revert 救援方法。強調 Vibe Coder 不需要背指令,只要理解每個概念對應的開發痛點,就能自信地指揮 AI 完成版本控制。
GitHub 與 Git 的差別
1:02GitHub 是程式碼專用的雲端儲存平台,類似 Google Drive 但專為程式碼設計,讓有權限的人可以隨時查看甚至一起編輯。
Git 則是在本機端幫資料夾建立版本紀錄的工具。GitHub 不收單純的檔案,只接收已經做好版本紀錄的專案。
用 `git init` 指令告訴 Git 開始追蹤這個資料夾的所有變動。
基礎概念📋 本節指令一覽
git init
Commit:建立安全檢查點
3:21Commit 就像玩遊戲打大魔王之前的手動存檔。它幫程式碼建立一個絕對安全的檢查點,只要做了 Commit,這份正常狀態就被永久封存。
Commit 不是上傳,它只是在自己電腦裡幫目前的狀態留下一份紀錄。之後就算 AI 把程式碼全刪了或改亂,都可以瞬間還原回 Commit 時的完美狀態。
當 AI 問「要不要 Commit」,它其實是在問:現在這個好好的狀態,你要不要先存個檔、買個保險?
版本管理📋 本節指令一覽
git commit -m "訊息"
Push:把存檔送上雲端
3:21Push 才是真的把電腦裡存好的檔案推送到雲端的 GitHub 上。Commit 跟 Push 完全是兩回事。
第一次 Push 前必須先設定 Remote(遠端地址,即 GitHub 上的專案資料夾),通常預設名稱為 Origin。Main 代表專案目前的官方正式版本。
Push 到 Origin Main 的白話文:請幫我把現在寫好的正式版本,傳送到雲端的那個專案資料夾裡面。
⚠️ Push 前一定要確認機密檔案(API 金鑰、密碼等)已透過 `.gitignore` 排除,否則金鑰外洩就像把大門鑰匙公開貼在網路上。
雲端備份📋 本節指令一覽
git push origin maingit remote add origin <URL>
Clone 與 Pull:協作同步
6:11Clone 是把 GitHub 上的專案完整複製到自己的電腦,包含完整的 Git 追蹤紀錄。這跟網頁上的「Download ZIP」完全不同——ZIP 下載的只是純粹檔案,沒有版本紀錄,之後無法把改動同步回 GitHub。
Pull 是把 GitHub 上面最新版本的程式碼抓下來,同步到自己的電腦。
協作的基本循環:第一次加入專案用 Clone → 平常同步別人進度用 Pull → 自己改好東西先用 Commit 存檔 → 最後用 Push 送上雲端。
協作流程📋 本節指令一覽
git clone <URL>git pull origin main
Branch:隔離開發風險
6:11Branch(分支) 是 Git 裡非常關鍵的概念。所有專案一開始都有一條主線叫 Main,代表穩定運行的程式碼。
開 Branch 的目的是讓正在開發中、還不穩定的功能,跟已經寫好很穩定的功能徹底分開。
可以把專案資料夾想像成一張神奇辦公桌,Branch 就像桌子旁邊的平行時空切換按鈕。按 Main 看到穩定版本,按新功能 Branch 看到開發中的草稿。
如果新功能被 AI 改爛了,最壞的狀況就是把這個 Branch 直接刪掉,切回 Main,Main 依然毫髮無傷。
開發新功能的第一步:請 AI 開一個 Branch,接下來所有的改動和 Commit 都在這個 Branch 上做,絕對不要動到 Main。
風險隔離📋 本節指令一覽
git checkout -b <branch-name>git branchgit checkout main
Worktree:多 AI 平行開發
10:42Branch 的致命傷:雖然可以切換不同狀態,但同一時間只有一張辦公桌(一個資料夾)。如果兩個 AI 同時做事,一個要看資料庫藍圖、一個要看 UI 設計稿,他們會為了搶桌子而大打出手。
Worktree 就是直接去 IKEA 再買第二張實體辦公桌。Branch 是在同一張桌子上切換時空,Worktree 則是直接給你第二張實體的桌子,讓兩個時空同時並存在電腦裡。
AI 會生出兩個獨立的資料夾,但這兩張桌子連通同一個 Git 記憶庫。讓 Agent A 去第一張桌子負責資料庫 Branch,Agent B 去第二張桌子負責 UI Branch,平行開發效率直接拉滿。
以前的工程師不太用 Worktree(一次專心做一件事),但 Vibe Coder 會同時開兩三個 AI Agent,就一定會需要 Worktree。
多工開發📋 本節指令一覽
git worktree add <path> <branch>git worktree list
PR 與 Merge:合併審核流程
10:42PR(Pull Request) 是一份改動提案。功能寫完後,開 PR 把 Branch 上的改動送到 GitHub 上讓大家一起審核。
可以直接請 AI 代勞開 PR,內容說明做了什麼功能、改了哪些檔案、要怎麼測試。
審核通過後,按下 Merge 按鈕把程式碼正式合併回 Main 主線。
⚠️ 合併是在雲端網頁上發生的,自己電腦本機的 Main 不會自動同步。每次有新功能被合併進 Main 後,一定要切回本機的 Main 再執行一次 Pull,手動把雲端最新版本拉下來。
協作流程📋 本節指令一覽
git merge <branch-name>
Conflict:衝突處理
10:42當兩個人改到同一個檔案的同一個地方,Git 會跳出 Conflict(衝突) 警告。Git 發現同一段程式碼出現兩個不同版本,不知道該聽誰的。
現代 AI 工具(如 Claude Code)遇到 Conflict 時會自己判斷處理,通常有三種方式:
① 二選一:AI 判斷哪一版才是正確的邏輯,直接保留正確的那一邊。
② 兩邊都留:兩人剛好都在最後一行新增不同項目,Git 死板判定為衝突,但 AI 看得懂其實只是新增不同項目,會聰明地把兩個都保留下來。
③ 打掉重寫:兩邊邏輯硬拼在一起會出錯,AI 看懂雙方目的後,乾脆把那段程式碼重寫一遍,把兩邊功能順順接在一起。
如果 AI 卡住,Vibe Coder 要做的不是自己下去改程式,而是給出明確的產品決策方向,AI 就會自己挑選最適合的合併方式。
衝突解決改壞了怎麼救:Restore 與 Revert
15:53情境一:還沒 Commit — AI 剛改了一大堆檔案,跑了一下發現完全不對。對應的動作是 Restore,一鍵讀檔回到上一次的遊戲存檔點,當作剛剛 AI 亂寫的事情完全沒發生過。
情境二:已經 Commit 了 — 順手存檔後才驚覺那次 Commit 是錯的。安全的補救作法是 Revert。Revert 不是偷偷刪掉歷史紀錄,而是新增一個反向的 Commit,去把前面那次錯誤的改動抵消掉。
Revert 在跟朋友合作專案時特別安全,因為所有人都能在歷史紀錄裡看到「有加錯的東西 → 又被抵消掉」的完整過程。
這些指令都不用自己硬背。發現 AI 改壞時,直接跟 AI 說「剛剛這次的改動我不要了,請幫我回到上一個正常的版本」,AI 就會自己判斷該用 Restore 還是 Revert。
救援方法📋 本節指令一覽
git restore <file>git revert <commit-hash>
你不需要在今天逼自己變成 Git 專家,但你要知道,當 Claude 或 Cursor 問你要不要 commit、要不要開 branch、要不要發 PR 的時候,他其實是在問你:這次的開發你要不要先存檔?你要不要開個空間來隔離風險?你要不要把寫好的東西交出去給別人檢查?只要這些判斷你聽得懂,你用 AI 開發就會踏實很多。
重點時間戳索引
- 0:00AI 常問的 commit、branch、PR 等術語全都指向 Git 版本控制
- 1:02GitHub 是程式碼專用的雲端儲存平台,Git 是本機端的版本管理工具
- 3:21Commit 是在本機建立檢查點存檔,Push 才是把存檔推送到雲端 GitHub
- 6:11Clone 是完整複製專案(含 Git 紀錄),Pull 是同步他人最新進度
- 10:42Branch 是隔離開發風險的平行時空,Worktree 讓多個 AI Agent 可同時平行開發
- 15:53未 Commit 可用 Restore 一鍵復原,已 Commit 可用 Revert 安全抵消錯誤改動
🎙️ ASR 漂字對照表
| CodeCode / Clockode / ClawCode | → | Claude Code |
| Cold Code | → | Claude Code |
| Videcoder | → | Vibe Coder |
| Pool | → | Pull |
| Conflip | → | Conflict |
| Restore | → | Restore(正確) |
| Revert | → | Revert(正確) |
| Github | → | GitHub |
| EMV檔 | → | .env 檔 |
📎 原始內容(查證 / AI 追查用,非閱讀主文,點擊展開)
1 00:00:00,000 --> 00:00:04,600 如果你沒有程式背景,最近卻迷上了用AI寫程式,也就是所謂的vibe coding 2 00:00:04,600 --> 00:00:08,300 那你絕對遇過一種狀況,就是Claude或者Cursor突然問你 3 00:00:08,300 --> 00:00:11,900 要不要commit,要不要開個分支,或者是要不要發個pr 4 00:00:11,900 --> 00:00:17,000 這些聽起來像外新聞的術語,背後其實全都指向同一個東西,那就是git 5 00:00:17,000 --> 00:00:20,700 如果你每天被這些名詞轟炸,卻還是搞不懂他們到底在幹嘛 6 00:00:20,700 --> 00:00:22,800 那麼今天的影片你一定要看完 7 00:00:22,800 --> 00:00:28,000 我會用最白話的方式搭配實際的案例,帶你一次搞懂git和github的概念與用法 8 00:00:28,000 --> 00:00:32,000 同時,我也會告訴你,身為一個用AI寫程式的vibe coder 9 00:00:32,000 --> 00:00:35,000 要怎麼把這些工具無縫融入你的開發流程中 10 00:00:35,000 --> 00:00:40,000 讓你下次看到AI吐出這些專有名詞的時候,你就不會再心慌慌不知道自己在幹嘛了 11 00:00:40,000 --> 00:00:44,400 那我們就直接開始今天的主題,假設今天Gary心血來超,想要做一個記帳軟體 12 00:00:44,400 --> 00:00:50,000 於是他打開CodeCode,請AI幫忙,過沒多久,AI就順利幫他把第一版的畫面給做出來了 13 00:00:50,000 --> 00:00:55,000 但這個時候,Gary遇到了一個問題,我寫好的這些程式,到底可以放在哪裡呢? 14 00:00:55,000 --> 00:00:59,000 他不想讓程式只能留在這台電腦裡,畢竟他之後可能會想換別台電腦接著寫 15 00:00:59,000 --> 00:01:02,000 或者想把做好的東西分享給朋友看 16 00:01:02,000 --> 00:01:08,000 於是他就想,有沒有一種像Google Drive一樣的工具,可以讓我把程式碼直接存在雲端上呢? 17 00:01:08,000 --> 00:01:12,000 這時候,我們就會用到今天的第一個關鍵工具,也就是Github 18 00:01:12,000 --> 00:01:16,000 你可以先簡單把Github理解成程式碼專用的Google Drive 19 00:01:16,000 --> 00:01:23,000 工程師們都會把程式碼上傳到Github,讓有權限的人都能夠隨時查看,甚至是一起編輯 20 00:01:23,000 --> 00:01:28,000 但下一個問題就來了,我要怎麼把我電腦裡這些寫好程式的資料夾上傳到Github呢? 21 00:01:28,000 --> 00:01:33,000 其實啊,你不能像用Google Drive那樣,直接把整個資料夾拖進去就好 22 00:01:33,000 --> 00:01:40,000 你可以想像,我們以前寫報告的時候,資料夾裡常常會出現報告V1,報告最終版,報告打死不改版這種檔案 23 00:01:40,000 --> 00:01:44,000 像這樣留下每次修改歷史的行為,就叫做版本紀錄 24 00:01:44,000 --> 00:01:47,000 因為Github主要是用來讓大家協作跟追蹤程式碼進度的 25 00:01:47,000 --> 00:01:51,000 所以他不收單純的檔案,他只接收已經做好版本紀錄的專案 26 00:01:51,000 --> 00:01:57,000 也就是說,在上傳之前,你必須先在自己的電腦裡幫程式碼建立起這個紀錄系統 27 00:01:57,000 --> 00:02:01,000 而要幫資料夾建立這種版本紀錄的關鍵工具,就是Git 28 00:02:01,000 --> 00:02:04,000 我們可以想像一下,如果今天沒有Git,當Gary請AI幫忙加一個新功能 29 00:02:04,000 --> 00:02:07,000 結果AI不小心把原本好好的程式給改壞了 30 00:02:07,000 --> 00:02:11,000 這時候最崩潰的點在於,你根本不知道AI剛剛到底動了哪些檔案 31 00:02:11,000 --> 00:02:14,000 也完全不知道該怎麼讓程式恢復到上一個正常的狀態 32 00:02:14,000 --> 00:02:17,000 但如果有了Git,那就不一樣了 33 00:02:17,000 --> 00:02:21,000 不管AI怎麼亂改,你隨時都有辦法把程式回溯到之前正常的樣子 34 00:02:21,000 --> 00:02:26,000 所以,在把專案放上Github之前,Clocko通常會先問你要不要設定Git 35 00:02:26,000 --> 00:02:29,000 或者是直接幫你跑一行叫做GitInit的指令 36 00:02:29,000 --> 00:02:33,000 這行指令的意思非常簡單,它就是在跟Git這個版本管理工具說 37 00:02:33,000 --> 00:02:36,000 嘿,請你開始幫我追蹤這個資料夾裡的所有變動 38 00:02:36,000 --> 00:02:38,000 講到這裡,我們先停一下 39 00:02:38,000 --> 00:02:40,000 你只要先分清楚這兩個東西就好 40 00:02:40,000 --> 00:02:43,000 GitHub是在雲端儲存和管理程式碼的網站 41 00:02:43,000 --> 00:02:46,000 而Git則是幫你在本機端管理程式碼版本的工具 42 00:02:46,000 --> 00:02:48,000 回到Gary的例子 43 00:02:48,000 --> 00:02:51,000 因為他想把程式放到GitHub上,所以他現在的第一步 44 00:02:51,000 --> 00:02:55,000 就是必須先讓他電腦裡的資料夾開始被Git給追蹤 45 00:02:55,000 --> 00:02:58,000 設定好Git之後,Gary又繼續寫了一陣子 46 00:02:58,000 --> 00:03:00,000 好不容易終於把登錄頁面給做出來了 47 00:03:00,000 --> 00:03:02,000 他看著這個終於能順利運作的程式 48 00:03:02,000 --> 00:03:05,000 心裡想,我好不容易才把登錄功能搞定 49 00:03:05,000 --> 00:03:07,000 我想要在這邊先建立一個版本紀錄 50 00:03:07,000 --> 00:03:09,000 這樣萬一之後AI又把程式改壞了 51 00:03:09,000 --> 00:03:12,000 我才可以隨時退回到現在這個正常的狀態 52 00:03:12,000 --> 00:03:14,000 當你有這種想要存檔的念頭時 53 00:03:14,000 --> 00:03:18,000 你要知道,這就對應著Git裡面的Commit功能 54 00:03:18,000 --> 00:03:21,000 你可以把Commit想像成是在玩遊戲的時候 55 00:03:21,000 --> 00:03:24,000 打大魔王之前,你會先手動存檔的那個動作 56 00:03:24,000 --> 00:03:26,000 Commit最大的價值在於 57 00:03:26,000 --> 00:03:29,000 他幫你的程式碼建立了一個絕對安全的檢查點 58 00:03:29,000 --> 00:03:32,000 只要你做了Commit,這份正常的狀態就被永久封存了 59 00:03:32,000 --> 00:03:35,000 接下來就算AI發瘋,把你的程式碼全刪了 60 00:03:35,000 --> 00:03:36,000 或是改的亂七八糟 61 00:03:36,000 --> 00:03:40,000 你都可以瞬間把程式碼還原回你當初Commit的那個完美狀態 62 00:03:40,000 --> 00:03:43,000 所以當CodeCode幫你寫完一段程式 63 00:03:43,000 --> 00:03:46,000 主動問你要不要Commit的時候 64 00:03:46,000 --> 00:03:48,000 他其實就是在問你現在這個好好的狀態 65 00:03:48,000 --> 00:03:50,000 你要不要先幫他存個打賣個保險 66 00:03:50,000 --> 00:03:52,000 這裡有一個觀念一定要特別注意 67 00:03:52,000 --> 00:03:55,000 Commit不是上傳,也不是把東西放到GitHub上 68 00:03:55,000 --> 00:03:58,000 Commit只是單純在你自己的電腦裡面 69 00:03:58,000 --> 00:04:00,000 幫目前的狀態留下一份紀錄而已 70 00:04:00,000 --> 00:04:03,000 所以當你自己覺得這一版跑起來沒問題 71 00:04:03,000 --> 00:04:04,000 想要留個底的時候 72 00:04:04,000 --> 00:04:05,000 你也可以主動跟AI說 73 00:04:05,000 --> 00:04:07,000 現在這版測試都沒問題幫我Commit一下 74 00:04:07,000 --> 00:04:10,000 並且在訊息裡寫清楚這次修改了什麼 75 00:04:10,000 --> 00:04:13,000 好,現在Gary順利為他的登入頁面做了一個Commit存檔 76 00:04:13,000 --> 00:04:14,000 接著他一定會想 77 00:04:14,000 --> 00:04:17,000 既然我自己電腦裡已經有一個滿意的版本了 78 00:04:17,000 --> 00:04:19,000 我是不是該把它丟到網路上備份 79 00:04:19,000 --> 00:04:20,000 順便準備分享給朋友看呢 80 00:04:20,000 --> 00:04:23,000 當你有這種想把電腦裡存好的進度 81 00:04:23,000 --> 00:04:24,000 上傳到雲端的念頭時 82 00:04:24,000 --> 00:04:27,000 對應的Git動作就叫做Push 83 00:04:27,000 --> 00:04:29,000 這邊我們要再幫大家強調一次 84 00:04:29,000 --> 00:04:31,000 Commit跟Push完全是兩回事 85 00:04:31,000 --> 00:04:34,000 Commit只是在你自己的電腦裡面存檔 86 00:04:34,000 --> 00:04:36,000 而Push才是真的把你電腦裡存好的檔案 87 00:04:36,000 --> 00:04:38,000 推送到雲端的GitHub上 88 00:04:38,000 --> 00:04:41,000 不過在你真的把東西Push上去之前 89 00:04:41,000 --> 00:04:43,000 有一件事是所有Videcoder都要知道的 90 00:04:43,000 --> 00:04:45,000 不然可能會出大事 91 00:04:45,000 --> 00:04:47,000 因為Gary的記帳軟體裡面 92 00:04:47,000 --> 00:04:50,000 剛好藏了一把用來串接金流的API金鑰 93 00:04:50,000 --> 00:04:53,000 你可以把這種金鑰想像程式你家大門的鑰匙 94 00:04:53,000 --> 00:04:55,000 如果它跟著程式碼一起被Push到GitHub上 95 00:04:55,000 --> 00:04:58,000 就等於是你把鑰匙公開貼在網路上 96 00:04:58,000 --> 00:04:59,000 任何人都可以撿去用 97 00:04:59,000 --> 00:05:00,000 所以我可以撿去用 98 00:05:00,000 --> 00:05:01,800 甚至拿去倒刷你的信用卡帳號 99 00:05:02,300 --> 00:05:03,320 前面提到的情況 100 00:05:03,580 --> 00:05:05,380 就算AI把程式改壞的都還有舊 101 00:05:05,380 --> 00:05:07,160 但金鑰一旦外洩流傳出去 102 00:05:07,420 --> 00:05:08,440 那就真的救不回來了 103 00:05:08,700 --> 00:05:10,240 只能整把作廢重新申請 104 00:05:10,500 --> 00:05:11,780 就像信用卡被倒刷後 105 00:05:11,780 --> 00:05:13,820 只能掛失原本的卡片重新補發一張 106 00:05:14,600 --> 00:05:15,620 所以在Push之前 107 00:05:15,880 --> 00:05:16,900 我們會需要用到一個叫做 108 00:05:16,900 --> 00:05:17,660 Git Ignore的檔案 109 00:05:18,180 --> 00:05:19,200 它的作用非常單純 110 00:05:19,460 --> 00:05:20,220 就是用來告訴Git 111 00:05:20,480 --> 00:05:22,020 這些特定的檔案請不要追蹤 112 00:05:22,020 --> 00:05:23,040 也絕對不要上傳 113 00:05:23,560 --> 00:05:25,600 而且你根本不用自己去記哪些檔案改檔 114 00:05:25,600 --> 00:05:26,880 只要直接跟Cold Code說 115 00:05:26,880 --> 00:05:27,640 幫我確認 116 00:05:27,640 --> 00:05:28,920 EMV檔 密碼 117 00:05:29,180 --> 00:05:29,940 還有各種金鑰 118 00:05:30,200 --> 00:05:32,000 或者機密檔案都已經放進Git Ignore裡面 119 00:05:32,240 --> 00:05:33,520 絕對不要Cold Me上去 120 00:05:34,040 --> 00:05:34,560 這樣就可以了 121 00:05:35,060 --> 00:05:36,080 第一次做Push的時候 122 00:05:36,080 --> 00:05:37,360 你可能會看到AI跑出一些 123 00:05:37,620 --> 00:05:38,640 看起來很長的指令 124 00:05:38,900 --> 00:05:39,920 像是設定Remote啦 125 00:05:40,180 --> 00:05:41,720 或者是Push到Origin Main啦 126 00:05:42,480 --> 00:05:44,540 其實你完全不用被這些字眼給嚇到 127 00:05:45,040 --> 00:05:45,560 Remote 128 00:05:45,560 --> 00:05:46,840 顧名思義就是遠端的地址 129 00:05:47,360 --> 00:05:48,640 跟它相對應的叫做Local 130 00:05:48,640 --> 00:05:50,160 也就是你電腦本地的資料夾 131 00:05:50,680 --> 00:05:51,440 而Origin 132 00:05:51,700 --> 00:05:53,500 通常就是指你在Github上的那個 133 00:05:53,760 --> 00:05:54,520 專案資料夾 134 00:05:55,040 --> 00:05:55,540 至於Main 135 00:05:55,540 --> 00:05:57,600 則代表這個專案目前的官方正式 136 00:05:58,400 --> 00:05:59,940 所以Push到Origin Main 137 00:06:00,200 --> 00:06:01,220 翻譯成白話文就是 138 00:06:01,480 --> 00:06:03,780 請幫我把現在寫好的這個正式版本 139 00:06:04,040 --> 00:06:06,860 傳送到雲端的那個專案資料夾裡面 140 00:06:07,620 --> 00:06:08,640 順利上傳之後 141 00:06:08,900 --> 00:06:10,960 Gary很開心的把Github的連結丟給他的朋友 142 00:06:11,720 --> 00:06:13,000 朋友收到連結之後就會想 143 00:06:13,260 --> 00:06:15,820 那我要怎麼把這個專案抓到我自己的電腦裡呢 144 00:06:16,080 --> 00:06:18,120 而且我不只想要拿到現在的檔案 145 00:06:18,380 --> 00:06:19,660 如果之後我修改了程式 146 00:06:19,920 --> 00:06:21,960 我也想把它上傳回Gary的Github裡面 147 00:06:22,220 --> 00:06:24,000 這樣我們就可以一起維護這套程式 148 00:06:24,760 --> 00:06:27,580 當朋友有這種想一起共同編輯這個專案的念頭時 149 00:06:27,840 --> 00:06:28,860 他需要的動作 150 00:06:29,120 --> 00:06:30,140 就叫做Clone 151 00:06:30,660 --> 00:06:31,680 這裡也要特別注意喔 152 00:06:31,940 --> 00:06:33,220 Clone跟你在Github網頁上 153 00:06:33,480 --> 00:06:34,500 常看到的另一個選項 154 00:06:34,760 --> 00:06:35,000 Download zip 155 00:06:35,260 --> 00:06:36,280 是完全不一樣的東西 156 00:06:37,320 --> 00:06:38,340 如果你只是按Download zip 157 00:06:38,340 --> 00:06:39,620 那你抓下來的 158 00:06:39,880 --> 00:06:41,420 就只是一包純粹的檔案 159 00:06:41,660 --> 00:06:43,460 裡面完全沒有被Gith追蹤的紀錄 160 00:06:43,980 --> 00:06:44,480 這樣一來 161 00:06:44,740 --> 00:06:46,280 如果Gary的朋友之後改了程式碼 162 00:06:46,540 --> 00:06:48,580 他是沒辦法把改動同步回Github上的 163 00:06:49,100 --> 00:06:50,880 但如果是用Clone把專案抓下來 164 00:06:51,140 --> 00:06:51,660 那就等於是 165 00:06:51,900 --> 00:06:52,940 你正式加入了這個專案 166 00:06:53,440 --> 00:06:55,500 只要Gary有在Github上把你加入成協作者 167 00:06:55,740 --> 00:06:57,020 之後你做了任何修改 168 00:06:57,280 --> 00:06:58,060 想要上傳回去 169 00:06:58,300 --> 00:06:59,080 都會非常輕鬆 170 00:06:59,580 --> 00:07:00,100 過沒多久 171 00:07:00,360 --> 00:07:02,140 Gary的朋友幫忙增加了一個新的功能 172 00:07:02,660 --> 00:07:03,420 Gary這時候就想 173 00:07:03,680 --> 00:07:04,960 朋友剛剛已經把新寫好的東西 174 00:07:05,220 --> 00:07:05,980 推送到雲端了 175 00:07:05,980 --> 00:07:08,800 那我自己的電腦要怎麼拿到他最新改好的版本呢 176 00:07:09,300 --> 00:07:10,080 這邊對應的Git 177 00:07:10,340 --> 00:07:10,840 指令 178 00:07:11,100 --> 00:07:11,620 就叫做 179 00:07:11,860 --> 00:07:12,120 Pol 180 00:07:12,380 --> 00:07:14,940 他會把Github上面最新版本的程式碼給抓下來 181 00:07:15,460 --> 00:07:16,740 並且同步到Gary自己的電腦裡 182 00:07:17,500 --> 00:07:18,020 所以 183 00:07:18,260 --> 00:07:19,800 如果以後你要跟朋友一起用AI寫程式 184 00:07:20,060 --> 00:07:21,860 你們合作的基礎循環就會是這個樣子 185 00:07:22,360 --> 00:07:24,420 第一次加入專案要把程式碼抓下來 186 00:07:24,660 --> 00:07:25,180 叫做Clone 187 00:07:25,940 --> 00:07:27,740 平常想同步別人的最新進度 188 00:07:28,000 --> 00:07:28,500 叫做Pool 189 00:07:29,020 --> 00:07:30,560 自己改好東西想要存檔 190 00:07:30,820 --> 00:07:31,580 先用Commit 191 00:07:32,100 --> 00:07:33,880 最後想把自己的進度送上雲端 192 00:07:34,140 --> 00:07:34,660 就用Push 193 00:07:34,660 --> 00:07:35,940 把這個合作 194 00:07:36,200 --> 00:07:37,220 循環建立起來之後 195 00:07:37,480 --> 00:07:37,980 接下來 196 00:07:38,500 --> 00:07:39,260 Gary準備要來 197 00:07:39,520 --> 00:07:40,300 開發一個大功能了 198 00:07:41,060 --> 00:07:43,620 他這次想要幫記帳軟體加上資料庫的功能 199 00:07:43,880 --> 00:07:45,420 這樣就能儲存用戶的資料 200 00:07:46,180 --> 00:07:46,700 但是 201 00:07:46,940 --> 00:07:48,740 他不想要直接在目前的穩定版本 202 00:07:49,000 --> 00:07:50,280 也就是我們剛剛提到的main 203 00:07:50,540 --> 00:07:50,780 上面 204 00:07:51,040 --> 00:07:52,320 去開發這個新功能 205 00:07:52,580 --> 00:07:52,840 因為 206 00:07:53,100 --> 00:07:53,860 Gary是vibecoder 207 00:07:54,120 --> 00:07:55,660 他很怕把自己辛辛苦苦的東西 208 00:07:55,900 --> 00:07:56,420 改爆了 209 00:07:56,940 --> 00:07:58,460 這時候就要引進Git裡面 210 00:07:58,720 --> 00:07:59,740 另一個非常關鍵的概念 211 00:08:00,000 --> 00:08:01,020 也就是分支 212 00:08:01,280 --> 00:08:01,800 英文叫做 213 00:08:02,060 --> 00:08:02,300 branch 214 00:08:02,300 --> 00:08:04,340 在Git的世界裡 215 00:08:04,600 --> 00:08:05,380 所有的專案 216 00:08:05,620 --> 00:08:06,660 一開始都會有一條主線 217 00:08:06,900 --> 00:08:07,420 叫做main 218 00:08:07,680 --> 00:08:08,700 這條線代表的是 219 00:08:08,960 --> 00:08:10,240 穩定運行中的程式碼 220 00:08:11,000 --> 00:08:12,020 我們之所以要開branch 221 00:08:12,280 --> 00:08:13,560 目的其實非常單純 222 00:08:13,820 --> 00:08:15,100 就是要讓正在開發中 223 00:08:15,360 --> 00:08:16,120 還不穩定的功能 224 00:08:16,380 --> 00:08:17,920 跟已經寫好很穩定的功能 225 00:08:18,180 --> 00:08:18,680 徹底分開 226 00:08:18,940 --> 00:08:19,960 讓他們緊隨不犯河水 227 00:08:20,480 --> 00:08:21,240 這時候你肯會想 228 00:08:21,500 --> 00:08:22,520 既然我前面已經學會 229 00:08:22,780 --> 00:08:23,040 用commit 230 00:08:23,300 --> 00:08:23,800 來存檔了 231 00:08:24,320 --> 00:08:26,100 那我直接讓AI在main主線上面改 232 00:08:26,360 --> 00:08:27,140 如果他改壞了 233 00:08:27,380 --> 00:08:28,420 我再退回到上一個commit 234 00:08:28,660 --> 00:08:28,920 不就好了嗎 235 00:08:29,180 --> 00:08:30,460 為什麼大家都一定要叫我開一個 236 00:08:30,720 --> 00:08:31,480 叫做branch的東西呢 237 00:08:32,240 --> 00:08:33,020 其實原因很簡單 238 00:08:33,520 --> 00:08:36,080 因為當AI在幫你寫比較複雜的大功能時 239 00:08:36,340 --> 00:08:37,360 他通常不會 240 00:08:37,620 --> 00:08:38,140 一次就寫對 241 00:08:38,400 --> 00:08:40,180 而是會需要反覆試錯 242 00:08:40,440 --> 00:08:40,960 修改好幾次 243 00:08:41,720 --> 00:08:43,260 如果你一直都在main上面讓他改 244 00:08:43,520 --> 00:08:45,560 那在AI試錯的這段期間 245 00:08:45,820 --> 00:08:47,100 你的程式就會一直處於一種 246 00:08:47,360 --> 00:08:48,380 半壞掉的狀態 247 00:08:48,880 --> 00:08:50,680 這時候如果朋友突然想看看你的 248 00:08:50,940 --> 00:08:51,440 記帳軟體 249 00:08:51,700 --> 00:08:52,220 或者是 250 00:08:52,480 --> 00:08:53,760 你突然發現畫面上有一處 251 00:08:54,000 --> 00:08:55,280 拼置錯誤需要緊急修正 252 00:08:55,540 --> 00:08:56,320 你就會非常尷尬 253 00:08:56,820 --> 00:08:58,360 因為你這條作為專案 254 00:08:58,620 --> 00:08:59,380 門面的main 255 00:08:59,640 --> 00:09:00,660 現在根本就跑不動 256 00:09:00,660 --> 00:09:02,200 你可以把你的專案資料夾 257 00:09:02,460 --> 00:09:04,500 想像成一張神奇辦公桌 258 00:09:04,760 --> 00:09:05,260 而branch 259 00:09:05,520 --> 00:09:06,800 就像是這張桌子旁邊的 260 00:09:07,060 --> 00:09:08,080 平行時空切換按鈕 261 00:09:08,600 --> 00:09:09,360 當你按下main 262 00:09:09,620 --> 00:09:10,140 桌上會呈現 263 00:09:10,380 --> 00:09:11,420 穩定版本的程式碼 264 00:09:11,660 --> 00:09:12,700 當你按下新功能branch 265 00:09:12,940 --> 00:09:15,760 桌上的東西會瞬間變成你正在開發中的草稿 266 00:09:16,540 --> 00:09:17,040 也就是說 267 00:09:17,300 --> 00:09:19,340 branch讓你可以隨時在同一張辦公桌上 268 00:09:19,600 --> 00:09:20,620 安全地把不同任務的進度 269 00:09:20,880 --> 00:09:21,400 切換來 270 00:09:21,660 --> 00:09:21,900 切換去 271 00:09:22,160 --> 00:09:23,440 不用擔心弄亂原本的東西 272 00:09:24,220 --> 00:09:26,260 如果這個新功能的草稿真的被AI改爛了 273 00:09:26,260 --> 00:09:28,560 最壞的狀況就是把這個branch直接刪掉 274 00:09:28,820 --> 00:09:29,580 然後切回main 275 00:09:29,840 --> 00:09:31,120 而你的main依然毫法無傷 276 00:09:31,900 --> 00:09:32,400 所以你可以這樣記 277 00:09:32,660 --> 00:09:34,460 當你準備要開發一個新功能的時候 278 00:09:34,700 --> 00:09:36,240 第一步就是請AI開一個branch 279 00:09:36,760 --> 00:09:38,300 然後接下來所有的程式改動 280 00:09:38,540 --> 00:09:39,820 都在這個branch上面做 281 00:09:40,080 --> 00:09:40,340 commit 282 00:09:40,600 --> 00:09:41,620 在這個時代 283 00:09:41,880 --> 00:09:43,420 我不會說你必須要學會 284 00:09:43,660 --> 00:09:43,920 git指令 285 00:09:44,180 --> 00:09:45,460 但你一定要知道這些名詞 286 00:09:45,720 --> 00:09:46,480 功能是幹嘛的 287 00:09:46,740 --> 00:09:48,280 這樣你就可以直接跟AI說 288 00:09:48,540 --> 00:09:50,580 嘿先幫我從main開一條新的branch 289 00:09:50,580 --> 00:09:53,140 專門用來做這次的資料庫功能 290 00:09:53,660 --> 00:09:55,180 之後所有的改動都幫我commit 291 00:09:55,440 --> 00:09:55,960 在這條branch上 292 00:09:56,220 --> 00:09:56,980 絕對不要動到面 293 00:09:58,000 --> 00:09:59,280 不過現在情況又變了 294 00:09:59,800 --> 00:10:00,060 Garry 295 00:10:00,000 --> 00:10:02,500 Tabby在等Clockode開發資料庫功能的同時 296 00:10:02,500 --> 00:10:03,900 他又想要開另一個Clockode 297 00:10:03,900 --> 00:10:05,700 來幫他重新設計UI畫面 298 00:10:06,300 --> 00:10:09,400 但如果你直接叫AI同時在同一個資料夾裡做這兩件事 299 00:10:09,400 --> 00:10:10,800 那絕對會是一場災難 300 00:10:11,300 --> 00:10:12,200 為什麼呢? 301 00:10:12,200 --> 00:10:14,400 回到剛剛神奇辦公桌的比喻 302 00:10:14,400 --> 00:10:16,000 Branch的致命傷在於 303 00:10:16,000 --> 00:10:17,900 雖然你可以切換不同狀態 304 00:10:17,900 --> 00:10:20,500 但你終究只有一張辦公桌 305 00:10:20,500 --> 00:10:21,300 也就是說 306 00:10:21,300 --> 00:10:25,100 這張桌子同一個時間只能顯示一個平行時空 307 00:10:25,100 --> 00:10:28,400 如果你硬要叫兩個AI同時在這唯一的一張桌子上做事 308 00:10:28,400 --> 00:10:30,100 一個要看資料庫藍圖 309 00:10:30,100 --> 00:10:31,600 一個要看UI設計稿 310 00:10:31,600 --> 00:10:34,800 他們就會為了搶這張桌子的顯示狀態而大打出手 311 00:10:34,800 --> 00:10:36,700 你明明在開發資料庫的Branch上 312 00:10:36,700 --> 00:10:38,800 裡面卻混進了修改UI的commit 313 00:10:38,800 --> 00:10:41,500 這會讓整個Git的狀態變得非常混亂 314 00:10:41,500 --> 00:10:42,300 為了解決這個問題 315 00:10:42,300 --> 00:10:45,000 我們就需要認識WorkTree這個超好用的功能 316 00:10:45,000 --> 00:10:46,400 既然一張桌子不夠用 317 00:10:46,400 --> 00:10:47,900 最暴力的解決辦法是什麼? 318 00:10:47,900 --> 00:10:49,300 就是直接去IKEA 319 00:10:49,300 --> 00:10:51,900 再買第二張實體的辦公桌放在旁邊 320 00:10:51,900 --> 00:10:52,800 你可以這樣想 321 00:10:52,800 --> 00:10:55,400 Branch像是在同一張桌子上切換不同的時空 322 00:10:55,400 --> 00:10:57,300 同一個時間你只能看見一個畫面 323 00:10:57,300 --> 00:11:00,200 而WorkTree則是直接給你第二張實體的桌子 324 00:11:00,200 --> 00:11:02,900 讓兩個時空可以同時並存在你的電腦裡 325 00:11:02,900 --> 00:11:05,800 所以當你跟ClawCode說你要開一個新的WorkTree時 326 00:11:05,800 --> 00:11:07,200 它其實就是在你電腦裡 327 00:11:07,200 --> 00:11:09,300 生出一個全新的實體資料夾 328 00:11:09,300 --> 00:11:11,100 也就是這第二張桌子 329 00:11:11,100 --> 00:11:13,300 所以如果Gary想同時開發資料庫 330 00:11:13,300 --> 00:11:14,200 又想修改UI 331 00:11:14,200 --> 00:11:16,100 他就可以請AI開兩個WorkTree 332 00:11:16,100 --> 00:11:19,000 這時候AI就會生出兩個獨立的資料夾 333 00:11:19,000 --> 00:11:19,800 最棒的是 334 00:11:19,800 --> 00:11:22,100 這兩張桌子是連通同一個Git記憶庫的 335 00:11:22,100 --> 00:11:25,300 所以你可以讓Agent A去第一張桌子負責資料庫的Branch 336 00:11:25,300 --> 00:11:28,200 讓Agent B去第二張桌子負責UI的Branch 337 00:11:28,200 --> 00:11:28,900 這樣一來 338 00:11:28,900 --> 00:11:31,800 這兩個AI就像是擁有了各自專屬的實體辦公桌 339 00:11:31,800 --> 00:11:33,900 能在各自的資料夾裡各私其職 340 00:11:33,900 --> 00:11:35,500 平行開發的效率直接拉滿 341 00:11:35,500 --> 00:11:37,500 完全不會互相干擾 342 00:11:37,500 --> 00:11:39,700 以前的工程師其實不太會用到WorkTree 343 00:11:39,700 --> 00:11:41,400 畢竟一個人沒有三頭六臂 344 00:11:41,400 --> 00:11:43,500 一次大概也就是專心做一件事 345 00:11:43,500 --> 00:11:44,900 但是現在時代不一樣了 346 00:11:44,900 --> 00:11:46,200 身為一個Vibe Coder 347 00:11:46,200 --> 00:11:48,900 你真的很有可能會同時開兩三個AI Agent 348 00:11:48,900 --> 00:11:50,200 讓他們平行工作 349 00:11:50,200 --> 00:11:51,400 而不是呆呆地排隊 350 00:11:51,400 --> 00:11:53,200 等一個做完才換下一個 351 00:11:53,200 --> 00:11:53,900 這時候 352 00:11:53,900 --> 00:11:55,900 你就一定會需要用到WorkTree 353 00:11:55,900 --> 00:11:56,800 過了一陣子 354 00:11:56,800 --> 00:11:59,200 Gary讓好幾個AI在各自的工作區裡 355 00:11:59,200 --> 00:12:02,000 順利把自己負責的新功能都寫完了 356 00:12:02,000 --> 00:12:02,700 這時候 357 00:12:02,700 --> 00:12:05,100 他想要把這條Branch上做好的功能 358 00:12:05,100 --> 00:12:06,800 在正式合併進Main之前 359 00:12:06,800 --> 00:12:09,100 先丟給朋友Review檢查一下 360 00:12:09,100 --> 00:12:10,000 這個動作 361 00:12:10,000 --> 00:12:12,100 在GitHub上就叫做開PR 362 00:12:12,100 --> 00:12:14,200 PR的全名叫做Pool Request 363 00:12:14,200 --> 00:12:17,100 你可以先把它想像成是一份改動提案 364 00:12:17,100 --> 00:12:18,200 當你開好PR之後 365 00:12:18,200 --> 00:12:19,900 這份提案就會被送到GitHub上 366 00:12:19,900 --> 00:12:22,700 讓大家一起來審核這次的改動合不合理 367 00:12:22,700 --> 00:12:24,100 而且開PR這件事 368 00:12:24,100 --> 00:12:25,300 你也不用自己動手 369 00:12:25,300 --> 00:12:27,100 可以直接請AI代勞 370 00:12:27,100 --> 00:12:28,800 只要跟你的Agent說 371 00:12:28,800 --> 00:12:30,700 幫我把這條Branch開一個PR 372 00:12:30,700 --> 00:12:32,600 內容說明一下這次做了什麼功能 373 00:12:32,600 --> 00:12:33,600 改了哪些檔案 374 00:12:33,600 --> 00:12:35,100 還有要怎麼去測試它 375 00:12:35,100 --> 00:12:37,300 AI就會幫你把這份提案整理得清清楚楚 376 00:12:37,300 --> 00:12:39,400 讓幫你Review的人一看就懂 377 00:12:39,400 --> 00:12:40,800 當大家都檢查過 378 00:12:40,800 --> 00:12:43,300 覺得Gary這次的改動完全沒有問題之後 379 00:12:43,300 --> 00:12:44,100 最後一個動作 380 00:12:44,100 --> 00:12:45,800 就是要將這次的程式碼變動 381 00:12:45,800 --> 00:12:47,800 正式合併回主線main裡面 382 00:12:47,800 --> 00:12:49,400 這個合併的動作 383 00:12:49,400 --> 00:12:50,700 對應的Git指令 384 00:12:50,700 --> 00:12:51,900 就叫做Merge 385 00:12:51,900 --> 00:12:53,300 當大家在GitHub網頁上 386 00:12:53,300 --> 00:12:54,400 按下Merge按鈕之後 387 00:12:54,400 --> 00:12:56,300 雲端上的main就正式更新了 388 00:12:56,300 --> 00:12:59,200 這邊要提醒一個新手最容易誤會的地方 389 00:12:59,200 --> 00:13:01,900 因為這個合併是在雲端網頁上發生的 390 00:13:01,900 --> 00:13:03,400 所以你自己電腦本機裡的main 391 00:13:03,400 --> 00:13:05,400 並不會自動通靈跟著變 392 00:13:05,400 --> 00:13:07,200 很多人會有一種錯覺 393 00:13:07,200 --> 00:13:09,800 以為我在VS Code或者是Cursor裡面看到的程式碼 394 00:13:09,800 --> 00:13:11,400 就是GitHub上最新的版本 395 00:13:11,400 --> 00:13:12,400 其實並不是 396 00:13:12,400 --> 00:13:15,100 你看到的永遠都是你電腦本機目前的狀態 397 00:13:15,100 --> 00:13:16,200 雲端更新了 398 00:13:16,200 --> 00:13:19,200 你的電腦是不會通靈自動去同步的 399 00:13:19,200 --> 00:13:19,700 所以 400 00:13:19,700 --> 00:13:22,100 每次只要有新功能被合併進man之後 401 00:13:22,100 --> 00:13:23,700 一定要記得切回本機的man 402 00:13:23,700 --> 00:13:25,600 並且叫你的agent再執行一次pool 403 00:13:25,600 --> 00:13:28,100 手動把雲端最新的版本給拉下來 404 00:13:28,100 --> 00:13:28,700 這樣一來 405 00:13:28,700 --> 00:13:30,100 你下次開新的branch 406 00:13:30,100 --> 00:13:31,800 才是從最新的進度出發 407 00:13:31,800 --> 00:13:34,400 而不會一直活在一個過時的舊版本裡 408 00:13:34,400 --> 00:13:35,100 不過 409 00:13:35,100 --> 00:13:36,700 在合併程式碼的過程中 410 00:13:36,700 --> 00:13:39,000 有時候會遇到另一種讓人頭痛的狀況 411 00:13:39,000 --> 00:13:40,200 那就是conflict 412 00:13:40,200 --> 00:13:42,000 也就是所謂的衝突 413 00:13:42,000 --> 00:13:42,600 假設 414 00:13:42,600 --> 00:13:45,400 Gary跟朋友剛好都改到了同一個檔案的同一個地方 415 00:13:45,400 --> 00:13:48,400 或者是兩個ai agent剛好去動到的同一段核心邏輯 416 00:13:48,400 --> 00:13:49,100 這時候 417 00:13:49,100 --> 00:13:51,600 Git就會跳出conflict的警告 418 00:13:51,600 --> 00:13:53,300 conflict的意思很直白 419 00:13:53,300 --> 00:13:55,500 就是Git發現同一段程式碼內容 420 00:13:55,500 --> 00:13:57,800 現在竟然出現了兩個完全不同的版本 421 00:13:57,800 --> 00:13:59,600 他不知道該聽誰的 422 00:13:59,600 --> 00:14:01,000 在現在ai coding的時代 423 00:14:01,000 --> 00:14:02,200 像clock code這種工具 424 00:14:02,200 --> 00:14:05,300 遇到conflict時是會自己去判斷跟處理的 425 00:14:05,300 --> 00:14:06,900 那他是怎麼處理的呢? 426 00:14:06,900 --> 00:14:08,400 當Git發現衝突時 427 00:14:08,400 --> 00:14:10,600 他會在檔案裡留下一些特殊的標記 428 00:14:10,600 --> 00:14:13,300 把兩邊打架的程式碼上下並列出來 429 00:14:13,300 --> 00:14:14,800 ai看到這些標記之後 430 00:14:14,800 --> 00:14:17,200 會先去分析這兩個版本各自到底想做什麼 431 00:14:17,200 --> 00:14:20,000 然後通常會用以下這三種方式來幫你合併 432 00:14:20,000 --> 00:14:21,500 第一種方式是二選一 433 00:14:21,500 --> 00:14:24,300 如果ai判斷出朋友改的那一版才是最新的邏輯 434 00:14:24,300 --> 00:14:27,000 或者是你原本的寫法有個bug剛好被朋友給修好了 435 00:14:27,000 --> 00:14:28,400 他就會直接捨棄舊的寫法 436 00:14:28,400 --> 00:14:30,000 只保留正確的那一邊 437 00:14:30,000 --> 00:14:31,800 第二種方式是兩邊都留 438 00:14:31,800 --> 00:14:33,700 你可能會想既然兩邊不衝突 439 00:14:33,700 --> 00:14:35,300 Git怎麼還會跳警告呢? 440 00:14:35,300 --> 00:14:37,700 這是因為有時候你們剛好改到的同一行程式 441 00:14:37,700 --> 00:14:38,600 Git比較死板 442 00:14:38,600 --> 00:14:40,200 只要看到同一行被兩個人動過 443 00:14:40,200 --> 00:14:41,700 他就會判定為衝突 444 00:14:41,700 --> 00:14:44,400 比如Gary在清單的最後一行加了理財分類 445 00:14:44,400 --> 00:14:47,000 而朋友也在最後一行加了日常分類 446 00:14:47,000 --> 00:14:48,700 Git嚇死了以為這就是衝突 447 00:14:48,700 --> 00:14:51,400 但ai看得懂這其實只是在新增不同的項目 448 00:14:51,400 --> 00:14:53,400 他就會很聰明的幫你解開這個衝突 449 00:14:53,400 --> 00:14:55,000 把兩個項目都保留下來 450 00:14:55,000 --> 00:14:56,200 湊進同一個選單裡 451 00:14:56,200 --> 00:14:57,600 皆大歡喜 452 00:14:57,600 --> 00:14:58,900 至於第三種就比較特別啦 453 00:14:58,900 --> 00:15:00,000 叫做打掉重 454 00:15:00,000 --> 00:15:00,760 別人幫你改寫 455 00:15:01,020 --> 00:15:02,040 很多時候 456 00:15:02,300 --> 00:15:04,360 兩個人改的邏輯如果硬生生拼在一起 457 00:15:04,360 --> 00:15:05,880 程式很可能會直接出錯 458 00:15:06,140 --> 00:15:08,440 這時候AI在看懂你們雙方的目的之後 459 00:15:08,440 --> 00:15:10,760 會乾脆把那一段程式碼重寫一遍 460 00:15:10,760 --> 00:15:13,560 用新的寫法把兩邊的功能順順的接在一起 461 00:15:14,080 --> 00:15:16,120 雖然AI有這幾種聰明的合併方法 462 00:15:16,380 --> 00:15:18,440 但他終究不知道你的產品規劃是什麼 463 00:15:18,940 --> 00:15:20,480 如果Gary跟朋友改的邏輯 464 00:15:20,740 --> 00:15:22,280 在產品邏輯上是互相衝突的 465 00:15:22,520 --> 00:15:23,300 AI就會卡住 466 00:15:23,560 --> 00:15:24,840 不知道該選哪一種方法 467 00:15:25,340 --> 00:15:26,120 所以這時候 468 00:15:26,360 --> 00:15:27,140 身為一個vibe coder 469 00:15:27,140 --> 00:15:28,920 你要做的不是自己下去改程式 470 00:15:28,920 --> 00:15:30,200 而是要給出明確的 471 00:15:30,200 --> 00:15:30,960 產品決策 472 00:15:31,220 --> 00:15:32,240 你只要跟AI說 473 00:15:32,500 --> 00:15:33,780 幫我解掉這個conflict 474 00:15:34,300 --> 00:15:36,080 分類列表的邏輯以朋友的為主 475 00:15:36,340 --> 00:15:37,880 但是把我的理財分類 476 00:15:38,140 --> 00:15:39,920 移到右邊的進階選單裡面 477 00:15:40,700 --> 00:15:42,740 只要你把取捨的方向跟規則講清楚 478 00:15:43,000 --> 00:15:45,040 AI就會自己挑選最適合的合併方式 479 00:15:45,300 --> 00:15:46,320 幫你把衝突的程式碼 480 00:15:46,580 --> 00:15:47,360 完美的結合起來 481 00:15:47,860 --> 00:15:48,120 最後 482 00:15:48,380 --> 00:15:50,680 我們來聊聊vibe coder每天都在怕的時刻 483 00:15:50,940 --> 00:15:51,440 那就是 484 00:15:51,700 --> 00:15:53,240 如果AI把程式碼改壞了 485 00:15:53,500 --> 00:15:54,260 到底該怎麼救 486 00:15:54,780 --> 00:15:57,600 這裡我們分成兩種最常見的情境來討論 487 00:15:57,600 --> 00:15:59,140 第一種情境是 488 00:15:59,400 --> 00:16:00,420 你還沒commit 489 00:16:00,920 --> 00:16:02,460 AI剛剛幫你改了一大堆檔案 490 00:16:02,720 --> 00:16:04,260 你跑了一下發現完全不對 491 00:16:04,520 --> 00:16:06,040 但好險你還沒有把他們存成commit 492 00:16:06,560 --> 00:16:08,100 當你有我確定不要這批改動了 493 00:16:08,360 --> 00:16:10,140 我要回到上一次正常狀態的念頭時 494 00:16:10,400 --> 00:16:11,940 對應的動作叫做restore 495 00:16:12,440 --> 00:16:12,960 白話一點說 496 00:16:13,220 --> 00:16:14,500 它就是讓你一鍵獨檔 497 00:16:14,760 --> 00:16:15,780 回到上一次的遊戲存檔點 498 00:16:16,040 --> 00:16:18,600 就當作剛剛AI亂寫的事情完全沒發生過 499 00:16:19,360 --> 00:16:20,120 第二種前進是 500 00:16:20,380 --> 00:16:21,160 你已經commit了 501 00:16:21,660 --> 00:16:22,680 你順手存檔之後 502 00:16:22,940 --> 00:16:23,720 跑了一下程式 503 00:16:23,960 --> 00:16:25,240 才驚覺剛剛那次commit 504 00:16:25,500 --> 00:16:26,020 根本是錯的 505 00:16:26,020 --> 00:16:29,600 這時候比較安全的補救作法通常是revert 506 00:16:30,120 --> 00:16:30,620 要注意喔 507 00:16:30,880 --> 00:16:32,940 revert不是偷偷把你的歷史紀錄給刪掉 508 00:16:33,440 --> 00:16:34,720 它是去新增 509 00:16:34,980 --> 00:16:36,260 一個反向的commit 510 00:16:36,520 --> 00:16:38,560 去把前面那次錯誤的改動給 511 00:16:38,820 --> 00:16:39,340 抵消掉 512 00:16:39,840 --> 00:16:42,140 這個做法在跟朋友合作專案的時候特別安全 513 00:16:42,660 --> 00:16:44,200 因為所有人都能在歷史紀錄裡 514 00:16:44,460 --> 00:16:45,480 看到有加錯的東西 515 00:16:45,740 --> 00:16:47,260 然後又被抵消掉的完整過程 516 00:16:47,520 --> 00:16:50,080 而不會覺得某一段進度怎麼突然憑空消失了 517 00:16:50,860 --> 00:16:51,360 最棒的是 518 00:16:51,620 --> 00:16:53,160 這些指令你其實都不用自己硬背 519 00:16:53,160 --> 00:16:55,200 當你發現AI改壞的時候 520 00:16:55,460 --> 00:16:56,240 你只要直接跟他說 521 00:16:56,480 --> 00:16:57,760 剛剛這次的改動我不要了 522 00:16:58,020 --> 00:16:59,560 請幫我回到上一個正常的版本 523 00:17:00,080 --> 00:17:01,600 AI自己就去判斷現在的狀態 524 00:17:01,860 --> 00:17:03,920 決定該用restore還是revert來幫你處理 525 00:17:04,680 --> 00:17:05,440 好到了這裡 526 00:17:05,700 --> 00:17:07,500 我們來總結一下今天Gary學到了什麼 527 00:17:08,260 --> 00:17:09,040 他現在知道了 528 00:17:09,280 --> 00:17:10,560 寫好的程式可以備份到 529 00:17:10,820 --> 00:17:11,840 Github這個雲端倉庫上 530 00:17:12,100 --> 00:17:13,120 而在上傳之前 531 00:17:13,380 --> 00:17:14,400 必須先設定好Git 532 00:17:14,660 --> 00:17:15,680 來做本機端的版本管理 533 00:17:16,460 --> 00:17:17,740 當AI提到commit的時候 534 00:17:18,000 --> 00:17:20,040 他明白這是在幫程式當下的狀態 535 00:17:20,300 --> 00:17:21,320 留一個存檔快照 536 00:17:21,320 --> 00:17:23,120 當準備要push的時候 537 00:17:23,360 --> 00:17:24,640 就是在把電腦裡的存檔 538 00:17:24,900 --> 00:17:25,920 正式推送到雲端 539 00:17:26,440 --> 00:17:27,460 如果有朋友想加入開發 540 00:17:27,720 --> 00:17:29,260 就請他用clone把專案抓下來 541 00:17:29,520 --> 00:17:30,800 如果朋友上傳了新進度 542 00:17:31,040 --> 00:17:33,100 就用pull把最新的版本拉回自己的電腦裡 543 00:17:33,860 --> 00:17:35,400 當AI準備要大改功能的時候 544 00:17:35,660 --> 00:17:36,940 他會要求開一條branch 545 00:17:37,200 --> 00:17:38,480 當作安全的實驗殺盒 546 00:17:38,980 --> 00:17:41,280 如果想同時讓好幾個AI幫忙做不同的事情 547 00:17:41,540 --> 00:17:42,560 他就會利用worktree 548 00:17:42,820 --> 00:17:45,380 讓每條branch都能擁有自己的實體資料夾 549 00:17:46,160 --> 00:17:47,680 等所有的功能都寫完測試過後 550 00:17:47,940 --> 00:17:49,220 再透過開PR和merge 551 00:17:49,220 --> 00:17:51,260 把成果正式收回到main主線 552 00:17:51,780 --> 00:17:53,580 萬一合併時遇到conflip衝突 553 00:17:54,080 --> 00:17:55,360 他也知道這不是世界末日 554 00:17:55,620 --> 00:17:57,660 這只是Git在等他下達明確的產品決策 555 00:17:58,180 --> 00:18:00,220 而就算AI真的把程式改到無法挽救 556 00:18:00,480 --> 00:18:02,780 只要還沒commit就可以用restore一鍵復原 557 00:18:03,040 --> 00:18:04,320 如果不小心commit了 558 00:18:04,580 --> 00:18:06,880 也可以用revert安全的把錯誤給抵消掉 559 00:18:07,900 --> 00:18:08,420 所以你看 560 00:18:08,680 --> 00:18:09,440 或許對你來說 561 00:18:09,700 --> 00:18:11,240 Git是一堆南北的火星文指令 562 00:18:11,500 --> 00:18:13,020 但你只要有能力指揮就可以了 563 00:18:13,540 --> 00:18:14,560 只要你能把這些概念 564 00:18:14,820 --> 00:18:15,080 對應到 565 00:18:15,340 --> 00:18:17,120 他可以幫你解決開發上的什麼問題 566 00:18:17,120 --> 00:18:18,920 一切也會變得非常好理解 567 00:18:19,680 --> 00:18:22,240 你不需要在今天就逼自己變成Git專家 568 00:18:22,760 --> 00:18:23,260 但你要知道 569 00:18:23,520 --> 00:18:24,280 當cloud 570 00:18:24,540 --> 00:18:25,820 或者是cursor問你要不要commit 571 00:18:26,340 --> 00:18:27,100 要不要開branch 572 00:18:27,360 --> 00:18:27,880 要不要發pr 573 00:18:28,120 --> 00:18:28,380 的時候 574 00:18:28,640 --> 00:18:29,660 他其實是在問你 575 00:18:29,920 --> 00:18:31,200 這次的開發你要不要先存檔 576 00:18:31,720 --> 00:18:33,000 你要不要開個空間來隔離風險 577 00:18:33,240 --> 00:18:36,060 你要不要把寫好的東西交出去給別人檢查 578 00:18:37,080 --> 00:18:38,120 只要這些判斷你聽得懂 579 00:18:38,360 --> 00:18:39,640 你用AI開發就會踏實很多 580 00:18:40,680 --> 00:18:41,180 今天這集 581 00:18:41,440 --> 00:18:43,240 我盡量把Git最核心的幾個情境 582 00:18:43,480 --> 00:18:45,020 用最白話的方式講清楚 583 00:18:45,020 --> 00:18:47,580 不過實際開發時遇到的狀況 584 00:18:47,840 --> 00:18:48,860 其實不止這些 585 00:18:49,120 --> 00:18:50,900 所以我把日常最常見的27個情境 586 00:18:51,160 --> 00:18:52,700 整理成了一份更完整的對照表 587 00:18:52,960 --> 00:18:53,720 每一種狀況 588 00:18:53,980 --> 00:18:55,520 都直接對應到該用的Git指令 589 00:18:55,780 --> 00:18:57,060 還有給AI的提示詞範例 590 00:18:57,560 --> 00:18:59,100 如果你手邊已經有在開發的專案 591 00:18:59,360 --> 00:19:00,380 我也附了一組提示詞 592 00:19:00,640 --> 00:19:02,180 幫你檢查他現在的Git健康度 593 00:19:02,680 --> 00:19:03,700 如果這些對你有幫助 594 00:19:03,960 --> 00:19:05,240 可以來我的Patreon看看 595 00:19:05,500 --> 00:19:06,780 連結我放在資訊欄 596 00:19:07,540 --> 00:19:08,580 那以下就是今天的內容 597 00:19:08,820 --> 00:19:09,340 各位喜歡的話 598 00:19:09,600 --> 00:19:10,880 記得幫我按讚追蹤加分享 599 00:19:11,380 --> 00:19:12,660 這是我持續創作下去的動力 600 00:19:12,920 --> 00:19:13,440 我們下次見 601 00:19:15,020 --> 00:19:17,020 这是我對好的 602 00:19:17,320 --> 00:19:26,460 大家未來的 603 00:19:26,700 --> 00:19:28,480 注意訊欄 604 00:19:29,160 --> 00:19:29,980 沒有 605 00:19:30,360 --> 00:19:31,380 PEIN 606 00:19:32,180 --> 00:19:36,180 你 607 00:19:36,980 --> 00:19:38,040 剛剛 608 00:19:38,300 --> 00:19:38,640 心
(完整逐字稿請見 merged.srt,共 19 分鐘 16 秒,Whisper large-v3-turbo 轉錄)