Git 分支管理
分支是 Git 最强大的功能之一,它允许你并行开发不同的功能,实验新想法,而不会影响主要代码。本章将详细介绍 Git 分支的创建、管理和使用。
分支基础概念
什么是分支?
分支本质上是指向某个提交的可移动指针。Git 的默认分支通常叫做 main 或 master。
分支示意图:
A---B---C---D (main 分支)
\
E---F (feature 分支)分支的优势
- 🔄 并行开发:多个功能可以同时开发
- 🧪 安全实验:在分支上尝试新想法,不影响主代码
- 👥 团队协作:每个人可以在自己的分支上工作
- 🚀 快速切换:分支创建和切换几乎是瞬时的
查看分支
基本查看命令
bash
# 查看本地分支
git branch
# 查看所有分支(包括远程分支)
git branch -a
# 查看远程分支
git branch -r
# 查看分支详细信息
git branch -v
# 查看分支的跟踪关系
git branch -vv实际操作示例
bash
# 创建演示项目
mkdir git-branch-demo
cd git-branch-demo
git init
# 创建初始提交
echo "# 分支管理演示" > README.md
git add README.md
git commit -m "初始提交"
# 查看当前分支
git branch输出:
* main星号 * 表示当前所在的分支。
创建分支
创建分支的方法
bash
# 创建新分支(但不切换)
git branch feature-login
# 创建并切换到新分支
git checkout -b feature-register
# 使用新语法创建并切换(Git 2.23+)
git switch -c feature-profile
# 从特定提交创建分支
git branch hotfix-bug commit_hash
# 从远程分支创建本地分支
git checkout -b local-branch origin/remote-branch分支命名规范
bash
# ✅ 好的分支命名
git branch feature/user-authentication
git branch bugfix/login-error
git branch hotfix/security-patch
git branch release/v1.2.0
git branch experiment/new-algorithm
# ❌ 避免的分支命名
git branch test
git branch temp
git branch branch1
git branch 修复bug # 避免中文和特殊字符创建分支示例
bash
# 创建功能分支
git branch feature/user-login
git branch feature/user-register
git branch feature/password-reset
# 查看所有分支
git branch输出:
feature/password-reset
feature/user-login
feature/user-register
* main切换分支
切换分支的方法
bash
# 切换到已存在的分支
git checkout feature/user-login
# 使用新语法切换(Git 2.23+)
git switch feature/user-login
# 切换到上一个分支
git checkout -
git switch -
# 强制切换(丢弃工作区修改)⚠️ 危险操作
git checkout -f branch-name切换分支的注意事项
bash
# 创建一些修改来演示
echo "新功能代码" > login.py
echo "配置文件" > config.json
# 查看状态
git status
# 尝试切换分支
git checkout feature/user-login如果有未提交的修改,Git 会阻止切换:
error: Your local changes to the following files would be overwritten by checkout:
login.py
Please commit your changes or stash them before you switch branches.解决方法:
bash
# 方法1:提交修改
git add .
git commit -m "WIP: 正在开发登录功能"
git checkout feature/user-login
# 方法2:暂存修改
git stash
git checkout feature/user-login
# 稍后恢复
git stash pop
# 方法3:强制切换(会丢失修改)
git checkout -f feature/user-login合并分支
快进合并 (Fast-forward)
当目标分支没有新的提交时,Git 会进行快进合并:
bash
# 切换到功能分支开发
git checkout feature/user-login
echo "登录功能实现" > login.py
git add login.py
git commit -m "实现用户登录功能"
# 切换回主分支
git checkout main
# 快进合并
git merge feature/user-login合并后的历史:
A---B---C---D (main, feature/user-login)三方合并 (Three-way merge)
当两个分支都有新提交时,Git 会创建合并提交:
bash
# 在主分支上做一些修改
git checkout main
echo "主分支的修改" >> README.md
git add README.md
git commit -m "更新 README"
# 在功能分支上做修改
git checkout feature/user-register
echo "注册功能实现" > register.py
git add register.py
git commit -m "实现用户注册功能"
# 切换回主分支并合并
git checkout main
git merge feature/user-register合并后的历史:
A---B---C---D---F (main)
\ /
E-------/ (feature/user-register)合并冲突处理
当两个分支修改了同一文件的同一部分时,会产生冲突:
bash
# 创建冲突场景
git checkout main
echo "主分支的配置" > config.txt
git add config.txt
git commit -m "添加主分支配置"
git checkout feature/user-login
echo "功能分支的配置" > config.txt
git add config.txt
git commit -m "添加功能分支配置"
# 尝试合并(会产生冲突)
git checkout main
git merge feature/user-login冲突文件内容:
<<<<<<< HEAD
主分支的配置
=======
功能分支的配置
>>>>>>> feature/user-login解决冲突:
bash
# 编辑文件解决冲突
echo "合并后的配置" > config.txt
# 标记冲突已解决
git add config.txt
# 完成合并
git commit -m "合并 feature/user-login 分支"删除分支
删除本地分支
bash
# 删除已合并的分支
git branch -d feature/user-login
# 强制删除分支(即使未合并)
git branch -D feature/experimental
# 删除多个分支
git branch -d feature/login feature/register删除远程分支
bash
# 删除远程分支
git push origin --delete feature/user-login
# 或使用简写
git push origin :feature/user-login
# 清理本地的远程分支引用
git remote prune origin批量删除分支
bash
# 删除所有已合并的分支
git branch --merged | grep -v "\*\|main\|master" | xargs -n 1 git branch -d
# 删除包含特定模式的分支
git branch | grep "feature/" | xargs git branch -d分支重命名
bash
# 重命名当前分支
git branch -m new-branch-name
# 重命名其他分支
git branch -m old-name new-name
# 重命名远程分支(删除旧的,推送新的)
git push origin :old-name new-name
git push origin -u new-name高级分支操作
分支比较
bash
# 比较两个分支
git diff main..feature/user-login
# 查看分支间的提交差异
git log main..feature/user-login
# 查看分支的独有提交
git log --oneline --graph main feature/user-login
# 查看文件在不同分支的差异
git diff main:file.txt feature:file.txt分支追踪
bash
# 设置本地分支追踪远程分支
git branch --set-upstream-to=origin/main main
# 推送并设置追踪
git push -u origin feature/new-feature
# 查看追踪关系
git branch -vv孤立分支
bash
# 创建没有历史的孤立分支
git checkout --orphan gh-pages
# 清空工作区
git rm -rf .
# 创建新内容
echo "<h1>GitHub Pages</h1>" > index.html
git add index.html
git commit -m "初始化 GitHub Pages"分支工作流模式
Git Flow 模式
bash
# 主要分支
main/master # 生产分支
develop # 开发分支
# 辅助分支
feature/* # 功能分支
release/* # 发布分支
hotfix/* # 热修复分支实际操作:
bash
# 创建开发分支
git checkout -b develop main
# 创建功能分支
git checkout -b feature/user-auth develop
# 开发完成后合并回 develop
git checkout develop
git merge --no-ff feature/user-auth
git branch -d feature/user-auth
# 准备发布
git checkout -b release/1.0.0 develop
# 发布完成后合并到 main 和 develop
git checkout main
git merge --no-ff release/1.0.0
git tag v1.0.0
git checkout develop
git merge --no-ff release/1.0.0
git branch -d release/1.0.0GitHub Flow 模式
bash
# 简化的工作流
# 1. 从 main 创建功能分支
git checkout -b feature/new-feature main
# 2. 开发并提交
git add .
git commit -m "实现新功能"
# 3. 推送分支
git push origin feature/new-feature
# 4. 创建 Pull Request
# 5. 代码审查和合并
# 6. 删除功能分支分支管理最佳实践
1. 分支命名规范
bash
# 使用有意义的前缀
feature/user-authentication
bugfix/login-validation
hotfix/security-vulnerability
release/v2.1.0
experiment/performance-optimization
# 使用短横线分隔单词
feature/user-profile-page # ✅
feature/user_profile_page # ❌
feature/userprofilepage # ❌2. 保持分支简洁
bash
# ✅ 好的做法:一个分支一个功能
git checkout -b feature/add-login-button
# 只实现登录按钮相关的代码
# ❌ 避免:一个分支多个不相关功能
git checkout -b feature/login-and-register-and-profile3. 及时清理分支
bash
# 定期清理已合并的分支
git branch --merged | grep -v "main" | xargs git branch -d
# 清理远程分支引用
git remote prune origin
# 查看陈旧的分支
git for-each-ref --format='%(refname:short) %(committerdate)' refs/heads | sort -k24. 使用合适的合并策略
bash
# 功能分支合并:保留分支历史
git merge --no-ff feature/user-login
# 小修改:快进合并
git merge feature/typo-fix
# 保持线性历史:变基合并
git rebase main
git checkout main
git merge feature/clean-feature分支故障排除
问题1:分支切换失败
bash
# 问题:有未提交的修改
# 解决方案1:暂存修改
git stash
git checkout target-branch
git stash pop
# 解决方案2:提交修改
git add .
git commit -m "临时提交"
git checkout target-branch问题2:误删分支
bash
# 查找被删除分支的最后提交
git reflog
# 恢复分支
git checkout -b recovered-branch commit_hash问题3:合并冲突
bash
# 查看冲突文件
git status
# 使用合并工具
git mergetool
# 手动解决后标记为已解决
git add conflicted_file.txt
git commit
# 取消合并
git merge --abort问题4:分支历史混乱
bash
# 使用 rebase 整理历史
git rebase -i HEAD~3
# 查看分支图
git log --graph --oneline --all
# 重置分支到特定提交
git reset --hard commit_hash实用工具和技巧
分支别名
bash
# 设置有用的别名
git config --global alias.co checkout
git config --global alias.br branch
git config --global alias.sw switch
git config --global alias.mg merge
# 复杂别名
git config --global alias.lg "log --graph --oneline --all"
git config --global alias.cleanup "!git branch --merged | grep -v '\\*\\|main\\|master' | xargs -n 1 git branch -d"分支脚本
bash
#!/bin/bash
# 创建功能分支的脚本
create_feature_branch() {
if [ -z "$1" ]; then
echo "用法: create_feature_branch <feature-name>"
return 1
fi
git checkout main
git pull origin main
git checkout -b "feature/$1"
echo "创建功能分支: feature/$1"
}
# 使用方法
create_feature_branch user-authentication总结
Git 分支管理的核心要点:
基本操作
bash
git branch # 查看分支
git checkout -b name # 创建并切换分支
git merge branch # 合并分支
git branch -d name # 删除分支最佳实践
- ✅ 使用有意义的分支名称
- ✅ 保持分支功能单一
- ✅ 及时合并和清理分支
- ✅ 选择合适的合并策略
- ✅ 处理好合并冲突
工作流选择
- 简单项目:GitHub Flow
- 复杂项目:Git Flow
- 持续集成:Feature Branch Workflow
掌握分支管理后,你就能够:
- 🔄 并行开发多个功能
- 🧪 安全地进行实验
- 👥 与团队高效协作
- 🚀 管理复杂的项目历史
在下一章中,我们将学习如何查看和理解 Git 历史。