四、分支管理:并行开发的利器
分支是 Git 最强大的特性。创建分支的成本几乎为零,鼓励开发者频繁创建分支。
4.1 分支的本质
Git 的分支本质上只是一个指向某个提交的指针。
main
↓
A ← B ← C ← D
↑
feature
# 查看分支
git branch # 本地分支
git branch -r # 远程分支
git branch -a # 所有分支(本地+远程)
git branch -v # 分支 + 最后一次提交
# 创建分支
git branch feature-login # 创建分支,但不切换
git checkout -b feature-login # 创建并切换到新分支
git switch -c feature-login # Git 2.23+ 的新写法
# 切换分支
git checkout main
git switch main # 新写法
# 删除分支
git branch -d feature-login # 删除已合并的分支
git branch -D feature-login # 强制删除(即使未合并)
# 重命名分支
git branch -m old-name new-name
4.2 合并分支
# 场景:将 feature 分支合并到 main
# 1. 切换到目标分支
git checkout main
# 2. 合并
git merge feature-login
# 3. 如果出现冲突,解决后提交
合并的三种情况
情况1:Fast-forward(快进合并)
合并前:
main: A ← B
feature: A ← B ← C ← D
合并后:
main: A ← B ← C ← D (main 指针直接移动到 D)
# 自动使用快进合并(如果可以)
git merge feature
# 强制禁用快进合并(保留分支历史)
git merge --no-ff feature
情况2:三方合并(Auto-merge)
main: A ← B ← E
feature: A ← B ← C ← D
合并后:
main: A ← B ← E ← F (新的合并提交)
↖ ↗
C ← D
情况3:冲突合并
当两个分支修改了同一个文件的同一区域时,Git 无法自动合并,需要手动解决。
# 合并时出现冲突
$ git merge feature
Auto-merging src/index.js
CONFLICT (content): Merge conflict in src/index.js
Automatic merge failed; fix conflicts and then commit the result.
# 查看冲突文件
git status
# 冲突文件的内容
<<<<<<< HEAD
console.log("这是 main 分支的代码");
=======
console.log("这是 feature 分支的代码");
>>>>>>> feature
# 解决冲突后
git add src/index.js
git commit -m "解决合并冲突"
4.3 Rebase:变基操作
Rebase 可以让提交历史更线性、更干净。
# 将 feature 分支的修改"移动"到 main 分支的最新提交之后
git checkout feature
git rebase main
# 交互式 rebase(合并、修改、删除提交)
git rebase -i HEAD~3 # 对最近3个提交进行操作
Rebase 的原理:
Rebase 前:
main: A ← B ← C
feature: A ← B ← D ← E
Rebase 后:
main: A ← B ← C
feature: A ← B ← C ← D' ← E'
# 原本基于 B 的 D 和 E,现在基于 C 创建了新的提交 D' 和 E'
merge vs rebase 对比:
黄金法则:不要在公共分支上使用 rebase!(只 rebase 自己本地的分支)
4.4 分支工作流实战
# 1. 开始新功能
git checkout main
git pull origin main
git checkout -b feature/payment
# 2. 开发过程中定期提交
git add .
git commit -m "实现支付接口"
git push origin feature/payment # 推送到远程备份
# 3. 开发完成后,合并前更新 main
git checkout main
git pull origin main
git checkout feature/payment
git rebase main # 或 git merge main
# 4. 合并到 main
git checkout main
git merge --no-ff feature/payment
# 5. 推送并删除分支
git push origin main
git branch -d feature/payment
git push origin --delete feature/payment