Git 分支 (Branch)

分支是 Git 最強大的功能之一,讓你可以同時開發多個功能,而不會互相干擾。

什麼是分支?

你可以把分支想像成平行宇宙。每個分支都是獨立的開發線,有自己的 commit 歷史。

main:     A --- B --- C
                       \
feature:                D --- E

在這個例子中:

  • main 分支有 A、B、C 三個 commit
  • feature 分支從 C 分出來,有 D、E 兩個 commit
  • feature 分支上的修改不會影響 main

查看分支

列出本地分支

git branch

輸出:

* main
  feature
  bugfix

* 標記的是你目前所在的分支。

列出所有分支(包含遠端)

git branch -a

輸出:

* main
  feature
  remotes/origin/main
  remotes/origin/develop

列出遠端分支

git branch -r

顯示分支的最後 commit

git branch -v

輸出:

* main    a1b2c3d Latest commit message
  feature b2c3d4e Feature in progress

建立分支

建立新分支

git branch feature

這只會建立分支,不會切換過去。

建立並切換到新分支

git checkout -b feature
# 或(Git 2.23+)
git switch -c feature

從特定 commit 建立分支

git branch feature a1b2c3d

從遠端分支建立本地分支

git checkout -b feature origin/feature
# 或
git switch -c feature origin/feature

切換分支

使用 checkout

git checkout feature

使用 switch(Git 2.23+)

git switch feature

git switch 是較新的指令,專門用來切換分支,比 checkout 更直觀。

切換到上一個分支

git checkout -
# 或
git switch -

重新命名分支

重新命名當前分支

git branch -m new-name

重新命名其他分支

git branch -m old-name new-name

刪除分支

刪除已合併的分支

git branch -d feature

如果分支還沒合併,Git 會警告你。

強制刪除分支

git branch -D feature

大寫 -D 會強制刪除,即使分支還沒合併。

刪除遠端分支

git push origin --delete feature
# 或
git push origin :feature

分支工作流程

開發新功能

# 1. 確保在最新的 main
git checkout main
git pull

# 2. 建立功能分支
git checkout -b feature/user-login

# 3. 開發功能,commit 多次
git add .
git commit -m "Add login form"
git add .
git commit -m "Add validation"

# 4. 推送到遠端
git push -u origin feature/user-login

# 5. 完成後合併回 main(通常透過 Pull Request)
git checkout main
git merge feature/user-login

# 6. 刪除分支
git branch -d feature/user-login

修復 Bug

# 從 main 建立 hotfix 分支
git checkout main
git checkout -b hotfix/fix-login-bug

# 修復並 commit
git add .
git commit -m "Fix login validation bug"

# 合併回 main
git checkout main
git merge hotfix/fix-login-bug

# 刪除 hotfix 分支
git branch -d hotfix/fix-login-bug

分支命名慣例

常見的分支命名方式:

  • main / master:主要分支
  • develop:開發分支
  • feature/xxx:功能分支
  • bugfix/xxx:Bug 修復分支
  • hotfix/xxx:緊急修復分支
  • release/xxx:發布分支

例如:

feature/user-authentication
feature/shopping-cart
bugfix/login-timeout
hotfix/security-patch
release/v1.2.0

追蹤遠端分支

設定上游分支

git branch --set-upstream-to=origin/feature feature
# 或簡寫
git branch -u origin/feature

查看追蹤關係

git branch -vv

輸出:

* main    a1b2c3d [origin/main] Latest commit
  feature b2c3d4e [origin/feature: ahead 2] Feature work

其他常用操作

查看分支差異

# feature 有哪些 commit 是 main 沒有的
git log main..feature

# 兩個分支的差異
git diff main feature

查看哪些分支已合併

# 已合併到當前分支的分支
git branch --merged

# 還沒合併的分支
git branch --no-merged

找出包含某個 commit 的分支

git branch --contains a1b2c3d

注意事項

切換分支前的狀態

切換分支前,如果有未 commit 的變更:

  1. 變更會帶到新分支:如果變更和新分支沒有衝突
  2. Git 會阻止切換:如果會產生衝突

建議切換前先:

# 方法一:commit 變更
git add .
git commit -m "WIP"

# 方法二:暫存變更
git stash

# 方法三:捨棄變更
git checkout -- .

HEAD detached 狀態

如果你 checkout 到一個 commit 而不是分支:

git checkout a1b2c3d

你會進入 "detached HEAD" 狀態。在這個狀態下的 commit 不屬於任何分支,可能會遺失。

如果需要在這裡開始工作,建議先建立分支:

git checkout -b new-branch