06 - 分支管理(Branch)

05-Push與Pull | 下一篇 → 07-常見問題與解法


🌿 什麼是分支(Branch)?

分支讓你可以在不影響主線的情況下,嘗試新功能或修改內容。

main ────●────●────●────●─────
              ↑         ↑
           分支點      合併點
              └────●────●─ (feature branch)

使用情境

  • 想試試看一個新的寫法,怕改壞主要內容
  • 多人協作,每個人在自己的分支工作,完成後再合併
  • 同時進行多個不同的功能開發

🔍 查看分支

# 查看所有本地分支(* 表示目前所在的分支)
git branch
 
# 查看所有分支(包含遠端)
git branch -a

➕ 建立新分支

# 建立分支(但不切換過去)
git branch feature/new-notes
 
# 建立分支並立即切換過去(推薦)
git switch -c feature/new-notes
 
# 舊版寫法(一樣可以用)
git checkout -b feature/new-notes

分支命名建議:

  • feature/xxx — 新功能
  • fix/xxx — 修正問題
  • docs/xxx — 文件修改

🔀 切換分支

# 切換到指定分支
git switch main
 
# 舊版寫法
git checkout main
 
# 切換到上一個分支
git switch -

🔗 合併分支(git merge)

當分支上的工作完成了,把它合併回主分支:

# 先切換回 main
git switch main
 
# 將 feature 分支合併進來
git merge feature/new-notes

Fast-forward merge vs. Merge commit

# 強制建立 merge commit(有清楚紀錄)
git merge --no-ff feature/new-notes

🗑️ 刪除分支

# 刪除已合併的分支(安全)
git branch -d feature/new-notes
 
# 強制刪除(即使還沒合併)
git branch -D feature/new-notes
 
# 刪除遠端分支
git push origin --delete feature/new-notes

🌍 Push 分支到 GitHub

# 把本地分支推到 GitHub
git push -u origin feature/new-notes

🔄 Rebase(進階)

rebase 是另一種整合分支的方式,讓歷史更整潔。

# 在 feature 分支上,把 main 的最新內容接進來
git switch feature/new-notes
git rebase main

merge vs rebase

  • merge 保留完整歷史,多一個 merge commit
  • rebase 讓歷史線性,看起來更乾淨
  • 初學者先用 merge 就好

merge vs rebase 圖解

merge(保留分岔,多一個合併節點):

main    ●────●────●────●────●(merge commit)
              \              /
feature        ●────●──────●

rebase(把 feature 的 commit「搬」到 main 最新點之後,變直線):

main    ●────●────●────●────●'────●'────●'
                          (feature 的 commit 被重放成一直線)
mergerebase
歷史長相有分岔、保留真實時間線一條直線、乾淨好讀
會不會產生新 commit hash不會(原 commit 不變)(commit 被重寫,hash 變了)
適合公開 / 多人共用的分支自己本地、還沒分享出去的分支

rebase 的黃金守則

永遠不要 rebase 已經 push 出去、別人可能正在用的分支(尤其是 main)。 rebase 會改寫 commit hash,別人的歷史會對不上,造成大亂。 安全範圍:只 rebase「自己本地、還沒分享」的 feature 分支。


📦 git stash:把手上的修改先收進抽屜

情境:你正改到一半(還沒想 commit),但臨時要切去別的分支處理急事。 直接切分支會被擋(怕蓋掉修改),這時用 stash 把工作收起來:

# 把目前所有未 commit 的修改收進暫存抽屜(工作區會變乾淨)
git stash
 
# 加上說明,之後好認
git stash push -m "寫到一半的 heart failure 筆記"
 
# 切去做別的事...然後回來,把修改取回
git stash pop          # 取回最後一次 stash 並從清單移除
git stash apply        # 取回但保留在清單(可重複套用)
 
# 查看抽屜裡有哪些
git stash list
 
# 丟掉某一筆
git stash drop stash@{0}
 
# 全部清空
git stash clear

典型用途:pull 前發現有零碎未 commit 的修改擋路 → git stashgit pullgit stash pop


🔁 Pull Request(PR)協作流程

在團隊(或你想讓改動被審查)時,不會直接 push 到 main,而是走 PR 流程

1. 從 main 開一條 feature 分支
   git switch -c feature/new-topic

2. 在分支上做修改、commit
   git add .
   git commit -m "新增某主題筆記"

3. 把分支推上 GitHub
   git push -u origin feature/new-topic

4. 上 GitHub 網頁,點 "Compare & pull request" 開一個 PR
   - 寫清楚這個 PR 做了什麼
   - base:main ← compare:feature/new-topic

5. Review(審查):
   - 審查者在 PR 頁面逐行留 comment、要求修改
   - 你在本地繼續改 → commit → push,PR 會自動更新

6. 通過後按 "Merge pull request" 合併進 main

7. 合併完刪掉 feature 分支(GitHub 上有按鈕,本地也清掉):
   git switch main
   git pull
   git branch -d feature/new-topic

PR 的好處

  • 改動在合併前可被檢視,降低把 main 弄壞的風險。
  • 每個 PR 是一段獨立、可討論、可回溯的紀錄。
  • 個人專案也能用 PR 來自我檢查(diff 一目了然)。

📌 小結

指令用途
git branch查看分支
git switch -c 分支名建立並切換新分支
git switch 分支名切換分支
git merge 分支名合併分支
git rebase 分支名把目前分支接到指定分支最新點(直線歷史)
git branch -d 分支名刪除分支
git push -u origin 分支名Push 分支到 GitHub
git stash / git stash pop暫存 / 取回未 commit 的修改

05-Push與Pull | 下一篇 → 07-常見問題與解法