Git 分支 (Branch)
分支是 Git 最強大的功能之一,讓你可以同時開發多個功能,而不會互相干擾。
什麼是分支?
你可以把分支想像成平行宇宙。每個分支都是獨立的開發線,有自己的 commit 歷史。
main: A --- B --- C
\
feature: D --- E
在這個例子中:
main分支有 A、B、C 三個 commitfeature分支從 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 的變更:
- 變更會帶到新分支:如果變更和新分支沒有衝突
- 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