Appearance
Git 分支管理
分支概述
Git 的分支模型是其最强大的特性之一。分支允许你在不影响主线开发的情况下,独立地进行开发工作。
分支的优势
- 并行开发:多个功能可以同时开发
- 隔离环境:每个分支都是独立的工作环境
- 安全性:在分支上实验,不影响主分支
- 灵活性:可以随时创建、切换、合并分支
分支的基本操作
创建分支
bash
# 创建新分支
git branch <branch-name>
# 基于指定提交创建分支
git branch <branch-name> <commit>
# 基于指定标签创建分支
git branch <branch-name> <tag>切换分支
bash
# 切换到已存在的分支
git checkout <branch-name>
# 创建并切换到新分支
git checkout -b <branch-name>
# 创建并切换到基于指定提交的分支
git checkout -b <branch-name> <commit>查看分支
bash
# 查看本地分支
git branch
# 查看所有分支(包括远程分支)
git branch -a
# 查看远程分支
git branch -r
# 查看分支的最后一次提交
git branch -v
# 查看分支的详细信息
git branch -vv删除分支
bash
# 删除已合并的分支
git branch -d <branch-name>
# 强制删除分支(即使未合并)
git branch -D <branch-name>
# 删除远程分支
git push <remote> --delete <branch-name>重命名分支
bash
# 重命名当前分支
git branch -m <new-name>
# 重命名指定分支
git branch -m <old-name> <new-name>分支合并
Merge 合并
bash
# 合并指定分支到当前分支
git merge <branch-name>
# 合并但不自动提交
git merge --no-commit <branch-name>
# 合并并创建合并提交
git merge --no-ff <branch-name>
# 终止合并
git merge --abortMerge 的特点:
- 保留完整的历史记录
- 创建合并提交
- 历史记录呈分叉状
- 适合需要保留完整历史的场景
Rebase 变基
bash
# 将当前分支变基到指定分支
git rebase <branch-name>
# 交互式变基
git rebase -i <commit>
# 继续变基
git rebase --continue
# 跳过当前提交
git rebase --skip
# 终止变基
git rebase --abortRebase 的特点:
- 创建线性的提交历史
- 重写提交历史
- 历史记录更清晰
- 适合需要保持线性历史的场景
Merge vs Rebase
| 特性 | Merge | Rebase |
|---|---|---|
| 历史记录 | 保留完整历史 | 重写历史 |
| 提交数量 | 创建合并提交 | 不创建新提交 |
| 历史形状 | 分叉状 | 线性 |
| 适用场景 | 需要保留历史 | 需要线性历史 |
| 风险 | 低 | 可能产生冲突 |
分支工作流
Git Flow 工作流
Git Flow 是一种经典的分支管理模型,适合有计划发布周期的项目。
主要分支:
master:生产环境分支,始终保持稳定develop:开发分支,集成了所有功能开发
辅助分支:
feature:功能分支,从 develop 分支创建release:发布分支,从 develop 分支创建hotfix:修复分支,从 master 分支创建
工作流程:
bash
# 1. 从 develop 创建功能分支
git checkout -b feature/new-feature develop
# 2. 开发完成后合并回 develop
git checkout develop
git merge --no-ff feature/new-feature
# 3. 从 develop 创建发布分支
git checkout -b release/1.0.0 develop
# 4. 发布完成后合并到 master 和 develop
git checkout master
git merge --no-ff release/1.0.0
git checkout develop
git merge --no-ff release/1.0.0
# 5. 从 master 创建修复分支
git checkout -b hotfix/critical-fix master
# 6. 修复完成后合并到 master 和 develop
git checkout master
git merge --no-ff hotfix/critical-fix
git checkout develop
git merge --no-ff hotfix/critical-fixGitHub Flow 工作流
GitHub Flow 是一种简化的工作流,适合持续部署的项目。
主要分支:
main:主分支,始终保持可部署状态
工作流程:
bash
# 1. 从 main 创建功能分支
git checkout -b feature/new-feature main
# 2. 开发并提交
git add .
git commit -m "Add new feature"
# 3. 推送到远程
git push origin feature/new-feature
# 4. 创建 Pull Request
# 5. 代码审查通过后合并到 main
# 6. 部署GitLab Flow 工作流
GitLab Flow 结合了 Git Flow 和 GitHub Flow 的优点。
主要分支:
main:主分支production:生产环境分支staging:预发布环境分支
工作流程:
bash
# 1. 从 main 创建功能分支
git checkout -b feature/new-feature main
# 2. 开发完成后合并回 main
# 3. 从 main 创建环境分支
git checkout -b staging main
git checkout -b production main
# 4. 使用合并请求在不同环境间升级分支冲突解决
冲突产生的原因
- 两个分支修改了同一文件的同一行
- 一个分支修改了文件,另一个分支删除了文件
- 两个分支重命名了同一文件
解决冲突的步骤
bash
# 1. 尝试合并
git merge <branch-name>
# 2. 如果有冲突,Git 会提示
# Auto-merging file.txt
# CONFLICT (content): Merge conflict in file.txt
# 3. 查看冲突文件
git status
# 4. 编辑冲突文件,解决冲突
# 冲突标记:
# <<<<<<< HEAD
# 当前分支的内容
# =======
# 合并分支的内容
# >>>>>>> branch-name
# 5. 添加解决后的文件
git add <file-name>
# 6. 完成合并
git commit冲突解决工具
bash
# 使用合并工具
git mergetool
# 查看冲突文件
git diff --check
# 放弃解决冲突
git merge --abort分支策略
功能分支策略
每个新功能都在独立的分支上开发,完成后合并到主分支。
优点:
- 功能隔离
- 易于代码审查
- 可以并行开发
缺点:
- 分支管理复杂
- 合并可能产生冲突
发布分支策略
为每个发布版本创建独立分支,用于准备发布。
优点:
- 发布准备不影响开发
- 可以同时准备多个版本
- 发布回滚简单
缺点:
- 需要维护多个发布分支
- 合并复杂
修复分支策略
为紧急修复创建独立分支,快速修复生产问题。
优点:
- 快速响应
- 不影响开发
- 可以直接部署
缺点:
- 可能产生多个修复分支
- 需要同步到开发分支
分支最佳实践
分支命名规范
bash
# 功能分支
feature/feature-name
feature/user-authentication
# 修复分支
bugfix/bug-description
bugfix/login-error
# 热修复分支
hotfix/critical-fix
hotfix/security-patch
# 发布分支
release/version-number
release/1.0.0
# 实验分支
experiment/experiment-name
experiment/new-ui分支管理原则
- 主分支保持稳定:main/master 分支始终保持可部署状态
- 定期合并:定期将主分支的更改合并到功能分支
- 及时删除:合并完成后及时删除已完成的分支
- 小步提交:保持提交小而频繁
- 清晰命名:使用有意义的分支名称
- 代码审查:合并前进行代码审查
分支保护
bash
# 设置分支保护(需要通过 GitHub/GitLab 界面设置)
# - 需要 PR 审查
# - 需要通过 CI 检查
# - 限制推送权限
# - 需要状态检查通过远程分支
跟踪分支
bash
# 查看跟踪分支
git branch -vv
# 设置跟踪分支
git branch -u <remote>/<branch>
# 推送并设置跟踪
git push -u <remote> <branch>远程分支操作
bash
# 拉取远程分支
git fetch
# 拉取并合并远程分支
git pull
# 拉取并变基远程分支
git pull --rebase
# 推送到远程分支
git push
# 推送所有分支
git push --all
# 删除远程分支
git push <remote> --delete <branch>分支可视化
查看分支图
bash
# 查看图形化历史
git log --graph --oneline --all
# 查看美化后的分支图
git log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit
# 使用 gitk 图形化工具
gitk
# 使用 tig 文本界面工具
tig分支清理
清理已合并分支
bash
# 查看已合并的分支
git branch --merged
# 删除已合并的分支
git branch --merged | grep -v "\*" | xargs -n 1 git branch -d清理未合并分支
bash
# 查看未合并的分支
git branch --no-merged
# 强制删除未合并的分支(谨慎使用)
git branch -D <branch-name>清理远程分支
bash
# 清理已删除的远程分支引用
git remote prune origin
# 清理所有远程分支引用
git fetch --prune