4. 分支 Branch

在前面的章節中,我們學會了建立專案、在本地與雲端同步檔案,甚至是不小心推錯檔時的緊急救援。但你有沒有發現,到目前為止,我們所有人都是擠在一條叫做 main 的直線上開發?

想像一下這個恐怖情境:你正在 main 上修改新功能,程式碼改到一半、滿地 Bug。這時老闆突然打來說:「網站的登入功能壞了,限你 10 分鐘內修好上線!」

此時的你進退兩難:

  • 把手邊改到一半、壞掉的程式碼硬著頭皮 Commit 並推上去?(網站會直接全站炸開)
  • 狂按 Ctrl + Z 把新功能全刪掉,先修 Bug?(這幾天的努力全白費)

如果你懂得使用 Branch(分支),那面對這種情境時,你自然能從容應對了。

1. 什麼是 Branch(分支)?

簡單來說,分支就是程式碼的「平行宇宙」

在 Git 的世界裡,預設的主線宇宙叫做 main(舊版叫 master),這條主線通常用來存放隨時可以穩定執行、要給客戶看的正式版程式碼

當你想開發新功能(Feature)或修復 Bug 時,你不需要也不應該直接在 main 上面動刀。你可以從 main 拉出一個平行宇宙(建立新分支),在這個宇宙裡,你愛怎麼改就怎麼改,就算改到全面崩潰,main 宇宙裡的正式網站依然完好無損、安全運作。

等你在平行宇宙把新功能測試完美了,再把這條分支「合併 (Merge)」回 main 宇宙。這就是現代軟體開發的核心心法。

gitGraph
    commit id: "初始專案"
    commit id: "網頁首頁完成"
    branch feature/cool-ui
    checkout feature/cool-ui
    commit id: "切換宇宙:開發新 UI"
    commit id: "新 UI 測試成功"
    checkout main
    commit id: "主線宇宙:緊急修復登入 Bug"
    merge feature/cool-ui
    commit id: "完美合併!"

從上圖可以看到,當主線在修復緊急 Bug 的同時,你的 feature/cool-ui 平行宇宙正在同步開發新功能,兩者互不干涉,最後再完美交織在一起!

2. 實戰 !

現在,請打開你的終端機,切換到你的專案資料夾,我們一起來操縱時空裂縫。

1. 檢查目前有哪些分支

git branch
  • 💡 終端機提示: 你會看到畫面上出現 * main,有米字號 * 的代表你目前正身處在這個宇宙。

2. 建立並直接切換

我們現在要開發一個購物車功能,輸入以下指令:

git checkout -b feature/cart
  • 💡 指令解析: checkout 是切換宇宙的意思,加上 -b 代表「如果這個分支不存在,就幫我新建一個」。
  • 這時候再次輸入 git branch,你會發現 * 已經移到 feature/cart 上了!

3. 在平行宇宙中安心開發

我們在購物車宇宙裡新建一個檔案,並做好 Commit:

echo "Cart function is under development..." > cart.html
git add .
git commit -m "feat: Add basic cart structure"
Code language: PHP (php)

此時,這個 cart.html 只存在於 feature/cart 分支。

4. 切回主線宇宙

我們切換回 main 看看:

git checkout main

這時候神奇的事情發生了,請檢查你的專案資料夾,你會發現剛剛寫的 cart.html 竟然不見了! 別慌,它沒有不見,它只是留在購物車宇宙裡,而你現在回到了乾淨的正式版主線。

5. 合併分支

假設購物車功能在平行宇宙已經測試通過,我們要把它接回主線:

務必確認你目前身處在 main 分支,然後輸入:

git merge feature/cart

畫面上會出現 Fast-forward,代表主線已經成功把購物車分支的進度吞進來了!這時候 cart.html 就會好端端地出現在你的 main 分支裡。

6. 把新分支也推上 GitHub 備份

如果你在平行宇宙寫到一半要下班了,想把這個分支也推上 GitHub 備份,只要輸入:

git push origin feature/cart

這樣一來,GitHub 雲端上就會同步出現這條新分支,團隊夥伴也能拉下來一起開發!

3. 刪除分支

在 Git 的世界裡,刪除分支是一門大學問。我們通常會分為「刪除本地分支」「刪除 GitHub 上的遠端分支」。

1. 如何把不要的分支刪掉?

請先確保你已經切換到其他分支(例如 main),因為你不能在一個正踩在腳底下的宇宙裡把自己毀滅。

# 站在 main 分支,先確保自己換位置了
git checkout main
Code language: PHP (php)

只刪除「本地電腦」的分支

如果功能已經合併完畢,想把本地的 feature/cart 刪掉:

git branch -d feature/cart

如果這個分支的修改「還沒被合併」,Git 會貼心地擋下你並報錯。如果你確定這個分支是垃圾、真的不要了,可以用大寫的 -D 暴力強制刪除:git branch -D feature/cart

刪除「GitHub 雲端」的遠端分支

如果你之前輸入過 git push origin feature/cart,現在想把 GitHub 上的這條分支抹除:

git push origin --delete feature/cart
Code language: JavaScript (javascript)

這行指令的意思是:「推一個『刪除命令』到遠端(origin),把 feature/cart 給砍了。」

2. 刪除分支,紀錄會跟著不見嗎?修改會不見嗎?

只要你合併(Merge)過了,檔案和紀錄就絕不會不見!

這聽起來很違反直覺,但理解了 Git 的底層邏輯後,你會發現它非常安全:

  • 分支其實只是「貼紙(指標)」:你在分支裡每一次輸入 git commit 所建立的時光紀錄點(Commit),才是真正存放程式碼修改的實體硬碟空間。而分支名稱(例如 feature/cart)只是貼在最新那顆 Commit 上的一張「便條紙」。
  • 刪除分支的本質:你只是把 feature/cart 這張便條紙撕掉丟進垃圾桶,並不是去刪除那些 Commit 紀錄點

只要在刪除分支前,確認有做好 git merge,你就儘管放心地把分支砍掉吧!你的程式碼修改與歷史提交紀錄,都會完美、一字不漏地保留在主線上。