這一課完成後:你的 norelyn-first-project 會成為一個 Git repository,而且至少會有兩個 commit。你會理解 working tree、staging area、commit 之間的關係。

先確認 Git 真的可以用

在 VS Code 打開 norelyn-first-project,再開 Terminal:

git --version

如果能看到版本號,就可以繼續。如果找不到 git,先回到 環境設定,不要先往下硬做。

Git 跟 GitHub 不是同一件事

這一課甚至不需要 GitHub 帳號。Git 是跑在你電腦上的版本控制工具;GitHub 是之後可以存放 Git repository、協作和分享程式碼的線上服務。

Git = 本機版本控制
GitHub = 線上託管與協作服務

所以第一個版本,先完全留在自己的電腦上。

先做:把這個資料夾變成 repository

先用 pwd 或目前的提示符號確認 Terminal 位於 norelyn-first-project 根目錄,然後輸入:

git init

Git 會在這個專案裡建立自己的版本控制資料。你可能在一般檔案瀏覽器看不到,因為它放在隱藏的 .git 資料夾裡。

不要手動編輯 .git。知道它存在就夠。只要這個資料夾還在,Git 就知道這是一個 repository,也保存著版本歷史和設定。

先問 Git:現在發生了什麼?

git status

這是現在最值得養成習慣的一條指令。它不會修改專案,只會告訴你目前有哪些檔案還沒被追蹤、哪些檔案改過、哪些改動已經準備好進入下一個 commit。

第一次執行時,你很可能會看到一堆 untracked files。意思不是出錯,而是:「這些檔案存在,但 Git 還沒有開始記錄它們。」

Git 不會看到檔案就自動替你存版本

這是 Git 最重要的觀念之一。你修改一個檔案,不代表它自動成為新版本。Git 中間有一層叫 staging area。

Working tree → git add → Staging area → git commit → History

Working tree 是你現在實際正在改的檔案;staging area 是「下一個 commit 準備包含哪些改動」;commit 才是正式寫進歷史的一個版本節點。

把目前的專案放進 staging area

現在這個練習專案內容很單純,所以可以輸入:

git add .

這裡的 . 代表目前資料夾。也就是把目前專案內的變更加入 staging area。

再執行:

git status

你應該會看到狀態改變,檔案變成準備被 commit 的狀態。

不要把 git add . 理解成「永遠全部加進去」。它只是這次練習方便。真正的專案裡,你應該先用 git status 確認有哪些改動,再決定要 stage 哪一些。

第一次 commit 之前,Git 需要知道作者是誰

如果這台電腦從來沒有設定過 Git 身分,第一次 commit 可能會要求 user.name 和 user.email。

可以設定:

git config --global user.name "你的名字"
git config --global user.email "你的電子郵件"

這是在 commit metadata 裡標記作者,不是登入 GitHub,也不是把密碼存在 Git。請填你願意出現在版本紀錄裡的名稱與信箱。

如果之後公開推到 GitHub,而且你不想讓私人信箱顯示,可以在 GitHub 課程再處理 noreply email。現在先理解用途即可。

做出第一個版本

git commit -m "Create first project structure"

-m 後面是這次 commit 的訊息。它應該描述「這一版做了什麼」,而不是寫 update、123 或 final-final。

成功後再輸入:

git status

如果沒有新的修改,通常會看到 working tree clean。也就是目前硬碟上的內容和最新 commit 沒有未記錄的差異。

現在故意做一個改動

打開 README.md,加上一行:

# Norelyn First Project

My first project with Git.

儲存後執行:

git status

Git 應該會告訴你 README.md 被修改了。注意:第一個 commit 沒有消失;你只是站在那個版本之後,又產生了尚未被記錄的新變化。

看看你到底改了什麼

git diff

git diff 會顯示 working tree 相對於目前版本的未 staged 差異。第一次看到 diff 可能有點像雜訊,但先抓最基本的:

- 通常代表刪掉的內容
+ 通常代表新增的內容

你不需要現在讀懂 diff 格式的所有資訊,只要開始建立「commit 前先看一下自己到底改了什麼」的習慣。

建立第二個 commit

git add README.md
git commit -m "Add project description"

這次沒有使用 git add .,而是明確只把 README.md 加入 staging area。這更接近之後真實工作的方式。

你的歷史現在已經有兩個節點

輸入:

git log --oneline

你應該會看到兩筆紀錄,每一筆前面都有一小段 commit ID,後面是訊息。

commit 2 · Add project description
↑
commit 1 · Create first project structure

這就是 Git 真正開始有價值的地方:不是「幫你備份一個資料夾」,而是建立一串有身份、有時間、有內容差異的版本歷史。

Commit 不是「存檔」的另一個名字

在 VS Code 按 Ctrl + S,只是把目前內容寫回硬碟;Git commit 則是從目前專案的狀態中,建立一個可以辨識的版本節點。

Save → 更新檔案
Commit → 記錄一個版本

所以正常流程可能是:一天存檔幾十次,但只建立幾個有意義的 commits。

那什麼時候該 commit?

沒有唯一規則,但對初學者來說,一個好基準是:完成一個可以清楚說明的小改動時,就建立一個 commit。

例如「新增首頁標題」、「修正登入驗證」、「加入 README」都比「今天寫了三小時」更適合作為 commit 的範圍。

小挑戰:自己做第三個版本

需求 1:在 docs 裡建立 progress.txt。

需求 2:寫下你目前完成到 Start Here 第幾課。

需求 3:用 git status 確認它是新檔案。

需求 4:只 stage 這一個檔案。

需求 5:建立一個你自己命名的 commit。

需求 6:最後用 git log --oneline 確認歷史至少有三筆。

你剛剛真正學會了什麼?

Git 的核心不是一串神秘指令,而是一個版本流程:

修改 → 檢查 → 選擇要記錄的改動 → Commit → 繼續修改

你已經會 init、status、add、commit、diff 和 log。現在先停在這裡,不急著學 branch、merge、rebase。

下一課才會把這個已經存在於本機的 repository 放到 GitHub。到那時候,push 的意思會非常清楚:不是「把資料夾上傳」,而是把 Git 的版本歷史同步到遠端 repository。

完成條件:你的專案已經執行過 git init,而且 git log --oneline 至少能看到兩個你自己建立的 commits。