前言
Git 分支是 Git 最强大的功能,也是团队协作的核心。但大多数教程只停留在命令层面,本文从实战角度讲分支管理:什么时候创建分支、用什么策略、怎么处理冲突。
一、基础命令
查看分支
# 查看本地分支
git branch
# 查看所有分支(包括远程)
git branch -a
# 查看分支及最后提交
git branch -v
# 查看已合并到当前分支的分支
git branch --merged
# 查看未合并到当前分支的分支
git branch --no-merged
创建分支
# 创建新分支
git branch feature-login
# 创建并切换(推荐)
git switch -c feature-login
# 基于特定分支创建
git switch -c feature-login origin/main
# 创建空分支(无历史记录)
git switch --orphan gh-pages
git rm -rf .
切换分支
# 切换分支(推荐)
git switch main
# 切换并恢复工作区
git switch -c feature-login
# 切回上一个分支
git switch -
合并分支
# 切换到目标分支
git switch main
# 合并 feature 分支
git merge feature-login
# 合并并保留分支历史
git merge --no-ff feature-login
# 只合并特定提交
git cherry-pick abc123
删除分支
# 删除已合并的分支
git branch -d feature-login
# 强制删除未合并的分支
git branch -D feature-login
# 删除远程分支
git push origin --delete feature-login
# 清理已删除的远程分支引用
git fetch --prune
二、高级操作
变基(Rebase)
将当前分支的提交移动到目标分支顶部:
# 交互式变基(整理提交历史)
git rebase -i HEAD~5
# 变基到 main
git rebase main
# 变基后推送到远程(需要 force push)
git push --force-with-lease
变基 vs 合并:
| 场景 | 选择 | 原因 |
|---|---|---|
| 个人功能分支 | Rebase | 保持线性历史 |
| 公共分支 | Merge | 避免重写历史 |
| 整理提交 | Rebase -i | 合并/修改提交 |
| 保留上下文 | Merge | 保留分支合并记录 |
暂存工作
# 暂存当前更改
git stash
# 暂存并添加描述
git stash push -m "正在开发登录功能"
# 恢复最近一次暂存
git stash pop
# 恢复但保留暂存
git stash apply
# 查看暂存列表
git stash list
# 恢复特定暂存
git stash apply stash@{2}
# 删除暂存
git stash drop stash@{0}
交互式变基
整理提交历史:
git rebase -i HEAD~5
编辑器会显示:
pick abc1234 feat: add login button
pick def5678 fix: login button style
pick ghi9012 feat: add form validation
pick jkl3456 fix: form validation bug
pick mno7890 feat: add logout button
常用操作:
pick = 保留提交
reword = 修改提交消息
edit = 修改提交内容
squash = 合并到上一个提交
fixup = 合并但丢弃提交消息
drop = 删除提交
示例:合并修复提交
pick abc1234 feat: add login button
fixup def5678 fix: login button style
pick ghi9012 feat: add form validation
fixup jkl3456 fix: form validation bug
pick mno7890 feat: add logout button
Cherry-Pick
从其他分支选择特定提交:
# 选择单个提交
git cherry-pick abc1234
# 选择多个提交
git cherry-pick abc1234 def5678
# 选择但不自动提交
git cherry-pick --no-commit abc1234
三、冲突解决
冲突类型
- 内容冲突:同一行被修改
- 删除冲突:一方删除,一方修改
- 重命名冲突:双方重命名同一文件
解决步骤
# 1. 查看冲突文件
git status
# 2. 打开冲突文件,手动编辑
# 冲突标记:
# <<<<<<< HEAD
# 当前分支的内容
# =======
# 合并分支的内容
# >>>>>>> feature-login
# 3. 添加解决后的文件
git add <file>
# 4. 继续合并
git merge --continue
# 或放弃合并
git merge --abort
使用工具解决
# 使用 VS Code
git mergetool --tool=vscode
# 使用 JetBrains
git mergetool --tool=intellij
预防冲突
- 频繁同步 main:每天从 main 拉取最新代码
- 小步提交:减少冲突范围
- 代码所有权:不同人负责不同模块
- 使用特性开关:避免长期分支
四、分支策略
Git Flow
分支说明:
| 分支 | 用途 | 生命周期 |
|---|---|---|
main | 生产代码 | 永久 |
develop | 开发集成 | 永久 |
feature/* | 新功能 | 短期 |
release/* | 版本发布 | 短期 |
hotfix/* | 紧急修复 | 短期 |
适用场景:
- 发布周期较长(周/月)
- 需要维护多个版本
- 大型团队协作
GitHub Flow
工作流程:
- 从
main创建功能分支 - 开发并推送
- 创建 Pull Request
- 代码审查
- 合并到
main - 自动部署
适用场景:
- 持续部署
- 小到中型团队
- 快速迭代
Trunk-Based Development
工作流程:
- 所有开发者直接向
main提交 - 使用短生命周期分支(< 1 天)
- 通过特性开关控制功能发布
- 依赖自动化测试保证质量
适用场景:
- 高度成熟的工程团队
- 完善的 CI/CD 流程
- 强大的自动化测试
选择建议
| 团队规模 | 发布频率 | 推荐策略 |
|---|---|---|
| 1-5 人 | 每天 | GitHub Flow |
| 5-20 人 | 每周 | GitHub Flow |
| 20+ 人 | 每月 | Git Flow |
| 100+ 人 | 持续 | Trunk-Based |
五、实用命令
查看历史
# 查看分支图
git log --oneline --graph --all
# 查看特定文件的历史
git log -p <file>
# 查看谁修改了某行
git blame <file>
# 查看两个分支的差异
git diff main..feature-login
撤销操作
# 撤销最后一次提交(保留更改)
git reset --soft HEAD~1
# 撤销最后一次提交(丢弃更改)
git reset --hard HEAD~1
# 撤销已推送的提交(创建新提交)
git revert abc1234
# 恢复被删除的分支
git reflog
git switch -d abc1234
清理操作
# 删除已合并的本地分支
git branch --merged main | grep -v "\*\|main" | xargs -n 1 git branch -d
# 清理不再追踪的远程分支
git fetch --prune
# 查找大文件
git rev-list --objects --all | \
git cat-file --batch-check='%(objecttype) %(objectname) %(objectsize) %(rest)' | \
sed -n 's/^blob //p' | sort -rnk2 | head -10
别名配置
如果你用 Oh My Zsh,Git 插件已经预置了 100+ 个常用别名,开箱即用。
git config --global alias.st "status"
git config --global alias.co "checkout"
git config --global alias.br "branch"
git config --global alias.cm "commit -m"
git config --global alias.lg "log --oneline --graph --all"
git config --global alias.unstage "reset HEAD --"
六、最佳实践
分支命名规范
feature/user-login
feature/payment-gateway
bugfix/login-error
hotfix/security-patch
release/v1.2.0
提交规范
feat: 新功能
fix: 修复 bug
docs: 文档更新
style: 代码格式
refactor: 重构
test: 测试
chore: 构建/工具
PR 最佳实践
- 小步提交:每个 PR 只做一件事
- 清晰描述:说明做了什么、为什么做
- 关联 Issue:引用相关 issue
- 自测通过:确保 CI 通过
- 及时响应:尽快处理 review 意见
总结
Git 分支管理的核心原则:
- 保持分支短生命周期:长期分支容易产生冲突
- 频繁同步 main:每天从 main 拉取最新代码
- 小步提交:减少冲突范围
- 使用 PR/MR:进行代码审查
- 选择合适的策略:根据团队规模和发布频率
参考资料
- Git 官方文档 - 分支管理 — Git 分支基础
- Atlassian Git 分支教程 — 分支策略详解
- GitHub Flow — GitHub 官方工作流
- Git Flow — Git Flow 策略
- Trunk-Based Development — 主干开发模式
- Conventional Commits — 提交规范
- Oh My Zsh Git 插件 — Git 别名列表
🔗 原文链接
分享让更多人看到